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        100static 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 1void 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);elsereturn -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);elsereturn -1;                    
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Retro-2 选择性抑制剂 1201652-50-7星戈瑞

Retro-2选择性抑制剂1201652-50-7是一种化学结构独特的化合物&#xff0c;具有高度选择性和高效性。其化学结构包含多个关键基团&#xff0c;这些基团在抑制Retro-2酶的同时&#xff0c;对其他酶的影响较小。 Retro-2选择性抑制剂1201652-50-7通过与Retro-2酶结合&#xff0c;…

yolov8实战第五天——yolov8+ffmpeg实时视频流检测并进行实时推流——(推流,保姆教学)

yolov8实战第一天——yolov8部署并训练自己的数据集&#xff08;保姆式教程&#xff09;_yolov8训练自己的数据集-CSDN博客 yolov8实战第三天——yolov8TensorRT部署&#xff08;python推理&#xff09;&#xff08;保姆教学&#xff09;-CSDN博客 今天&#xff0c;我们继续y…

前端面试题集合四(html)

HTML 面试知识点总结 本部分主要是笔者在复习 HTML 相关知识和一些相关面试题时所做的笔记&#xff0c;如果出现错误&#xff0c;希望大家指出&#xff01; 目录 1. DOCTYPE 的作用是什么&#xff1f;2. 标准模式与兼容模式各有什么区别&#xff1f;3. HTML5 为什么只需要写…

[DM8] 达梦8配置兼容Oracle

查看版本信息 select *&#xff0c;id_code from v$version; 查询解释&#xff1a; DM Database Server 64 V8 1-1-190-21.03.12-136419-ENT 64 版本位数标识&#xff0c;64表示为64位版本&#xff0c;无64则表示为32位版本 V8 大版本号&#xff0c;目前主要是V7、V8 1-1-190…

.NET 6中如何使用Redis

1、安装redis Redis在windows平台上不受官方支持&#xff0c;所以想要在window安装Redis就必须去下载windows提供的安装包。安装地址&#xff1a;https://github.com/tporadowski/redis/releases 2、在NueGet安装包 3、在appsettings.json文件里面添加Redis相关配置信息 &quo…

网页内容任君采撷-右键无法复制

CSDN一年一度的博客之星评选活动已经结束&#xff0c;刚好点击来看看学习一下大佬们的博客。 发现绝大部分的博主对于知识的公开度都是非常高的&#xff0c;当然除了收费的专栏外。 其中少部分博主对自己的博文设定了一定的操作&#xff0c;无法直接使用博文中的内容。 现在大…

nuxt 不解析HTML结构bug

记录一个本人Vue3迁移Nuxt3的报错 报错信息 [Vue warn]: Failed to resolve directive: top [nitro] [unhandledRejection] TypeError: Cannot read properties of undefined (reading ‘getSSRProps’) 原因是Vue3在迁移到nuxt3的时候有一个自定义指令没有搬过来&#xff0…

掌握Lazada API接口:开启电商开发新篇章,引领业务增长潮流

一、概述 Lazada API接口是Lazada平台提供的软件开发工具包&#xff0c;它允许第三方开发者通过编程方式访问Lazada平台上的商品、订单、用户等数据&#xff0c;并执行相关操作。通过使用Lazada API接口&#xff0c;开发者可以快速构建与Lazada平台集成的应用程序&#xff0c;…

10亿数据高效插入MySQL最佳方案

写在文章开头 你好&#xff0c;我叫sharkchili&#xff0c;目前还是在一线奋斗的Java开发&#xff0c;经历过很多有意思的项目&#xff0c;也写过很多有意思的文章&#xff0c;是CSDN Java领域的博客专家&#xff0c;也是Java Guide的维护者之一&#xff0c;非常欢迎你关注我的…

烟雾识别摄像机

烟雾识别摄像机是一种具有智能识别功能的监控设备&#xff0c;它能够通过图像识别技术检测和识别烟雾&#xff0c;提供实时监测和报警功能。这种摄像机通常应用于各种场所&#xff0c;如工厂、仓库、办公楼、酒店等&#xff0c;起到了重要的安全监测作用。 烟雾识别摄像机的工作…

使用Trie数据结构实现搜索自动完成功能

本文旨在讨论使用 Java 的搜索自动完成的低级实现&#xff0c;将Trie在用例中使用数据结构。 这是一个示例TrieNode类&#xff1a; class TrieNode{ Map<Character,TrieNode> children; boolean isEndOfWord; TrieNode(){ children new HashMap<>(); isEndOfWor…

Making Large Language Models Perform Better in Knowledge Graph Completion

Making Large Language Models Perform Better in Knowledge Graph Completion 基本信息 博客贡献人 鲁智深 作者 Yichi Zhang, Zhuo Chen, Wen Zhang, Huajun Chen 隶属于浙江大学计算机学院和软件学院 摘要 本文主要探讨了如何将有用的知识图谱结构信息融入大语言模型中…