RTOS-任务CPU占用统计

在项目开发过程中,有时会需要查看各个任务的资源占用,需要用到rtos的CPU使用统计,其原理也很简单,就是开一个频率特别高的定时器,rtos在运行过程累计各个任务的实际占用时长,继而统计显示

FreeRTOSConfig配置

//计算CPU使用率
#define configGENERATE_RUN_TIME_STATS  1 //启用运行时间统计功能 
#define configUSE_TRACE_FACILITY  1     //启用可视化跟踪调试 
/* 与宏 configUSE_TRACE_FACILITY 同时为 1 时会编译下面 3 个函数
* prvWriteNameToBuffer()
* vTaskList(),
* vTaskGetRunTimeStats()
*/
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
extern volatile uint32_t CPU_RunTime; 
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (CPU_RunTime = 0ul) 
#define portGET_RUN_TIME_COUNTER_VALUE() CPU_RunTime

启用一个硬件定时器

启用一个20K Hz频率的硬件定时器,在这个定时器中,会有一个标志位持续性的自增,rtos内核中会用这个标志位记录各个任务的运行市场,中断函数如下,我启用的是TIM2

volatile uint32_t CPU_RunTime = 0UL;
void TMR2_GLOBAL_IRQHandler(void)
{
    if (tmr_flag_get(TMR2, TMR_OVF_FLAG) != RESET)
    {
        CPU_RunTime++;
        tmr_flag_clear(TMR2, TMR_OVF_FLAG);
    }
}

打印任务状态与显示CPU使用率

    static uint8_t CPU_RunInfo[400];
    memset(CPU_RunInfo, 0, 400);
    vTaskList((char *)&CPU_RunInfo); // 获取任务运行时间信息

    printf("---------------------------------------------\r\n");
    printf("name        state     pro       water     num\r\n");
    printf("%s", CPU_RunInfo);
    printf("---------------------------------------------\r\n");

    memset(CPU_RunInfo, 0, 400); // 信息缓冲区清零

    vTaskGetRunTimeStats((char *)&CPU_RunInfo);

    printf("name           count                      use\r\n");
    printf("%s", CPU_RunInfo);
    printf("-------------------------------------------\r\n\n");

显示示例

---------------------------------------------
name        state     pro       water     num
SHxxx_TASK         X    2    878    1
Auxxx Task         R    2    5075    5
xxx Pm             R    1    388    4
IDLE               R    0    101    12
xxx_task          B    3    687    6
xxx_task_loo    B    4    216    3
xxx_TASK          B    3    971    11
xxx_task            B    3    380    2
xxx_tx_tas    B    3    913    9
Tmr Svc            B    5    487    13
xxx_rx_tas    B    4    917    8
phy_xxx    B    5    473    7
xxx_audio_task    B    5    773    10
---------------------------------------------
name           count                      use
SHxxx_TASK         101083        <1%
xxx Pm             178173        <1%
IDLE               50990201        64%
xx_task            24812095        31%
xxx Task         124400        <1%
xxx_tx_tas    258962        <1%
xxx_task_loo    60382        <1%
xxx_TASK          48645        <1%
xxx_task          761773        <1%
xxx_rx_tas    38417        <1%
phy_xxx    20046        <1%
xxx_task    1189061        1%
Tmr Svc            2        <1%
-------------------------------------------
freertos启用这些选项后,rtos内核执行的任务会变多,CPU的负担会增加,因此在产品发行前需要关闭这些选项
文章目录