为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);
    }
}
//--------------------------------------------




原创文章,转载请注明出处。
如有疑问或建议,请在回复中说明,谢谢!




0 0