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

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

[复制链接]
zero99 发布时间:2016-7-15 05:36
一种计算CPU使用率 的方法 及其实现原理
1 v* t! p* H- Q9 ?: v
: O. O- b" x( Y1前言" A0 K& d0 }% `8 p, }/ \
出于性能方面的考虑,有的时候,我们希望知道CPU的使用率为多少,进而判断此CPU的负载情况和对于当前运行环境是否足够“胜任”。本文将介绍一种计算CPU占有率的方法以及其实现原理。: j# ]. f+ Y1 i1 Z

5 ^- B6 ?  \7 d& V( X5 i2移植算法4 U" \: N5 C% N( h9 b! H. ^! T) N
2.1 算法简介; J) q2 A' D3 M0 W: B: s% K
此算法是基于操作系统的,理论上不限于任何操作系统,只要有任务调度就可以。本文将以FreeRTOST为例来介绍本算法的使用方法。
% Y, n) o7 P9 }6 t/ ~: t本文所介绍的算法出处为随Cube库一起提供的,它在cube库中的位置如下图所示:
1 P& J5 p! j" X" P1 J- F 1.png
/ y# l$ l- N+ ^, s' n
0 I5 r( a% Z1 p! ~; Z本文将以STM32F4为例,测试环境为STM3240G-EVAL评估板。5 q& n/ j, d6 `5 t: Z; V# \

- s+ J* e2 |6 m' }7 Z# h+ T2.2 开始移植
& \6 `" M: W# W: }本文以CubeF4内的示例代码工程STM32Cube_FW_F4_V1.10.0\Projects\STM324xG_EVAL\Applications\FreeRTOS\FreeRTOS_ThreadCreation为例,IDE使用IAR。
* G( f3 {$ D: y! I6 q第一步:使用IAR打开FreeRTOS_ThreadCreation工程,将cpu_utils.c文件添加到工程,并在工程中添加对应头文件目录:6 W- r# @, b4 Z% ^1 N; j
2.png
9 g6 Z8 |0 ~( Y8 p7 i/ a0 }2 E& O# [5 a6 c
第二步:打开FreeRTOST的配置头文件FreeRTOSConfig.h修改宏configUSE_IDLE_HOOK和configUSE_TICK_HOOK的值为1: #define configUSE_PREEMPTION 1
9 K" H, ^* X- Z5 E% v4 ] 3.png
3 a: n% A& z( H2 [( l; g8 K4 f# X& z: p
第三步:继续在FreeRTOSConfig.h头文件的末尾处添加traceTASK_SWITCHED_IN与traceTASK_SWITCHED_OUT定义:
4 J, k$ j2 }: _; d0 g" Q3 u3 a 4.png   M  t' H# j/ }+ p0 O
% w2 Q1 N, v: ?4 }
第四步:在main.h头文件中include “”cmsis_os.h“”
0 a. J: i4 n) G, ~! KMain.h :
! H4 Q: y3 f+ r8 ^8 {$ k 5.png 6 I9 T0 w3 h0 }$ T

8 R/ ]" q4 k& E3 I6 B; K( L
' t: J2 P4 J' A; s1 w1 T$ N0 d第五步: 修改工程属性,使编译过程不需要函数原型:* u) ^% Y- M7 R- A# B* P. y! L
6.png ) u; Z9 X" I$ S# L5 i
6 P  K* ^& m! G3 X
第六步:在工程中任何用户代码处都可以调用osGetCPUUsage()函数来获取当前CPU的使用率:1 h4 \9 V5 B; B* b6 I4 t; |2 B
7.png
2 A! o7 q: ~# F% l1 S: a. F
: d$ S) q9 k! m- A1 Y0 }4 [4 J& _- {第七步:编译并运行测试
' N% ?' x2 }' `: K" i' K4 ^在调试状态下使用Live Watch窗口监控全部变量osCPU_Usage的值:
) v" V+ U% J( y5 `9 V) A 8.png # e+ k* w- w% k
$ S0 e& V+ T. a8 ~
osCPU_Usage是在cpu_utils.c文件中定义的全局变量,表示当前CPU的使用率,是个动态值,由上图可以,CPU使用率的动态值为20%。实际在代码中是按第六步中调用osGetCPUUsage()函数来获取当前CPU的使用率的。$ _+ o) G  c9 c
至此,算法使用方法介绍完毕。
/ H% O, ]  B  f* }
: l! v, Q, g8 Z3 算法实现原理分析
9 `4 ]( `( k0 @! k操作系统运行时是不断在不同的任务间进行切换,而驱动这一调度过程是通过系统tick来驱动的,即每产生一次系统tick则检查一下当前正在运行的任务的环境判断是否需要切换任务,即调度,如果需要,则触发PendSV,通过在PendSV中断调用vTaskSwitchContext()函数来实现任务的调度。而本文所要讲述的CPU使用率算法是通过在一定时间内(1000个时间片内),计算空闲任务所占用的时间片总量,100减去空闲任务所占百分比则为工作任务所占百分比,即CPU使用率。
: k4 i* c1 K7 @6 \ 9.png * x6 n9 F3 C( t/ |7 e! o2 b/ Z

; J; j% x5 [1 I* o+ {; O: @' Z此函数为空闲任务钩子函数,每次当切换到空闲任务时就会运行此钩子函数,它的作用就是记录当前空闲任务的句柄并保存到全局变量xIdleHandle。5 m  p. ]' O! C) s1 _! @
10.png
7 E! A( U$ P3 m- t
- Z$ u1 ]; b4 G0 R' H此函数为操作系统的tick钩子函数,即每次产生系统tick中断都会进入到此钩子函数。此钩子函数实际上就是具体计算CPU使用率的算法了。osCPU_TotalIdleTime是一个全局变量,表示在1000个tick时间内空闲任务总共占用的时间片,CALCULATION_PERIOD宏的值为1000,即每1000个tick时间内重新计算一次CPU的使用率。
3 x" `& {( S7 w0 i4 r. i+ J% t) ^! q) I3 [# p
下面两个函数就是如何计算osCPU_TotalIdleTime的:
) e9 Q8 ~  D7 l  k  }) \ 11.png
% [- o$ h! E* T  m$ y, T% T5 x) }% v' l% K
这两个函数是调度器钩子函数,在调度器进行任务切进和切出时分别回调,StartIdleMonitor()函数记录切换到空闲任务时的时间点,EndIdleMonitor()则在推出空闲任务时计算此次空闲任务花费多长时间,并累加到osCPU_TotalIdleTime,即空闲任务总共占用的时间片。
8 z! v3 E5 M' T, q. ^  Y. S 12.png
' C  j( E8 b8 I4 _$ l9 A5 L7 n
" u2 P' v" z  u4 C0 B$ \全局变量osCPU_Usage保存的就是CPU的使用率,它是在操作系统的tick钩子函数中每隔1000个tick就被重新计算一次。6 n% U2 c  P& X/ X3 L% k0 X5 x

) ?7 D/ p% p$ F. ]4 结论3 b- A4 o* U/ j9 E; x2 W
通过此方法可以很好的用来评估STM23 MCU的运行性能。
* U; `' V( D" D; G# U1 N
8 Y4 v5 C7 Z4 E8 w) U: q! U1 B3 ?( k& Z4 j  M: ]
文档下载地址:
( J& [2 u9 x( O$ Zhttps://www.stmcu.org.cn/document/list/index/category-1035
( D& w5 S' `% M+ i
) e% r7 W  G! C实战经验汇总:
( \! ~" R' m2 R. H3 W3 D3 Ohttps://www.stmcu.org.cn/module/forum/thread-576401-1-1.html- H( v0 ~+ n/ m/ P4 q; l6 S, y

/ g. W0 Y# o2 j2 i" ~
收藏 2 评论2 发布时间:2016-7-15 05:36

举报

2个回答
pdbq 回答时间:2018-3-30 11:27:46
非常棒,下来试验下,谢谢
laigs218 回答时间:2018-3-30 17:06:51
谢楼主分享,下来试验下,谢谢

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版