FreeRtos CPU使用率
FreeRTOS 是多任务操作系统,对 CPU 都是分时使用的:比如A 任务占用10ms,然
后B 任务占用30ms,然后空闲60ms,再又是A任务占10ms,B 任务占30ms,空闲60ms;
如果在一段时间内都是如此,那么这段时间内的利用率为40%,因为整个系统中只有40%
的时间是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
volatile uint32_t CPU_RunTime = 0UL;
void BASIC_TIM_IRQHandler (void)
{
if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET )
{
CPU_RunTime++; //(20倍与系统是时钟)
TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);
}
}
static void CPU_Task(void* parameter)
{
uint8_t CPU_RunInfo[400]; //保存任务运行时间信息
while (1)
{
memset(CPU_RunInfo,0,400); //信息缓冲区清零
vTaskList((char *)&CPU_RunInfo); //获取任务运行时间信息
printf("---------------------------------------------\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
printf("%s", CPU_RunInfo);
printf("---------------------------------------------\r\n");
memset(CPU_RunInfo,0,400); //信息缓冲区清零
vTaskGetRunTimeStats((char *)&CPU_RunInfo);
printf("任务名 运行计数 使用率\r\n");
printf("%s", CPU_RunInfo);
printf("---------------------------------------------\r\n\n");
vTaskDelay(1000); /* 延时500个tick */
}
}
在这里插入图片描述
是否可以只统计空闲任务运行的时间,
空闲任务的运行时间除以总的时间。
总的时间(可以为1s或一个固定的时间)。
上下文切换的时候统计时间。