FreeRTOS-cpu利用率统计

1,121 阅读2分钟

[toc]


前言

本笔记基于 stm32+FreeRTOS。 主要参考野火安富莱


概念

简单概要:

  • 各任务cpu利用率: 打印出各任务在某段时间内站用cpu时长的比例。

  • 原理很简单:

    1. 开启一个高精度的定时器
    2. 让一个全局变量(如:ulCpuTraceTick)不断往上累加
    3. 每次切换任务时,记录上一个任务占用了多少个高精度定时器的tick
    4. 累加到该表示该任务的变量中(如:ulCpuTraceTaskATick
    5. ulCpuTraceTaskATick/ulCpuTraceTick 即可计算出该任务的CPU占用率。

作用

 阔以清晰地看出各个任务的cpu利用率,验证一个系统好坏的方法之一。  如,一个系统总任务cpu利用率经常 大于80%,会造成一些紧急事件无法及时得到响应,同时,峰值可能超出100%,导致任务滞后。  又如,一个系统总任务cpu利用率经常 小于 10%,导致资源浪费。  再如,阔以监测各个任务 cup 占用率,发现某些任务经常 大于70%,便去优化优化该任务。 注:以上数值标准均为个人习惯,并非标准答案!

必看点

  • 影响  该功能在调试时启用,在产品发布时务必关闭。  因为监测cpu利用率也是消耗cpu资源的。

  • 时钟精度  一般为系统时钟节拍的 10-20 倍。  如,当前系统节拍为 1000 Hz,那么定时器节拍则为 10000-20000 Hz。按20000 Hz 计算,即 50us 计算一次。由于FreeRTOS没有对其进行溢出保护,所以最大支持计数时间为:2^32 * 50us / 3600s = 59.6 分钟。超出后结果将不准确。

实现

添加几个宏定义

源码

FreeRTOS
/*
 * 当前文件为 FreeRTOSConfig.h
*/

#define configUSE_TRACE_FACILITY	1      /* cpu task */

/* Run time and task stats gathering related definitions. */
#define configGENERATE_RUN_TIME_STATS                1      /* cpu task */
#define configUSE_STATS_FORMATTING_FUNCTIONS         1      /* cpu task */
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()     (ulCpuTraceTick = 0ul)
#define portGET_RUN_TIME_COUNTER_VALUE()             ulCpuTraceTick
STM32 定时器

(待写)

简要说明

  • configUSE_TRACE_FACILITY

    • 启用FreeRTOS可视化追踪调试功能
  • configGENERATE_RUN_TIME_STATS

    • 启用FreeRTOS运行时间统计功能
  • configUSE_STATS_FORMATTING_FUNCTIONS

    • 启用FreeRTOS格式化函数功能
  • portCONFIGURE_TIMER_FOR_RUN_TIME_STATS

    • 重置自定义心跳值
  • portGET_RUN_TIME_COUNTER_VALUE

    • 宏定义自定义心跳变量
  • ulCpuTraceTick

    • 自定义心跳值,高频累加即可。