问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32 CPU使用率计算方法及原理详解

创作时间:
作者:
@小白创作中心

STM32 CPU使用率计算方法及原理详解

引用
1
来源
1.
https://www.cnblogs.com/dzjl/p/18548305

在嵌入式系统开发中,了解和监控CPU使用率对于优化系统性能至关重要。本文将详细介绍如何在STM32F429微控制器上使用FreeRTOS和KEIL开发环境计算CPU使用率的方法,并深入分析其背后的实现原理。

1. 官方方法概述

STM32的CubeMX固件库提供了一种计算CPU使用率的方法,本文将基于此方法进行详细讲解。

2. 工程实现步骤

2.1 引入cpu_utils.c文件

首先,需要将cpu_utils.c文件添加到工程中,并将其头文件路径加入工程配置。

2.2 配置FreeRTOS

接下来,需要对FreeRTOS进行如下配置:

  1. 打开FreeRTOS的配置头文件FreeRTOSConfig.h,并进行以下设置:
  • 开启空闲钩子函数功能:configUSE_IDLE_HOOK = 1
  • 开启时间片钩子函数功能:configUSE_TICK_HOOK = 1
  • 开启抢占式调度:configUSE_PREEMPTION = 1
  1. FreeRTOSConfig.h的末尾添加两个宏函数。

  2. main.h头文件中加入#include "cmsis_os.h"

  3. 在工程中任何用户代码处都可以调用osGetCPUUsage()函数来获取当前CPU的使用率。

  4. 编译并运行测试。

通过上述步骤,可以成功集成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微控制器的运行性能,对于优化系统资源分配和性能调优具有重要参考价值。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号