前言
本笔记基于 stm32+FreeRTOS。
主要参考野火、安富莱。
概念
简单概要:
-
各任务cpu利用率:
打印出各任务在某段时间内站用cpu时长的比例。 -
原理很简单:
- 开启一个高精度的定时器
- 让一个全局变量(如:ulCpuTraceTick)不断往上累加
- 每次切换任务时,记录上一个任务占用了多少个高精度定时器的tick
- 累加到该表示该任务的变量中(如:ulCpuTraceTaskATick)
- 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
- 自定义心跳值,高频累加即可。