0
点赞
收藏
分享

微信扫一扫

FreeRTOS_Task运行状态及Task占用率信息开启

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

相关推荐

0 条评论