Freertos-CPU使用率统计
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的负担会增加,因此在产品发行前需要关闭这些选项
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。