为FreeRTOS添加CPU使用率统计功能
来源:互联网 发布:淘宝退款金额少了 编辑:程序博客网 时间:2024/05/16 08:41
由于FreeRTOS没有像其他实时操作系统一样提供CPU使用率统计的功能,无法直观地评估CPU的使用情况,所以在此提供一种计算CPU使用率的方法。
一、原理
此种方法计算CPU使用率的原理为:
1、在系统启动后,所有用户任务都未开始运行时,统计一段时间T(如1s)内空闲任务被调用的次数M,此时可认为这个次数是CPU占用率最小(接近0)时能够调用空闲任务的最大次数。
2、任务开始运行后,在滴答时钟中断处理函数中,每隔T时间,记录空闲任务被调用的次数m。
3、CPU占用率为:(1-m/M)*100%
二、实现
为了减少此功能对CPU资源的占用,所以不使用空闲钩子函数,而是直接在文件中加入相关代码,并尽量精简。
1.task.c
在文件开头定义变量:
//--------------------------------------------
#if(usercfgCPU_USAGE_CALCULATE==1)
static unsigned long max_idle_cnt=0;
static unsigned short idle_cntl=0;
static unsigned long idle_cnth=0;
static unsigned short tick_cnt=0;
unsigned short OSCPUusage=0;
#endif
//--------------------------------------------
在xTaskIncrementTick()函数最后面加上CPU使用率计算语句,为了减小开销,没有做限幅等数据有效性判断:
//--------------------------------------------
#if(usercfgCPU_USAGE_CALCULATE==1)
tick_cnt++;
if(tick_cnt>=usercfgCPU_USAGE_CALC_PERIOD)
{
OSCPUusage=10000-idle_cnth*10000/max_idle_cnt;//0-10000->0.00-100.00%
idle_cntl=0;
idle_cnth=0;
tick_cnt=0;
}
#endif
//--------------------------------------------
在portTASK_FUNCTION()函数(即Idletask)最后面加上空闲任务统计语句:
//--------------------------------------------
#if(usercfgCPU_USAGE_CALCULATE==1)
idle_cntl++;
if(idle_cntl>=100)//idle_cntl是为了防止idle_cnth溢出而设置的分频计数器
{
idle_cntl=0;
idle_cnth++;
}
#endif
//--------------------------------------------
在文件最后面加上空闲任务最大调用次数统计函数:
//--------------------------------------------
void uTaskCPUUsageInit(void)
{
vTaskDelay(2);//synchronizewithclocktick
taskENTER_CRITICAL();
max_idle_cnt=0;
idle_cntl=0;
idle_cnth=0;
tick_cnt=0;
taskEXIT_CRITICAL();
//为了防止idle_cnth==usercfgCPU_USAGE_CALC_PERIOD时被清零,所以只统计前80%的时间
vTaskDelay(usercfgCPU_USAGE_CALC_PERIOD*4/5);//calcmax_idle_cnt
taskENTER_CRITICAL();
max_idle_cnt=idle_cnth*5/4;
taskEXIT_CRITICAL();
}
#endif
//--------------------------------------------
2.task.h
在文件最后声明变量和函数:
//--------------------------------------------
#if(usercfgCPU_USAGE_CALCULATE==1)
extern unsigned short OSCPUusage;
void uTaskCPUUsageInit(void);
#endif
//--------------------------------------------
3.FreeRTOSConfig.h
在文件最后声明是否使用CPU使用率统计功能及CPU使用率统计周期:
//--------------------------------------------
#define usercfgCPU_USAGE_CALCULATE 1
#ifdef usercfgCPU_USAGE_CALCULATE
#define usercfgCPU_USAGE_CALC_PERIOD 500//ms
#endif
//--------------------------------------------
4.main.c
在Task_Start()函数中调用uTaskCPUUsageInit(),注意必须在Task_Create()创建其他用户任务之前调用。需要注意的是,使用uTaskCPUUsageInit()时会导致系统延时启动。初始化完成之后,即可通过OSCPUusage观察CPU使用率。
//--------------------------------------------
void Task_Start(void*p_arg)
{
#if(usercfgCPU_USAGE_CALCULATE==1)
uTaskCPUUsageInit();
#endif
(void)&p_arg;
Task_Create();//创建用户任务
for(;;)
{
vTaskDelay(TASK_START_RATE);
}
}
//--------------------------------------------
原创文章,转载请注明出处。
如有疑问或建议,请在回复中说明,谢谢!
- 为FreeRTOS添加CPU使用率统计功能
- CPU使用率统计
- STM32CubeMX中FreeRTOS系统CPU使用率监测测试
- 控制CPU使用率为正弦曲线
- 让CPU使用率为正弦曲线
- CPU 内存 硬盘 使用率统计shell
- [经验] 一种基于FreeRTOS的CPU使用率测算方法及原理介绍
- 一种基于FreeRTOS的CPU使用率测算方法及原理介绍
- cpu使用率
- CPU使用率
- CPU使用率
- CPU使用率
- CPU使用率
- CPU使用率
- 为你的CSDN博客添加CNZZ流量统计功能
- 为NexT主题添加文章阅读量统计功能
- 在Windows下统计进程的CPU使用率
- 统计 CPU 内存 硬盘 使用率的shell脚本
- springboot获取URL请求参数的几种方法
- javaWeb用户权限控制简单实现过程
- lintcode 链表专题总结
- final,finally和finalize的区别
- 泛型
- 为FreeRTOS添加CPU使用率统计功能
- Exchanger类中的exchange方法解决线程间通信问题
- 剑指Offer15:链表中倒数第k个节点
- Linux面试常用命令
- FFMPEG 的常用功能
- 【亲测可行】Win7 下 qt5.x + opencv2.4.x编译环境的搭建
- 概率图秒杀hmm和贝叶斯网络
- linux 多硬盘盘符漂移
- Qml运行机制的理解(原创)