单片机CPU占用率测量
1.软件测量
基于FreeRTOS Runtime统计功能计算Cpu Load(原生方案)
1. FreeRTOS系统中CPU利用率统计功能是一个可裁剪的功能,可通过宏定义来进行裁剪。在FreeRTOSConfig.h文件中,添加如下代码:
2. 开启一个周期小于Systick的定时器中断,用于累加运行时间,将STM中断周期设置为Systick的1/10, 累计10次中断执行FreeRTOS Systick操作
3.调用vTaskGetRunTimeStats返回各个任务CPU占用率,该接口统计所有任务的CPU占用率,并将结果以字符串类型返回
该方案缺陷:
1. 没有对进行 CPU 利用率统计时间的变量做溢出保护,使用的是 32 位变量来系统运行的时间计数值,而按 20000HZ 的中断频率计算,每进入一中断就是 50us,变量加一,最大支持计数时间:2^32 * 50us / 3600s = 59.6 分钟,运行时间超过了 59.6 分钟后统计的结果将不准确,
2. 结果返回值为字符串类型,无法保存为浮点或整形变量,不利于后续数据处理。
3. 不能快速刷新结果,考虑到计算公式分母过大,需要运行很长时间后才能得到稳定的CPU占用率
CPU Load = 100- (100 * Idle RunTime)/(Total RunTime)
基于FreeRTOS Runtime统计功能计算Cpu Load(改进方案)
修改FreeRTOS源码,添加在task.c文件添加vTaskGetCpuLoad函数,在周期任务中调用该接口返回当前CpuLoad。
该方案支持CPU占用率快速刷新结果,将结果以整数类型返回,同时支持长时间测量, 周期任务中调用,
缺点: 无法统计中断处理时间,中断处理时间过长影响结果准确性
2.硬件测量
PicoScope测量IO翻转占空比计算Cpu Load
1. 初始化分配一个IO口用于测量CpuLoad,在IDLE任务中翻转该IO。如果IDLE任务被其他高优先级任务/中断抢占,将会出现长时间的高/低电平
2. 使用Pico示波器观察,
蓝色A通道波形是测量的io口,时间轴放大后可以看到电平翻转,对该通道激活低通滤波
4. 增加占空比测量,可以实时查看当前CpuLoad变化
1. 测量方法简单,精度高,实时性较好
2. 代码改动较小,规避了因Cpu Load软件计算引入的偏差
3. 不依赖操作系统
1. 对硬件依赖,比如需要分配一个IO口和示波器。
2. Cpu Load只能在PicoScope观测,不被软件内部获取
作者:一片芦苇叶