为FreeRTOS添加CPU使用率统计功能
2017-03-31 23:16
323 查看
由于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);
}
}
//--------------------------------------------
原创文章,转载请注明出处。
如有疑问或建议,请在回复中说明,谢谢!
一、原理
此种方法计算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);
}
}
//--------------------------------------------
原创文章,转载请注明出处。
如有疑问或建议,请在回复中说明,谢谢!
相关文章推荐
- ecshop后台添加一个完整的统计用户信息的功能
- Giraph源码分析(七)—— 添加消息统计功能
- MVC中添加执行统计功能
- phpwind wap功能添加百度wap统计
- 为NexT主题添加文章阅读量统计功能
- Postgres8.3.3增强版(添加SQL执行信息统计功能)
- pvpgn战网添加dota战绩统计功能(Ghost++)。
- 为你的CSDN博客添加CNZZ流量统计功能
- 工作笔记 --->新疆统计分析添加市场管理员相关功能笔记
- WordPress非插件添加文章浏览次数统计功能
- 使用Spring AOP添加统计时间的功能
- hexo 博客小功能添加-评论、萌妹纸、相册、字数统计...
- 在App中添加数据统计功能(友盟)
- 用代码实现为WordPress文章添加浏览次数(views)统计功能
- web开发 使用 servletContext 添加登录次数统计功能
- hexo添加评论功能和统计功能
- WordPress非插件添加文章浏览次数统计功能
- WordPress非插件添加文章浏览次数统计功能
- 关于TextView获取文本添加拨号和网页链接功能
- 添加新的Excel工具栏,实现自己需要的功能。