任务运行时间统计:
函数使用的注意事项:
这在FreeRTOS源码中如下所示:
接下来,要配置系统时基定时器,如下所示:
FreeRTOS配置宏定义:
系统时基初始化函数(配置成周期100us = 0.1ms)和中断服务函数:
void system_time_base_config(void)
{
MX_TIM3_Init();
HAL_TIM_Base_Start_IT(&htim3);
time_counter = 0;
}
void TIM3_IRQHandler(void)
{
if (__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_UPDATE) == 1)
{
time_counter++;
}
__HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);
}
任务函数如下所示:
void start_task(void *pvParameters)
{
// 创建led任务
xTaskCreate((TaskFunction_t)led_task,
(char *)"led_task",
(uint16_t)LED_TASK_SIZE,
(void *)NULL,
(UBaseType_t)LED_TASK_PRIO,
(TaskHandle_t *)&led_task_Handle);
// 创建打印任务
xTaskCreate((TaskFunction_t)print_task,
(char *)"print_task",
(uint16_t)PRINT_TASK_SIZE,
(void *)NULL,
(UBaseType_t)PRINT_TASK_PRIO,
(TaskHandle_t *)&print_task_Handle);
// 创建运行时间查询任务
xTaskCreate((TaskFunction_t)run_time_task,
(char *)"run_time_task",
(uint16_t)RUNTIME_TASK_SIZE,
(void *)NULL,
(UBaseType_t)RUNTIME_TASK_PRIO,
(TaskHandle_t *)&runtime_task_Handle);
// 删除开始任务
vTaskDelete(Start_Task_Handle);
}
void led_task(void *pvParameters)
{
for (;;)
{
LED_G_TOGGLE;
vTaskDelay(500);
}
}
void print_task(void *pvParameters)
{
for (;;)
{
printf("print_task run\n");
vTaskDelay(500);
}
}
void run_time_task(void *pvParameters)
{
char *plist;
for (;;)
{
/* 按键1被按下 */
if (key_scan(KEY1_GPIO_Port, KEY1_Pin) == KEY_ON)
{
plist = pvPortMalloc(1024 * 2 * sizeof(char)); // 申请打印表格的内存
if (plist != NULL)
{
vTaskGetRunTimeStats(plist);
printf("\n**********任务运行时间打印**********\n");
printf("%s\n", plist);
}
vPortFree(plist);
}
vTaskDelay(50);
}
}
void system_time_base_config(void)
{
MX_TIM3_Init();
HAL_TIM_Base_Start_IT(&htim3);
time_counter = 0;
}
程序运行结果如下:
这里的运行时间,就是我们配置的系统时基周期(100us)
可以看到,系统运行时间统计任务非常耗时(21941个周期),所以仅用于调试阶段。