FreeRTOS_任务运行状态及cpu占用率开启

1 新增宏定义

FreeRTOSConfig.h中,增加以下宏定义:

任务运行状态CPU占用率都需要定义configUSE_STATS_FORMATTING_FUNCTIONS,主要用于将信息想处格式化便于理解的内容。

1.1 任务运行状态 则需要定义以下宏:

#define configUSE_TRACE_FACILITY    1

1.2 任务运行时间 则需要定义以下宏:

  • 如果只是单纯获取空闲任务CPU占用率:
#define configGENERATE_RUN_TIME_STATS            1
#define INCLUDE_xTaskGetIdleTaskHandle           1
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue
  • 如果需要获取所有任务CPU占用率:

请确保configSUPPORT_DYNAMIC_ALLOCATION值为1,即FreeRTOS支持动态内存分配

#define configGENERATE_RUN_TIME_STATS            1
#define configUSE_STATS_FORMATTING_FUNCTIONS     1
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue

2 实现相关函数

此处以STM32为例,STM32移植FreeRTOS,一般有两个滴答计数器,

  • systick
  • FreeRTOS ticks

此处使用systick作为任务运行时间的计数器,当然可以自己选一个定时器实现。

  • configureTimerForRunTimeStats: 初始化运行时定时器;
  • getRunTimeCounterValue:获取运行时间计数值。
__weak void configureTimerForRunTimeStats(void)
{
    // 初始化定时器
}

__weak unsigned long getRunTimeCounterValue(void)
{
    // 获取当前定时器计数值
    return HAL_GetTick();
}

3 相关API

  • uint32_t ulTaskGetIdleRunTimeCounter( void ):获取空闲任务运行时间计数值,计算系统CPU占用率如下:
uint32_t precentage = (ulTaskGetIdleRunTimeCounter() * 100 / getRunTimeCounterValue());
  • void vTaskGetRunTimeStats( char *pcWriteBuffer ): 该函数传递一个内存缓存,或生成一个任务运行时间状态表。例子如下:
uint8_t cpu_run_info[4096];
memset(cpu_run_info, 0, sizeof(cpu_run_info));

vTaskGetRunTimeStats((char *)&cpu_run_info);
printf("---------------------------------------------\r\n");
printf("任务名       任务计数         使用率\r\n");
printf("%s\r\n", cpu_run_info);
printf("---------------------------------------------\r\n");
printf("当前动态内存大小 = %d字节\r\n", xPortGetFreeHeapSize());
  • void vTaskList( char * pcWriteBuffer ):获取任务运行状态信息(任务名、运行状态、优先级、堆栈使用情况以及启动顺序),例子如下:
uint8_t cpu_run_info[4096];
memset(cpu_run_info, 0, sizeof(cpu_run_info));

vTaskList((char *)&cpu_run_info);

printf("---------------------------------------------\r\n");
printf("任务名      任务状态 优先级   剩余栈 任务序号\r\n");
printf("%s\r\n", cpu_run_info);
printf("---------------------------------------------\r\n");

上述几个函数在实际项目开发中,对于调试十分有用,上面主要任务信息相关。对于系统内存使用率也是个十分重要的调试信息:

  • size_t xPortGetFreeHeapSize( void ):该函数用于获取FreeRTOS系统剩余内存,使用例子如下:
printf("当前动态内存大小 = %d字节", xPortGetFreeHeapSize());