你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】一种计算CPU使用率的方法及其实现原理

[复制链接]
zero99 发布时间:2016-7-15 05:36
一种计算CPU使用率 的方法 及其实现原理 5 }( e+ [( Z+ O7 ~
( o- l* V; V) q& O, |
1前言
3 U9 U2 x7 e3 C: ^出于性能方面的考虑,有的时候,我们希望知道CPU的使用率为多少,进而判断此CPU的负载情况和对于当前运行环境是否足够“胜任”。本文将介绍一种计算CPU占有率的方法以及其实现原理。
: z5 c; W: Z. S3 c( C5 f3 n: d, K5 s9 r* d* `- V$ J+ k# v1 V, D
2移植算法. p& {8 q. T2 I0 E$ s1 s
2.1 算法简介
0 R' i) a% g; Z4 b此算法是基于操作系统的,理论上不限于任何操作系统,只要有任务调度就可以。本文将以FreeRTOST为例来介绍本算法的使用方法。7 B& e* P9 I* l% c' l1 A
本文所介绍的算法出处为随Cube库一起提供的,它在cube库中的位置如下图所示:
5 ^0 q# u7 {- `9 [ 1.png 3 `0 d* o( @' Z5 d* K3 c  |$ ]
: E/ ?* l" N$ p( U
本文将以STM32F4为例,测试环境为STM3240G-EVAL评估板。
! R) a  b9 i( o, ~- n9 |( c" c, g
4 f9 r7 ]+ L" _* r2.2 开始移植
) O! p# a& w! b! t2 H; ?3 Q0 w* g4 @$ `本文以CubeF4内的示例代码工程STM32Cube_FW_F4_V1.10.0\Projects\STM324xG_EVAL\Applications\FreeRTOS\FreeRTOS_ThreadCreation为例,IDE使用IAR。1 M+ s! k: A& _: F4 t' N) Q) N- P
第一步:使用IAR打开FreeRTOS_ThreadCreation工程,将cpu_utils.c文件添加到工程,并在工程中添加对应头文件目录:; I3 E0 W& N1 Z- I$ M
2.png
* b" O# e4 L- a# W, P3 F% z" o" m- b* z) o
第二步:打开FreeRTOST的配置头文件FreeRTOSConfig.h修改宏configUSE_IDLE_HOOK和configUSE_TICK_HOOK的值为1: #define configUSE_PREEMPTION 1 : C' e# s) f/ z* R* U8 c( `; Y
3.png , R8 X8 M  r6 N
+ W+ n% a; U: o* i1 G% ~8 o" R
第三步:继续在FreeRTOSConfig.h头文件的末尾处添加traceTASK_SWITCHED_IN与traceTASK_SWITCHED_OUT定义:8 n) z  K( e8 Q' [( j0 U2 h
4.png
2 ]! J$ ?. r0 m# ^& S6 Q8 g$ x/ n. R0 L' S2 c8 u
第四步:在main.h头文件中include “”cmsis_os.h“”
+ Q4 a. M4 B5 O5 \3 w2 K$ iMain.h :
/ c+ N+ I9 c1 k% M1 S# a 5.png
& [1 A: p! S4 T5 l% f3 G7 ?% b, B/ \" E6 S) e; J7 [
4 l. V, I' a$ e' v# f
第五步: 修改工程属性,使编译过程不需要函数原型:
% a. J5 m1 C  |7 n% m; h! l' j: N 6.png
9 T+ Q+ C4 Q8 G! k: {3 {
1 I) e0 I( I2 G7 i9 N$ g第六步:在工程中任何用户代码处都可以调用osGetCPUUsage()函数来获取当前CPU的使用率:/ F; _7 B1 h: |9 [, r
7.png
0 |8 P7 `' d' @/ t& s! |2 B. C; F2 H' U# g; `- V
第七步:编译并运行测试: C" R+ i2 d. _9 ^6 g& X$ }& U
在调试状态下使用Live Watch窗口监控全部变量osCPU_Usage的值:
. c/ p( o" k# _) T  u1 z: r 8.png
- p, D  ?7 X9 R3 E0 D( w9 B3 j7 V( R2 u! U/ y% Q: g+ h/ }
osCPU_Usage是在cpu_utils.c文件中定义的全局变量,表示当前CPU的使用率,是个动态值,由上图可以,CPU使用率的动态值为20%。实际在代码中是按第六步中调用osGetCPUUsage()函数来获取当前CPU的使用率的。
: b9 x# {8 J( e4 U2 U& b9 S6 f至此,算法使用方法介绍完毕。; Q: y4 }3 x+ m4 `" V% D" o! j$ D
) o) A- ~! u9 d0 h- D: }4 e
3 算法实现原理分析
& X4 i6 E! J' h" f6 z' {- Z0 |4 @$ k1 L操作系统运行时是不断在不同的任务间进行切换,而驱动这一调度过程是通过系统tick来驱动的,即每产生一次系统tick则检查一下当前正在运行的任务的环境判断是否需要切换任务,即调度,如果需要,则触发PendSV,通过在PendSV中断调用vTaskSwitchContext()函数来实现任务的调度。而本文所要讲述的CPU使用率算法是通过在一定时间内(1000个时间片内),计算空闲任务所占用的时间片总量,100减去空闲任务所占百分比则为工作任务所占百分比,即CPU使用率。
: x: r* h; y1 i8 Q 9.png
/ A2 m* A0 |6 v! Z! X% x: q- z2 b/ Q( n5 K
此函数为空闲任务钩子函数,每次当切换到空闲任务时就会运行此钩子函数,它的作用就是记录当前空闲任务的句柄并保存到全局变量xIdleHandle。
6 C5 E' d+ _8 J8 [! q+ k! j 10.png
$ C9 W6 k3 H7 O5 X9 Z* B$ d- D! ^; a6 v, O# q5 h( \+ D
此函数为操作系统的tick钩子函数,即每次产生系统tick中断都会进入到此钩子函数。此钩子函数实际上就是具体计算CPU使用率的算法了。osCPU_TotalIdleTime是一个全局变量,表示在1000个tick时间内空闲任务总共占用的时间片,CALCULATION_PERIOD宏的值为1000,即每1000个tick时间内重新计算一次CPU的使用率。+ q  `0 y7 P, t7 g+ \/ w- w$ P

' I2 V3 i. [, y/ r7 y下面两个函数就是如何计算osCPU_TotalIdleTime的:
$ X& O: g& j: V7 o- X 11.png ) u/ O6 k# m/ ^2 c

" r: j$ J. K* u& Z; N$ n' R这两个函数是调度器钩子函数,在调度器进行任务切进和切出时分别回调,StartIdleMonitor()函数记录切换到空闲任务时的时间点,EndIdleMonitor()则在推出空闲任务时计算此次空闲任务花费多长时间,并累加到osCPU_TotalIdleTime,即空闲任务总共占用的时间片。7 U1 E% |8 z# }# w) e; k# y1 s/ }
12.png
- b' R* s( n$ u& {. a3 U* s" B+ G  @3 m% E/ c- ^
全局变量osCPU_Usage保存的就是CPU的使用率,它是在操作系统的tick钩子函数中每隔1000个tick就被重新计算一次。# L5 z+ c! N, {' T# s! C

9 O/ O% s& e  d( u4 结论# }& G8 M9 L7 d  N7 x  }" r8 @
通过此方法可以很好的用来评估STM23 MCU的运行性能。
! R1 x+ F, M* G  R& `, a9 N* V, g, B" E$ V7 g9 [+ S

& O! c5 F+ |% C1 m6 q" |  r文档下载地址:5 f% ^- }1 @$ @; Q
https://www.stmcu.org.cn/document/list/index/category-1035
% y7 U4 U: c4 f9 g5 c. l1 W6 M' Z* j! Q* `6 w. }, X/ e9 c
实战经验汇总:
: \6 y$ D: y+ g4 ^& hhttps://www.stmcu.org.cn/module/forum/thread-576401-1-1.html
6 M9 q4 N+ m# P- D% D+ T! C& C5 p. ~0 o& @1 T
赞 收藏 2 评论2 发布时间:2016-7-15 05:36

举报

2个回答
pdbq 回答时间:2018-3-30 11:27:46
非常棒,下来试验下,谢谢
laigs218 回答时间:2018-3-30 17:06:51
谢楼主分享,下来试验下,谢谢
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版