RT-Thread: CPU 使用率应用

关键词:RT-Thread cpu使用率,cpuusage.c , cpuusage.h

说明:使用 RT-Thread 希望知道 mcu 计算能力的使用率或cpu使用率。

注意:在调试CUP使用率时,根据参考资料移植了 cpuusage.c , cpuusage.h ,也调用了 void cpu_usage_init() 初始化CPU使用率函数,但 cpu_usage_get() 返回的值始终为 0 ,调试时发现 rt_thread_idle_entry()系统没有进入空闲线程,经过查参考资料里面的提示,原因是 FINSH 控制台组件在空闲时始终在等待接收字符,导致 空闲线程得不到运行。

解决办法:在 rt_hw_console_getchar()函数中加个延时。

1. CPU 利用率的基本概念:

        CPU 利用率(使用率)是系统运行的程序占用的 CPU 资源,表示机器在某段时间程序运行的情况。

2. CPU 利用率的作用:

        CPU 利用率一定要合理。CPU 利用率不能一直接近 100%,如果这时有一个紧急的任务要临时插入,就可能因为 CPU 被占满导致这个紧急任务无法被响应;CPU利用率也不能太低,比如一直保持在 1% 以下,这样我们会认为这种产品的资源过于浪费。

3. CPU 利用率统计:

        RT-Thread 提供了一个统计 CPU 利用率的代码文件,其工作原理为:在空闲线程中计算出一段时间内处于空闲线程的时间,从而得出 CPU 的占用率。

4. 将代码导入工程:

        将以下源码添加到工程中。

cpuusage.c

#include <rtthread.h>
#include <rthw.h>

#define CPU_USAGE_CALC_TICK    10
#define CPU_USAGE_LOOP        100

static rt_uint8_t  cpu_usage_major = 0, cpu_usage_minor= 0;
static rt_uint32_t total_count = 0;

static void cpu_usage_idle_hook()
{
    rt_tick_t tick;
    rt_uint32_t count;
    volatile rt_uint32_t loop;

    if (total_count == 0)
    {
        /* get total count */
        rt_enter_critical();
        tick = rt_tick_get();
        while(rt_tick_get() - tick < CPU_USAGE_CALC_TICK)
        {
            total_count ++;
            loop = 0;
            while (loop < CPU_USAGE_LOOP) loop ++;
        }
        rt_exit_critical();
    }

    count = 0;
    /* get CPU usage */
    tick = rt_tick_get();
    while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK)
    {
        count ++;
        loop  = 0;
        while (loop < CPU_USAGE_LOOP) loop ++;
    }

    /* calculate major and minor */
    if (count < total_count)
    {
        count = total_count - count;
        cpu_usage_major = (count * 100) / total_count;
        cpu_usage_minor = ((count * 100) % total_count) * 100 / total_count;
    }
    else
    {
        total_count = count;

        /* no CPU usage */
        cpu_usage_major = 0;
        cpu_usage_minor = 0;
    }
}

void cpu_usage_get(rt_uint8_t *major, rt_uint8_t *minor)
{
    RT_ASSERT(major != RT_NULL);
    RT_ASSERT(minor != RT_NULL);

    *major = cpu_usage_major;
    *minor = cpu_usage_minor;
}

void cpu_usage_init()
{
    /* set idle thread hook */
    rt_thread_idle_sethook(cpu_usage_idle_hook);
}

cpuusage.h

#ifndef __CPUUSAGE_H__
#define __CPUUSAGE_H__

#define CPU_UPDATE 1

void cpu_usage_get(rt_uint8_t *major, rt_uint8_t *minor);
void cpu_usage_init(void);

#endif /*__ADC_H__ */

        直接编译,可能有报错,在 rtconfig.h 中开启如下选项

#define RT_USING_HOOK 
#define RT_USING_IDLE_HOOK

5. CPU 利用率统计实验

        实验通过一个线程里的延时(通过 for 循环实现)代码来模拟占用 CPU 资源,另外再创建一个线程来读取 CPU 利用率并打印。

#include "board.h"
#include "rtthread.h"
#include "cpuusage.h"

// 定义线程控制块指针
static rt_thread_t led_thread = RT_NULL;
static rt_thread_t cpu_usage_thread = RT_NULL;


/******************************************************************************
* @ 函数名  : led_thread_entry
* @ 功  能  : 线程入口函数
* @ 参  数  : parameter 外部传入的参数
* @ 返回值  : 无
******************************************************************************/
static void led_thread_entry(void *parameter)
{
    rt_uint16_t i;
    
    while(1)
    {
        LED0_TOGGLE;  // LED0 电平切换
        
        for(i = 0; i < 20000; i++); // 模拟占用 CPU 资源
        rt_thread_delay(10);  // 10个tick(10ms)
    }
}


/******************************************************************************
* @ 函数名  : cpu_usage_thread_entry
* @ 功  能  : 线程入口函数
* @ 参  数  : parameter 外部传入的参数
* @ 返回值  : 无
******************************************************************************/
static void cpu_usage_thread_entry(void *parameter)
{
    rt_uint8_t major, minor;
    
    while(1)
    {
        // 获取 CPU 利用率
        cpu_usage_get(&major, &minor);
        
        rt_kprintf("CPU 利用率:%d.%d %\r\n", major, minor);
        rt_thread_delay(500);  // 500个tick(500ms)
    }
}

int main(void)
{
    // 硬件初始化和RTT的初始化已经在component.c中的rtthread_startup()完成
    
    // CPU 使用率统计初始化
    cpu_usage_init();

    // 创建一个动态线程
    led_thread =                                  // 线程控制块指针
    rt_thread_create("led_thread",                // 线程名字
                    led_thread_entry,             // 线程入口函数
                    RT_NULL,                      // 入口函数参数
                    255,                          // 线程栈大小
                    4,                            // 线程优先级
                    20);                          // 线程时间片
    
    // 开启线程调度
    if(led_thread != RT_NULL)
        rt_thread_startup(led_thread);
    else
        return -1;
    
    // 创建一个动态线程
    cpu_usage_thread =                             // 线程控制块指针
    rt_thread_create("cpu_usage_thread",           // 线程名字
                    cpu_usage_thread_entry,        // 线程入口函数
                    RT_NULL,                       // 入口函数参数
                    255,                           // 线程栈大小
                    5,                             // 线程优先级
                    20);                           // 线程时间片
    
    // 开启线程调度
    if(cpu_usage_thread != RT_NULL)
        rt_thread_startup(cpu_usage_thread);
    else
        return -1;                    
}

实验现象
        注意:在开始的时候调用获取 CPU 利用率函数 cpu_usage_get() 是会进行一个计算参考值的,所以刚开始的时候 CPU 利用率为 0,后面的就是统计后的真正数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/302532.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C/C++】轻量级跨平台 开源串口库 CSerialPort

文章目录 1、简介2、支持的平台3、已经支持的功能4、Linux下使用5、使用vcpkg安装CSerialPort6、交叉编译7、效果图8、基于CSerialPort的应用8.1、CommMaster通信大师8.2、CommLite串口调试器 1、简介 Qt 的QSerialPort 已经是跨平台的解决方案&#xff0c;但Qt开发后端需要 Q…

面试算法100:三角形中最小路径之和

题目 在一个由数字组成的三角形中&#xff0c;第1行有1个数字&#xff0c;第2行有2个数字&#xff0c;以此类推&#xff0c;第n行有n个数字。例如&#xff0c;下图是一个包含4行数字的三角形。如果每步只能前往下一行中相邻的数字&#xff0c;请计算从三角形顶部到底部的路径经…

高级RAG(五):TruLens 评估-扩大和加速LLM应用程序评估

之前我们介绍了&#xff0c;RAGAs评估&#xff0c;今天我们再来介绍另外一款RAG的评估工具:TruLens , trulens是TruEra公司的一款开源软件工具&#xff0c;它可帮助您使用反馈功函数客观地评估基于 LLM 的应用程序的质量和有效性。反馈函数有助于以编程方式评估输入、输出和中间…

java 创建一个可执行的jar包小程序

第1步&#xff1a;写好代码 public class Main {public static void main(String[] args) {String str "hahah";if (StringUtils.isBlank(str)) {System.out.println(str);}System.out.println("Hello world!");} }第2步&#xff1a;设置 Artifact 选择入…

多模态推荐系统综述:二、特征交互 Fusion

二、Fusion 融合不同的多模态信息&#xff0c;与bridge相比&#xff0c;融合更关注项目之间的多模态内部关系。 它可以灵活地融合不同权重和焦点的多模态信息。 注意机制是应用最为广泛的特征融合。 2.1 粗粒度注意力。 一些模型应用注意力机制在粗粒度级别融合来自多种模式…

游客管理+导航系统(地图显示并实时更新线路)——MySQL数据库+javase+GUI+迪杰斯特拉算法

记录大二上学期——数据结构项目实训&#xff0c;要求实现求得两点的最短路径&#xff08;无向赋权图&#xff09; 本人—hl—一人完成代码的实现&#xff0c;废话不多说直接看功能 所需技术&#xff1a;javase数据库迪杰斯特拉GUI 统一工具&#xff1a;idea编辑器&#xff0c…

编程语言的语法糖,你了解多少?

什么是语法糖 语法糖是一种编程语言的特性&#xff0c;通常是一些简单的语法结构或函数调用&#xff0c;它可以通过隐藏底层的复杂性&#xff0c;并提供更高级别的抽象&#xff0c;从而使代码更加简洁、易读和易于理解&#xff0c;但它并不会改变代码的执行方式。 为什么需要语…

Day1Qt

1、实现登录窗口界面 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QIcon>//图标 #include <QLabel>//标签类 #include <QMovie>//动态类 #include <QLineEdit>//行编辑类 #include <QPushButton>…

有趣的前端知识(二)

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读HTML元素元素属性头部元素列表元素区块元素表单元素 颜色字符实体 HTML元素 …

过流继电器 GL-11/5 整定电流3.5A,动作时限0.5S josef约瑟

系列型号&#xff1a; GL-11过流继电器; GL-12过流继电器; GL-13过流继电器; GL-14过流继电器; GL-15过流继电器; GL-16过流继电器; GL-17过流继电器; GL-11/10过流继电器; GL-15/10过流继电器; GL-17/10过流继电器; GL-11/5过流继电器; GL-15/5过流继电器; GL-17/5过流继电器;…

Open3D 基于统计滤波去除噪点(5)

Open3D 基于统计滤波去除噪点&#xff08;5&#xff09; 一、什么是统计滤波二、具体实现1.代码 一、什么是统计滤波 统计滤波是一种常用的点云滤波方法&#xff0c;用于去除噪声和异常点。在统计滤波中&#xff0c;通过计算每个点邻域内的统计特征&#xff08;如平均值和标准…

C#之反编译之路(二)

先阅读C#之反编译之路(一)可以增加文章连续性 阅读C#之反编译之路(一) 如何快速定位代码位置 用一个小小的例子举例,用户反馈新能源车牌号无法录入,燃油车牌正常,查看日志报如下错误 拿到关键字车牌号长度错误直接反编译代码 打开dnSpy.exe→加载项目→CtrlF打开搜索框→输入…

ThreadLocal内存泄漏与解决

目录 什么是Threadlocal&#xff1f; Threadlocal的基本使用 ThreadLocal的内存泄漏举例 场景1 场景2 场景3 场景4 内存泄漏原因分析 总结 什么是Threadlocal&#xff1f; ThreadLocal 是 Java 中的一个类&#xff0c;它提供了线程本地变量的支持。线程本地变量是指被…

互联网加竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

RBAC基于角色的访问控制

一 什么是RBAC 概念 RBAC 是基于角色的访问控制&#xff08;Role-Based Access Control &#xff09;在 RBAC 中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的&#…

Django 4.2.7 ORM 连接MySQLServer 完成单表CRUD

文章目录 Django ORM介绍1.使用pycharm新建一个Django项目2.修改settings.py文件中 DATABASES3.创建APP4.创建模型5.操作数据库 Django ORM介绍 Django 模型使用自带的 ORM。 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称 ORM &#xff09;用于实现面向…

Java程序员面试-场景篇

前言 裁员增效潮滚滚而来&#xff0c;特总结一些实际场景方案的面试题&#xff0c;希望对大家找工作有一些帮助。 注册中心 题目&#xff1a; 有三台机器&#xff0c;分别部署了微服务A、微服务B、注册中心&#xff0c;其中A和B都有服务接口提供并正常注册到了注册中心&…

SpringMVC概述

MVC介绍 MVC是一种设计模式&#xff0c;将软件按照模型、视图、控制器来划分&#xff1a; M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff1a;专门存储业务数据的&…

Docker Compose--部署SpringBoot项目--实战

原文网址&#xff1a;Docker Compose--部署SpringBoot项目--实战-CSDN博客 简介 本文用实战介绍Docker Compose部署SpringBoot项目。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题&#xff0c…

Java方法用法及解析

在 Java 中&#xff0c;方法&#xff08;Method&#xff09;是用于执行特定任务的代码块。它是一个函数&#xff0c;用于封装一段可重复执行的代码&#xff0c;并可以被其他代码调用。方法定义了一系列操作的步骤&#xff0c;并提供了一种结构化和可复用的方式来组织和执行这些…