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