FreeRTOS查看任务CPU占用率及剩余内存 HAL库STM32

前言:使用STM32CubeMX配置FreeRTOS工程,借助其封装函数查看系统运行时任务CPU占用率及剩余内存。


一、STM32CubeMX配置

  • 配置一个定时器供FreeRTOS对系统计时使用,频率要在FreeRTOS时间片轮转频率(一般为1000Hz)的10-20倍,我这里主频为170MHz,分频后为20000Hz。
  • 设置时钟频率

  • 开启定时器中断
    开启定时器中断

  • 将Run time and task stats gathering related defintions中的GENRATE_RUN_TIME_STATS、USE_TRACE_FACILITY和USE_STATS_FORMATTING_FUNCTIONS启用

  • 二、函数填充

  • 在main.c中定义全局变量并且在定时器中断回调函数中自增变量
  • volatile long long FreeRTOSRunTimeTicks;
    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 */
      if (htim->Instance == TIM7)
      {
        FreeRTOSRunTimeTicks++;
      }
      /* USER CODE END Callback 1 */
    }
    
  • 在app_freertos.c中完善configureTimerForRunTimeStats函数和getRunTimeCounterValue函数
  • extern volatile long long FreeRTOSRunTimeTicks;
    __weak void configureTimerForRunTimeStats(void)
    {
      FreeRTOSRunTimeTicks = 0;
    }
    
    __weak unsigned long getRunTimeCounterValue(void)
    {
      return FreeRTOSRunTimeTicks;
    }
    
  • 在默认任务中打印信息(要注意默认任务堆栈的大小和数组的大小,如果添加打印信息后系统跑飞,可能是任务堆栈大小设置过小;要是打印信息不全,可能是数组大小设置过小)
  • signed char pcWriteBuffer[400];
    void StartDefaultTask(void const *argument)
    {
      /* USER CODE BEGIN StartDefaultTask */
      /* Infinite loop */
      for (;;)
      {
        memset(pcWriteBuffer, 0, 400);
        vTaskList(pcWriteBuffer);	//获取内存信息
        // vTaskGetRunTimeStats(pcWriteBuffer);	//获取CPU占用率信息
        printf("\r\n");
        printf("%s\n\r", pcWriteBuffer);
        osDelay(1000);
      }
      /* USER CODE END StartDefaultTask */
    }
    

    三、效果展示

  • 查看任务CUP占用率
    任务CPU占用率
  • 查看任务剩余内存
  • 任务剩余内存

    作者:Handsome_row

    物联沃分享整理
    物联沃-IOTWORD物联网 » FreeRTOS查看任务CPU占用率及剩余内存 HAL库STM32

    发表回复