使用STMCubeMX配置工具,配置FREERTOS检测任务对CPU的占用率,并且通过串口打印
STMCubeMX版本为5.1.0
软件包版本为:STM32Cube FW_F1 V1.7.0
一、打开相关配置
二、配置一个50us的定时器
三,生成代码,更改代码
生成的freertos.c部分相关代码如下
/* USER CODE BEGIN 1 */
/* Functions needed when configGENERATE_RUN_TIME_STATS is on */
_weak void configureTimerForRunTimeStats(void)
{
}
_weak unsigned long getRunTimeCounterValue(void)
{
return 0;
}
增加部分代码如下
/* USER CODE BEGIN 1 */
uint32_t RUN_Time=0;
/* Functions needed when configGENERATE_RUN_TIME_STATS is on */
void configureTimerForRunTimeStats(void)
{
RUN_Time=0;
MX_TIM4_Init();
HAL_TIM_Base_Start_IT(&htim4);
}
unsigned long getRunTimeCounterValue(void)
{
return RUN_Time;
}
在tim.c中增加代码
extern uint32_t RUN_Time;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM4)
{
RUN_Time++;
}
}
新建任务函数如下
void CPU_Task(void const * argument)
{
/* USER CODE BEGIN CPU_Task */
/* Infinite loop */
uint8_t CPU_RunInfo[400];
for(;;)
{
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");
osDelay(1000);
}
/* USER CODE END CPU_Task */
}
实验结果如下