您的位置:首页 > 其它

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

    }

}
//--------------------------------------------

原创文章,转载请注明出处。
如有疑问或建议,请在回复中说明,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息