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

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

[复制链接]
zero99 发布时间:2016-7-15 05:36
一种计算CPU使用率 的方法 及其实现原理
* r- {: \6 l( Y# `1 C
. N. v& s/ R0 U5 p5 N( l! C+ _# v1前言
* x6 |" Q! p/ r! J出于性能方面的考虑,有的时候,我们希望知道CPU的使用率为多少,进而判断此CPU的负载情况和对于当前运行环境是否足够“胜任”。本文将介绍一种计算CPU占有率的方法以及其实现原理。( `/ }4 C( i" J8 y

7 w$ C3 n2 i* Y$ A, b1 q- U2移植算法
9 _( d$ e' {" r0 X5 H2 _) n8 H. v; O2.1 算法简介3 r7 j3 i& a, V' V
此算法是基于操作系统的,理论上不限于任何操作系统,只要有任务调度就可以。本文将以FreeRTOST为例来介绍本算法的使用方法。7 Z. c1 `; A( I; N& E6 u% H
本文所介绍的算法出处为随Cube库一起提供的,它在cube库中的位置如下图所示:; w+ E8 C9 V7 o+ c- w/ L
1.png 0 x% p$ D4 `" v- a( H4 \. H- I' n
9 l3 O' \- `' D9 Q
本文将以STM32F4为例,测试环境为STM3240G-EVAL评估板。
4 J' @* t. S: D) O
4 w. Z; D! r% s+ X' ~2.2 开始移植
1 A0 S" z4 `& M5 F4 m本文以CubeF4内的示例代码工程STM32Cube_FW_F4_V1.10.0\Projects\STM324xG_EVAL\Applications\FreeRTOS\FreeRTOS_ThreadCreation为例,IDE使用IAR。; m/ }9 V" y% T
第一步:使用IAR打开FreeRTOS_ThreadCreation工程,将cpu_utils.c文件添加到工程,并在工程中添加对应头文件目录:
" |. h$ H$ m3 a4 z4 b! w- Y2 ] 2.png
$ |1 I. t; f1 C) n6 S! M1 v  g8 z- ]# Q: ^* p" o% X# ~
第二步:打开FreeRTOST的配置头文件FreeRTOSConfig.h修改宏configUSE_IDLE_HOOK和configUSE_TICK_HOOK的值为1: #define configUSE_PREEMPTION 1 / c6 e* n; `2 [- g' [5 h
3.png ' \# d/ Y8 y# ~; I0 O* B
6 p) [- |7 u+ G! f
第三步:继续在FreeRTOSConfig.h头文件的末尾处添加traceTASK_SWITCHED_IN与traceTASK_SWITCHED_OUT定义:) |8 S; }* n. m
4.png 0 V: [3 y: d4 |, M/ s
* X$ g5 M: l7 t  b$ I; G7 ~
第四步:在main.h头文件中include “”cmsis_os.h“”
' n! \* ?0 q/ `; m2 ^9 hMain.h :
' ]% L2 i5 i) G3 g 5.png $ Q9 ]( p2 P) V
! j0 I! Q2 t9 m) A3 x

$ G4 g1 m! \1 M! g5 G; C8 p4 B第五步: 修改工程属性,使编译过程不需要函数原型:
( E- m7 G' t$ j& S* e 6.png # r' {# p, ^" w: w) C

1 q* m& e. q3 m1 ~4 P第六步:在工程中任何用户代码处都可以调用osGetCPUUsage()函数来获取当前CPU的使用率:
/ q- R3 Q  }3 U! u7 r 7.png 8 x8 c- ?4 w6 P5 P6 H
( L* f2 J: Q1 m" [0 ~8 Z0 L
第七步:编译并运行测试  @; n3 c& ^% X$ w: |
在调试状态下使用Live Watch窗口监控全部变量osCPU_Usage的值:( y. U5 F& s4 Y2 l; ~
8.png ( L3 a1 O" j- O: N" T5 e4 H
5 j* k0 W  j% h* _1 y9 M
osCPU_Usage是在cpu_utils.c文件中定义的全局变量,表示当前CPU的使用率,是个动态值,由上图可以,CPU使用率的动态值为20%。实际在代码中是按第六步中调用osGetCPUUsage()函数来获取当前CPU的使用率的。
3 R* M, Z2 p! N# d至此,算法使用方法介绍完毕。
4 J* c) E4 H" M8 C: [+ P
. r7 I# l3 c' N2 \! B3 算法实现原理分析8 ~4 m7 X, v6 e7 R' s. l
操作系统运行时是不断在不同的任务间进行切换,而驱动这一调度过程是通过系统tick来驱动的,即每产生一次系统tick则检查一下当前正在运行的任务的环境判断是否需要切换任务,即调度,如果需要,则触发PendSV,通过在PendSV中断调用vTaskSwitchContext()函数来实现任务的调度。而本文所要讲述的CPU使用率算法是通过在一定时间内(1000个时间片内),计算空闲任务所占用的时间片总量,100减去空闲任务所占百分比则为工作任务所占百分比,即CPU使用率。
; i  d1 }; L! t/ {! G  K/ P6 l4 H& v 9.png 9 p- q* c3 C) }. p2 f  `

3 e7 v3 l& j4 V. E' N此函数为空闲任务钩子函数,每次当切换到空闲任务时就会运行此钩子函数,它的作用就是记录当前空闲任务的句柄并保存到全局变量xIdleHandle。
- h1 S- {  }! v/ j) w( H0 J/ e 10.png 2 V- D( Z/ v7 W9 ]- x0 H; \* \

* @( W+ A6 |: _! o) q! h6 r# O# J( D此函数为操作系统的tick钩子函数,即每次产生系统tick中断都会进入到此钩子函数。此钩子函数实际上就是具体计算CPU使用率的算法了。osCPU_TotalIdleTime是一个全局变量,表示在1000个tick时间内空闲任务总共占用的时间片,CALCULATION_PERIOD宏的值为1000,即每1000个tick时间内重新计算一次CPU的使用率。% L& e4 ]; C( q8 T9 B' Q

# D, Q8 T3 j4 e" D' c下面两个函数就是如何计算osCPU_TotalIdleTime的:
& F8 Z( [3 x: Q6 w 11.png   l5 A  m# `  m3 Y4 c
' }" u! L, Q8 `- i
这两个函数是调度器钩子函数,在调度器进行任务切进和切出时分别回调,StartIdleMonitor()函数记录切换到空闲任务时的时间点,EndIdleMonitor()则在推出空闲任务时计算此次空闲任务花费多长时间,并累加到osCPU_TotalIdleTime,即空闲任务总共占用的时间片。
% _7 j. [! X. s 12.png , Z6 f+ g% {3 l! T0 o

0 p3 X( n1 z4 |! g  Z% {9 A全局变量osCPU_Usage保存的就是CPU的使用率,它是在操作系统的tick钩子函数中每隔1000个tick就被重新计算一次。
/ M  A3 ~( p) d$ ~; m5 H+ ^
7 s! Q1 S% m. G1 R% Y" P2 A4 结论
( M  O& @0 g' F! q" U通过此方法可以很好的用来评估STM23 MCU的运行性能。
& w* _, A1 t4 p% M$ M
" [; D, w0 l: e$ y4 w4 @
& |1 b7 [" _1 u, I) o文档下载地址:3 ^6 f( _+ y, K, V
https://www.stmcu.org.cn/document/list/index/category-10359 v. t0 l5 L4 N0 r" S$ i

& E6 X  i; F( X( S; {, [- P7 v/ s实战经验汇总:
' Y, ]) M9 r* N3 whttps://www.stmcu.org.cn/module/forum/thread-576401-1-1.html. ]* ]' {6 p6 s# }9 R
) p. G* i3 x0 Z9 }/ j6 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版