STM32 CPU使用率计算方法及原理详解
STM32 CPU使用率计算方法及原理详解
在嵌入式系统开发中,了解和监控CPU使用率对于优化系统性能至关重要。本文将详细介绍如何在STM32F429微控制器上使用FreeRTOS和KEIL开发环境计算CPU使用率的方法,并深入分析其背后的实现原理。
1. 官方方法概述
STM32的CubeMX固件库提供了一种计算CPU使用率的方法,本文将基于此方法进行详细讲解。
2. 工程实现步骤
2.1 引入cpu_utils.c文件
首先,需要将cpu_utils.c
文件添加到工程中,并将其头文件路径加入工程配置。
2.2 配置FreeRTOS
接下来,需要对FreeRTOS进行如下配置:
- 打开FreeRTOS的配置头文件
FreeRTOSConfig.h
,并进行以下设置:
- 开启空闲钩子函数功能:
configUSE_IDLE_HOOK = 1
- 开启时间片钩子函数功能:
configUSE_TICK_HOOK = 1
- 开启抢占式调度:
configUSE_PREEMPTION = 1
在
FreeRTOSConfig.h
的末尾添加两个宏函数。在
main.h
头文件中加入#include "cmsis_os.h"
。在工程中任何用户代码处都可以调用
osGetCPUUsage()
函数来获取当前CPU的使用率。编译并运行测试。
通过上述步骤,可以成功集成CPU使用率计算功能。osCPU_Usage
是在cpu_utils.c
文件中定义的全局变量,表示当前CPU的使用率,是一个动态值。例如,从图中可以看出,当前CPU使用率为1%。
3. 算法实现原理分析
操作系统运行时会不断在不同任务间进行切换,这一调度过程由系统tick驱动。每次产生系统tick时,系统会检查当前正在运行的任务环境,判断是否需要切换任务。如果需要,则触发PendSV中断,并通过调用vTaskSwitchContext()
函数来实现任务调度。
本文介绍的CPU使用率算法通过在一定时间内(1000个时间片内)计算空闲任务所占用的时间片总量,然后用100减去空闲任务所占百分比,得到工作任务所占百分比,即CPU使用率。
具体实现涉及以下几个关键函数:
- 空闲任务钩子函数:每次切换到空闲任务时运行,记录当前空闲任务的句柄并保存到全局变量
xIdleHandle
。 - tick钩子函数:每次产生系统tick中断时调用,负责具体计算CPU使用率。全局变量
osCPU_TotalIdleTime
表示在1000个tick时间内空闲任务总共占用的时间片,CALCULATION_PERIOD
宏的值为1000,即每1000个tick时间内重新计算一次CPU的使用率。
下面是计算osCPU_TotalIdleTime
的具体函数:
这两个函数是调度器钩子函数,在调度器进行任务切进和切出时分别回调:
StartIdleMonitor()
函数记录切换到空闲任务时的时间点。EndIdleMonitor()
则在退出空闲任务时计算此次空闲任务花费多长时间,并累加到osCPU_TotalIdleTime
,即空闲任务总共占用的时间片。
全局变量osCPU_Usage
保存的就是CPU的使用率,它是在操作系统的tick钩子函数中每隔1000个tick就被重新计算一次。
4. 结论
通过这种方法可以很好地评估STM32微控制器的运行性能,对于优化系统资源分配和性能调优具有重要参考价值。