【转】STM32: 一种计算CPU使用率的方法及其实现原理

摘要:
本文将介绍一种计算CPU占有率的方法以及其实现原理。本文将以FreeRTOST为例来介绍本算法的使用方法。实际在代码中是按第六步中调用osGetCPUUsage()函数来获取当前CPU的使用率的。此钩子函数实际上就是具体计算CPU使用率的算法了。osCPU_TotalIdleTime是一个全局变量,表示在1000个tick时间内空闲任务总共占用的时间片,CALCULATION_PERIOD宏的值为1000,即每1000个tick时间内重新计算一次CPU的使用率。4结论通过此方法可以很好的用来评估STM23MCU的运行性能。

1 前言
出于性能方面的考虑,有的时候,我们希望知道CPU使用率为多少,进而判断此CPU的负载情况和对于当前运行环境是否足够“胜任”。本文将介绍一种计算CPU占有率的方法以及其实现原理。
2 移植算法
2.1 算法简介
此算法是基于操作系统的,理论上不限于任何操作系统,只要有任务调度就可以。本文将以FreeRTOST为例来介绍本算法的使用方法。
本文所介绍的算法出处为随Cube库一起提供的,它在cube库中的位置如下图所示:
【转】STM32: 一种计算CPU使用率的方法及其实现原理第1张
本文将以STM32F4为例,测试环境为STM3240G-EVAL评估板。
2.2 开始移植
本文以CubeF4内的示例代码工程STM32Cube_FW_F4_V1.10.0ProjectsSTM324xG_EVALApplicationsFreeRTOSFreeRTOS_ThreadCreation为例,IDE使用IAR。
第一步:使用IAR打开FreeRTOS_ThreadCreation工程,将cpu_utils.c文件添加到工程,并在工程中添加对应头文件目录:
【转】STM32: 一种计算CPU使用率的方法及其实现原理第2张
第二步:打开FreeRTOST的配置头文件FreeRTOSConfig.h修改宏configUSE_IDLE_HOOK和configUSE_TICK_HOOK的值为1: #define configUSE_PREEMPTION 1
【转】STM32: 一种计算CPU使用率的方法及其实现原理第3张
第三步:继续在FreeRTOSConfig.h头文件的末尾处添加traceTASK_SWITCHED_IN与traceTASK_SWITCHED_OUT定义:
【转】STM32: 一种计算CPU使用率的方法及其实现原理第4张
第四步:在main.h头文件中include “”cmsis_os.h“”
Main.h :
【转】STM32: 一种计算CPU使用率的方法及其实现原理第5张
第五步: 修改工程属性,使编译过程不需要函数原型:
【转】STM32: 一种计算CPU使用率的方法及其实现原理第6张
第六步:在工程中任何用户代码处都可以调用osGetCPUUsage()函数来获取当前CPU的使用率:
【转】STM32: 一种计算CPU使用率的方法及其实现原理第7张
第七步:编译并运行测试
在调试状态下使用Live Watch窗口监控全部变量osCPU_Usage的值:
【转】STM32: 一种计算CPU使用率的方法及其实现原理第8张
osCPU_Usage是在cpu_utils.c文件中定义的全局变量,表示当前CPU的使用率,是个动态值,由上图可以,CPU使用率的动态值为20%。实际在代码中是按第六步中调用osGetCPUUsage()函数来获取当前CPU的使用率的。
至此,算法使用方法介绍完毕。
3 算法实现原理分析
操作系统运行时是不断在不同的任务间进行切换,而驱动这一调度过程是通过系统tick来驱动的,即每产生一次系统tick则检查一下当前正在运行的任务的环境判断是否需要切换任务,即调度,如果需要,则触发PendSV,通过在PendSV中断调用vTaskSwitchContext()函数来实现任务的调度。而本文所要讲述的CPU使用率算法是通过在一定时间内(1000个时间片内),计算空闲任务所占用的时间片总量,100减去空闲任务所占百分比则为工作任务所占百分比,即CPU使用率。
【转】STM32: 一种计算CPU使用率的方法及其实现原理第9张
此函数为空闲任务钩子函数,每次当切换到空闲任务时就会运行此钩子函数,它的作用就是记录当前空闲任务的句柄并保存到全局变量xIdleHandle。
【转】STM32: 一种计算CPU使用率的方法及其实现原理第10张
此函数为操作系统的tick钩子函数,即每次产生系统tick中断都会进入到此钩子函数。此钩子函数实际上就是具体计算CPU使用率的算法了。osCPU_TotalIdleTime是一个全局变量,表示在1000个tick时间内空闲任务总共占用的时间片,CALCULATION_PERIOD宏的值为1000,即每1000个tick时间内重新计算一次CPU的使用率。
下面两个函数就是如何计算osCPU_TotalIdleTime的:
【转】STM32: 一种计算CPU使用率的方法及其实现原理第11张
这两个函数是调度器钩子函数,在调度器进行任务切进和切出时分别回调,StartIdleMonitor()函数记录切换到空闲任务时的时间点,EndIdleMonitor()则在推出空闲任务时计算此次空闲任务花费多长时间,并累加到osCPU_TotalIdleTime,即空闲任务总共占用的时间片。
【转】STM32: 一种计算CPU使用率的方法及其实现原理第12张
全局变量osCPU_Usage保存的就是CPU的使用率,它是在操作系统的tick钩子函数中每隔1000个tick就被重新计算一次。
4 结论
通过此方法可以很好的用来评估STM23 MCU的运行性能。

来源

免责声明:文章转载自《【转】STM32: 一种计算CPU使用率的方法及其实现原理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS之Cocoapods的安装和使用[转]html风格tooltip效果的实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

递归算法的时间复杂度

递归算法应该都不陌生,其实最开始遇见递归应该是在数学课上,类似于f(x)=f(x-1)+f(x+1),f(1)=1,f(2)=4,f(3)=3这种数学题大家应该见过不少,其实思想就是层层递归,最终将目标值用f(1),f(2),f(3)表示。 之前做了一个需求,需要实现类似操作系统文件夹的功能,我们用MySQL数据库记录数据,表字段有4列,分别是id,ind...

Java内存模型(JMM)总结

Java内存模型(JMM) 我们常说的JVM内存模型指的是JVM的内存分区;而Java内存模型是一种虚拟机规范。 Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:...

代价敏感学习初探

1. 代价敏感学习简介 0x1:如何将业务场景中对FP和FN损失的不同接受程度,调整我们的损失函数 1. 什么场景下需要代码敏感学习 在很多真实业务场景中,包括笔者所在的网络安全领域,误报造成的损失常常比漏报来的要大,原因很简单,如果一个IDS系统每天都在产生大量虚警,那么对事件响应处理人员的压力就会非常大,时间久了,大家对IDS的信任度就会下降,同时真实...

【内核】——中断和异常

中断和异常 定义:中断通常被定义为一个事件,该事件改变了CPU的执行顺序。 分类:中断常分为同步中断和异步中断。在intel微处理器中,把同步中断也称为异常,异步中断称为中断。 同步中断(异常):当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令执行终止执行后CPU才会发出中断。异常是程序的错误产生的,或者是由内核必须处理的异常条...

基于STM32的USB枚举过程学习笔记(转)

之前使用ST官方的库以及网络的资料,完成了使用USB HID类进行STM32和PC机的通讯。由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB设备的枚举,以及具体的通讯方式都没有清晰的概念,所以现在回头重新学习USB相关知识。主要参考资料是《圈圈教你玩USB》、USB枚举过程图解,ST官方的USB HID例程。 一,USB数据包    1.   ...

openssl enc 加解密

介绍 enc - 对称加密例程,使用对称密钥对数据进行加解密,特点是速度快,能对大量数据进行处理。算法有流算法和分组加密算法,流算法是逐字节加密,数据经典算法,但由于其容易被破译,现在已很少使用;分组加密算法是将数据分成固定大小的组里,然后逐组进行加密,比较广为人知的是DES3。分组算法中又有ECB,CBC,CFB,OFB,CTR等工作模式,其中默认选C...