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

【经验分享】RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响

[复制链接]
STMCU小助手 发布时间:2022-2-26 16:17
前言
! ?% M5 y/ i. E0 s+ z) p( L( N, V3 f! P在客户使用 STM32F7xx(Cortex-M7 内核)实际测试中,会发现同等主频下 STM32F4xx(Cortex-M4)执行同样一段简单程序在时间上要快于 STM32F7xx,这个会影响到客户切换到 STM32F7xx 的信心,也对 ST 以及 ARM 宣传上 Cortex-M7 内核执行时间远快于 Cortex-M4 内核的说法提出质疑,本文将针对具体案例说明这一情况的产生以及解决办法。$ D) {7 x% t8 |: [# P

+ |1 D. |( ]. w2 w
9 y' k8 G! ^7 I9 I$ [/ J问题描述
; s1 Y  C! ~, \0 ^2 @/ {1 A客户测试复杂程序运行时间,比如同样 180MHz 主频下,STM32F7xx 执行 Coremark 测试程序时间远小于 STM32F4xx 的执行时间;也就是 STM32F7xx 的性能更佳,运算执行效率更好。但当客户程序顺序执行程序,尤其是简单程序时发现STM32F7xx 执行时间大于 STM32F4xx 的执行时间,比如运行下面的同样的测试代码,就有明显差距:
3 o" n9 U. p/ c  I) {) s
  1. volatile uint16_t i;
    0 q" f, F: Q, [5 M1 i
  2. static volatile uint16_t j = 0;
    4 p$ m) j3 L6 O( d- m8 |  \
  3. i = 0;
    1 g) t# o; a! l  M9 K+ j- ^0 Q
  4. while(i<300)* M, `! v4 ^7 }, |
  5. {
    ( H6 `/ k4 b7 h# i8 K
  6. i++;  W6 A+ |# ^$ v, J
  7. }
    * o- N4 a) y/ e" S1 I5 L1 p8 F
  8. if(j < 100)
    8 o$ R' g- S. K  w
  9. {
    ( }5 @' s2 V7 @# C" A$ R: z3 D
  10. j ++;
    2 O4 o4 W# d# C$ j
  11. }
    ) y# X6 t4 n( p
  12. else) `/ [$ v0 R" m; {7 b
  13. {
    2 k/ y! W' n8 b7 j  \
  14. j = 0;5 i" s6 @( k5 F4 |7 S0 ~
  15. }: g" F6 {# w1 y0 ~/ q! O0 K; `
复制代码
为方便量化时间,使用 Timer2 计数方式对这段时间进行计数,Timer2 运行在 90MHz,向上计数,Test_Counter 数据用于输出计数数值,增加后代码如下:' U3 t  ?! B- b. Q: b1 T

# t5 {/ l/ u" K6 s: J' ]( w
  1. volatile uint16_t i;3 J8 t( I4 P, _8 T1 a
  2. static volatile uint16_t j = 0;( C# D3 j2 X8 ]& a" B
  3. TIM2->CNT = 0;
    2 \8 z3 T; h1 {( Q
  4. __HAL_TIM_ENABLE(&htim2);
    9 A7 H6 E/ J( \' m; u4 A# v, _
  5. i = 0;0 m& e% }# y2 q9 y. _! ^5 i
  6. while(i<300)5 u6 ]2 S) ?+ G# J3 J- j3 p
  7. {- B" W5 @0 k' O  B9 c5 }
  8. i++;
    9 h! Z; J. h" s! x
  9. }
    5 ^  Y7 w- s  r' Y' y% n# {+ M- E
  10. if(j < 100)
    8 Z3 F% P2 H' V$ o7 N
  11. {
    - f4 X9 X5 E# @' E
  12. j ++;) G7 I0 l4 H) B
  13. }
    9 _2 B( D5 _- D  P
  14. else
    : j7 B& f# }- F8 u/ K0 O
  15. {
    1 z2 [/ I7 y  O; E& b) _) X  d
  16. j = 0;$ @- d# i8 I# t/ s+ ~+ c
  17. }- S6 p, m  d9 z( k- L$ ~# I. b2 M
  18. __HAL_TIM_DISABLE(&htim2);( X& B! n/ C/ O; w
  19. Test_Counter = __HAL_TIM_GET_COUNTER(&htim2);) r2 H) d2 j2 [
  20. 通过上面的修改后测试下来,Test_Counter 数据分别为:# w) s+ X/ U" X5 e+ Z4 K7 g
复制代码
$ p9 r. z2 v$ b( K0 w/ W) s0 y

7 f6 u# ^: r, Q% j& u通过上面的修改后测试下来,Test_Counter 数据分别为:
: {( e/ F0 b( g# a* ?6 d& TSTM32F446 数据为 1543
* l4 m' _* Q. B; |# Z. O% J7 zSTM32F746 数据为 18368 h0 e5 X! ~- _0 r8 M; q. ?
如果使用 Keil 自带的 States cycles 计算方法得到如下数据,后面会按照这个来计算执行时间数据。
, Y" ^; G) ]6 l) ~8 @STM32F446 数据为 3009' x0 @2 G1 H5 N5 m+ U
STM32F746 数据为 36352 M6 f5 S& c) O

9 f; L( R. C% a7 e2 ] % Y( t* A. i% [3 J( F3 z

* r3 _- U8 W- q

, b# @6 Y- T1 X+ i产生上述问题的原因:3 j- F, O( G& C
上面的测试都是在使用了 Cache 以及 ART 加速方法测得,如果针对 STM32F7xx 的性能优化可以参考 AN4667 "STM32F7 Series system architecture and performance"这篇应用文档的描述,本例已经对文档描述部分做过优化,但问题依然是STM32F7xx 速度慢于 STM32F4xx。两颗芯片运行同样代码,比较两颗芯片汇编代码也是相同的:
* f6 y: p# ?. l
! x; l: l( c; |# r0 u) r
  1. LDRH r2,[sp,#0x00]& K* \  j0 e9 y
  2. ADDS r2,r2,#1  {% \7 F( J1 w
  3. STRH r2,[sp,#0x00]
    + D  ?) Z  b0 ?4 ^
  4. LDRH r2,[sp,#0x00]
    8 U* `# W2 r8 [+ n4 r6 X. V- n. G
  5. CMP r2,r3
      N+ s( \+ _$ S/ `8 m7 [
  6. BCC 0x00000128
    6 T& n7 V2 `4 K( o8 w
复制代码
9 l! ^) z' g. q; {
1 S3 I! K6 ?  Z; w6 |
通过查看 ARM Cortex-M7 内核文档发现下面描述:$ m( N- \, n8 G' M* g

& _; [) h. P5 [) v4 H WYR6GPVK496P{@B9Y03$ZXY.png
/ ^7 f5 i' e6 m; d; E8 ]- p& z
  M2 e$ O+ Y; E  m* I反映到本例中发现定义的 i 数据为 16-bit 数据,同样也在汇编代码上发现了 STRB 这个汇编代码;这样在 RMW(readmodify-write机制下,当定义为 byte 以及 half-word 数据时将有一个先读取数据,修改后再写入数据的过程,这个读取-修改-写入的过程正是能够影响到内核执行效率的问题点,如果定义为 32-bit 就避免了这个问题的发生。
+ D1 h. ?8 ?. Z$ @5 C  f9 L+ _2 `: m: w: ~$ Q) [% Z
( h9 e$ e( G( r4 c- S
$ y% W0 o" G, O0 ]% J& p+ J
问题解决
8 N1 ?" v$ Z* }& z5 |5 y7 H6 N按照文档说明,我们将 16-bit 定义数据,改为 32-bit 的定义数据,即$ U( M! P' O9 V4 }3 c* _

+ q7 H0 `. g8 d+ h2 o* `; o5 j
  1. volatile uint32_t i;
    + T* I0 j2 g1 u6 T0 S: @
  2. static volatile uint16_t j = 0;
复制代码
生成的汇编代码如下/ [5 z# U! v& A
  1. LDR r0,[sp,#0x00]# B* d1 v7 s4 ^$ Z4 Q+ T7 f, U
  2. ADDS r0,r0,#1
    + x; T1 g+ o6 |4 O3 [" a
  3. STR r0,[sp,#0x00]
    / P# f! `6 v7 R9 E
  4. CMP r0,r1
    ( k2 }5 @/ g8 s- H/ t
  5. BCC 0x08001F28
复制代码
测试下来结果如下:
; g5 V) m; ]& s7 r8 a8 J) tSTM32F446 数据为 2102
1 `: x6 S: u3 M# g2 R. n: `+ u) rSTM32F746 数据为 1807
: I" X: [8 d7 Y0 M可以看到不管是 STM32F4xx 还是 STM32F7xx,当数据定义为 32-bit 时都有显著的速度提升,当然 STM32F7xx 的提升更加明显,同样测试条件下 STM32F7xx 执行时间小于 STM32F4xx 的执行时间。
6 T* g' Y/ `1 r3 F( _, l6 ^1 W) B* E* G7 `
, t8 Y7 s& B. G8 e+ d+ m! r/ b6 D
深入内核修改
* s+ Y3 v- F2 i9 L' R因为 32-bit 数据定义会增加内存,并且有时候定义为 byte 或 halfword 更方便,还需要提升速度的话我们看到同样是内核文件给出的说明,可以将 RMW 机制屏蔽掉:" Y) \; f# }: m" U3 N2 i- ], n
% J( v- z1 }+ {' G
3 Z7 Q% ~5 x$ `4 \
QPE2}_OJ$`PR)`86P~)H[~K.png & Z0 a# V7 G' R

# P- L5 O' T6 G. f% g实际上就是对 CM7_ITCMCR 寄存器的第 1 位写 0, 即可以在程序中有下面的操作:
" K( j/ J- b5 ~% B' ?( w
  1. __IO uint32_t * DTCM_CR = (uint32_t*)(0xE000EF94);
    + i1 s3 p& p, M/ C7 r
  2. * DTCM_CR &= 0xFFFFFFFD; /* Disable read-modify-write */
复制代码

/ g0 o2 l+ S9 s8 y禁止 RMW 后测试下来数据如下:
1 x2 \+ d7 v& r& q) a16-bit 定义数据 STM32F746 测试 cycles 数据为 3022/ R, H; g8 S2 f
32-bit 定义数据 STM32F746 测试 cycles 数据为 1808, {- B% Q: F* f6 X. F
可以对比上面的测试数据也可以看到当禁止 RMW 后 STM32F7xx 性能也是优于 STM32F4xx 的。
  p! Q$ W& T; b+ \; i, y具体测试数据如下:
* U4 `) g' ^7 T2 r$ w: v0 ]
1 s: ]3 W( k, h# d( x
3 X6 z4 @  D4 {
4 v$ O3 Y3 i+ q  \7 x( H结论:
" r1 H0 U  I. x, ]) E$ R  h# M需要提升 STM32F7xx 执行时间,发挥出最大效能时,请参考 AN4667,同时需要注意 RMW 对内核性能发挥的影响
! y( W5 b1 O1 A0 I! v( i! b" o8 }
6 E& _# N, m$ Q! t9 d- X( T/ R2 s
8 ]; F$ D' m0 `3 y; v3 p  [- R# t2 X7 R6 V

; q; q- L; l* Z! Y
7 c; ]6 e0 m1 r4 g8 p& d% r3 t6 T6 q6 X5 P3 P9 V; R8 L
1 G. D0 H$ u0 E5 ^; c3 `
* a9 _/ h3 F3 B' |2 A
- u( E9 q! k- _# O
' p& X2 J4 x! _9 z

% y$ ^1 `( S0 a
* D+ c# g8 Z8 b, h
* A2 c4 ^5 M! z& w) Z' f; Y2 b# f9 q
+ [8 S6 h' m8 g& f
赞 收藏 评论0 发布时间:2022-2-26 16:17

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版