1. 开启一个50us定时器(假设FreeRTOS 1ms中断一次)
打开中断
中断优先级为1,比较高
2. 实际代码
//FreeRTOSConfig.h
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configGENERATE_RUN_TIME_STATS 1
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ConfigureTimeForRunTimeStats()
#define portGET_RUN_TIME_COUNTER_VALUE() FreeRTOSRunTimeTicks
//task.c
#define QUERY_TASK_PRIO 15
#define QUERY_STK_SIZE 256
TaskHandle_t Query_Handler;
void query_task(void *pvParameters);
char Buffer[1000]; //保存信息的数组
void ConfigureTimeForRunTimeStats(void)
{
HAL_TIM_Base_Start_IT(&htim7);
}
//query任务函数
void query_task(void *pvParameters)
{
vTaskList(Buffer); //获取所有任务的信息
printf(Buffer);
while(1)
{
vTaskDelay(1000);
vTaskGetRunTimeStats(Buffer);
printf("任务名\t\t\t\t运行时间\t运行百分比\r\n");
printf("%s\r\n\r\n",Buffer);
}
}
//50us一次FreeRTOSRunTimeTicks +1
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
if (htim->Instance == TIM1) {
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
else if(htim->Instance == TIM7)
{
FreeRTOSRunTimeTicks ++;
}
/* USER CODE END Callback 1 */
}
- 串口输出结果
//获取所有任务的信息
Query_task X 15 292 13
task1 R 3 139 12
Tmr Svc R 2 234 5
IDLE R 0 137 3
defaultTask B 24 95 1
start_task D 1 206 2
/************任务运行时间、百分比********************/
任务名 运行时间 运行百分比
Query_task 482 2%
IDLE 19980 95%
Tmr Svc 2 <1%
defaultTask 1 <1%
task1 0 <1%