• 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口,时间轴放大后可以看到电平翻转,对该通道激活低通滤波

  •     

        

  • 3. 使用Pico自带的数学通道功能对滤波后的数据做偏移
  •    

       

  • 4. 增加占空比测量,可以实时查看当前CpuLoad变化

  •     

        

  • 优点:
  • 1. 测量方法简单,精度高,实时性较好

    2. 代码改动较小,规避了因Cpu Load软件计算引入的偏差

    3. 不依赖操作系统

  • 缺点:
  • 1. 对硬件依赖,比如需要分配一个IO口和示波器。

    2. Cpu Load只能在PicoScope观测,不被软件内部获取

    作者:一片芦苇叶

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机CPU占用率测量

    发表回复