FreeRTOS专栏8:任务运行时间统计

任务运行时间统计:

函数使用的注意事项:

这在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个周期),所以仅用于调试阶段。

发布了184 篇原创文章 · 获赞 100 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/dingyc_ee/article/details/104087521
今日推荐