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

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

[复制链接]
zero99 发布时间:2016-11-18 16:35
RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响: l7 E8 s5 z& h  U+ G: ]

  Z: F0 C  v# ]8 u前言# U9 D6 n, u$ p# B6 x( ^
在客户使用STM32F7xx(Cortex-M7内核)实际测试中,会发现同等主频下STM32F4xx(Cortex-M4)执行同样一段简单程序在时间上要快于STM32F7xx,这个会影响到客户切换到STM32F7xx的信心,也对ST以及ARM宣传上Cortex-M7内核执行时间远快于Cortex-M4内核的说法提出质疑,本文将针对具体案例说明这一情况的产生以及解决办法。
; a5 t8 I1 @$ a+ U5 b+ _7 u, i4 k9 \3 n

6 e' i! T) V, w+ R; V% @问题描述* x7 \% {; s3 B$ z1 }+ M: K) A
客户测试复杂程序运行时间,比如同样180MHz主频下,STM32F7xx执行Coremark测试程序时间远小于STM32F4xx的执行时间;也就是STM32F7xx的性能更佳,运算执行效率更好。但当客户程序顺序执行程序,尤其是简单程序时发现STM32F7xx执行时间大于STM32F4xx的执行时间,比如运行下面的同样的测试代码,就有明显差距: 0 X0 ~$ k/ Q% s
31.jpg : L2 i; H4 j6 u1 x6 B$ u
为方便量化时间,使用Timer2计数方式对这段时间进行计数,Timer2运行在90MHz,向上计数,Test_Counter数据用于输出计数数值,增加后代码如下:9 C; e& g: _( Y, z7 f: O" D
32.jpg * q! ]* h$ I6 R$ K- v
33.jpg ! ]; O+ J1 }( c, F0 k+ \5 [0 U
通过上面的修改后测试下来,Test_Counter数据分别为:
9 N9 i' n; `+ }3 USTM32F446 数据为 1543
' Y4 g* ?# \& ySTM32F746 数据为 1836) L  w/ T( A8 K5 D# ?
如果使用Keil自带的States cycles计算方法得到如下数据,后面会按照这个来计算执行时间数据。
$ n" {' {2 E; \3 i" T  T; tSTM32F446 数据为 3009
! H$ x$ w  i; v" {# W! L2 j8 [STM32F746 数据为 3635
+ Y8 P  S9 L  u1 g- M: Y9 P
34.jpg 7 P7 s5 r. F- j2 Q

3 b5 T% e5 A( O% x产生上述问题的原因:
0 H* S1 z4 d- L) s6 m上面的测试都是在使用了Cache以及ART加速方法测得,如果针对STM32F7xx的性能优化可以参考AN4667 "STM32F7 Series system architecture and performance"这篇应用文档的描述,本例已经对文档描述部分做过优化,但问题依然是STM32F7xx速度慢于STM32F4xx。两颗芯片运行同样代码,比较两颗芯片汇编代码也是相同的:: E% Q) ?5 _, h" Q2 ?
36.jpg
* K# p  b0 `: T% m3 {通过查看ARM Cortex-M7内核文档发现下面描述:
" c9 Z2 ~# k8 z$ }7 U
37.jpg
. K5 }) k- u5 T1 e0 J反映到本例中发现定义的i数据为16-bit数据,同样也在汇编代码上发现了STRB这个汇编代码;这样在RMW(read-modify-write)机制下,当定义为byte以及half-word数据时将有一个先读取数据,修改后再写入数据的过程,这个读取-修改-写入的过程正是能够影响到内核执行效率的问题点,如果定义为32-bit就避免了这个问题的发生。
9 r# ^& w" _& O+ c; U9 K7 B
6 Y, Q5 B8 w7 \6 g, T* X/ k3 r& u! j问题解决
+ n1 C! S6 ~8 l0 c! J/ ?/ ?$ e7 ]2 m' h按照文档说明,我们将16-bit定义数据,改为32-bit的定义数据,即:
" ~: c! R& V$ }6 v8 M% V9 r# n
38.jpg % `  f: _+ U3 z0 Q8 b+ s  M

$ k5 m' T) ?( l9 w& e测试下来结果如下:
5 M+ I! L# y# A" |' b+ }- E7 qSTM32F446 数据为 2102
! k  W, c* Q2 t- V! y/ C4 oSTM32F746 数据为 1807# m' }. F  ~- t- _! S" T9 q# Y
可以看到不管是STM32F4xx还是STM32F7xx,当数据定义为32-bit时都有显著的速度提升,当然STM32F7xx的提升更加明显,同样测试条件下STM32F7xx执行时间小于STM32F4xx的执行时间。: U- q( }3 p( M. O4 o5 L

" ?3 Z5 |/ G; y$ ^; e9 A- b深入内核修改1 q7 O" d! }% V. O
因为32-bit数据定义会增加内存,并且有时候定义为byte或halfword更方便,还需要提升速度的话我们看到同样是内核文件给出的说明,可以将RMW机制屏蔽掉:
; E% w4 K, {% q, I
40.jpg
5 b/ h' B8 V- _& V8 `8 J实际上就是对CM7_ITCMCR寄存器的第1位写0, 即可以在程序中有下面的操作:  e; O9 S" h: F  U
41.jpg 7 D0 _& @2 A( G! b. s
禁止RMW后测试下来数据如下:
* U  o4 i) B& s' K16-bit定义数据STM32F746 测试cycles数据为 3022/ Y/ y7 r; P  x6 @
32-bit定义数据STM32F746 测试cycles数据为 18089 R/ g" _* X9 \  |* Z/ B+ H
可以对比上面的测试数据也可以看到当禁止RMW后STM32F7xx性能也是优于STM32F4xx的。2 ?, o7 G6 J9 r. H; g

: m2 ^" \; o& y, B, f1 ^6 L* s$ b3 m2 t具体测试数据如下:0 R/ [% q7 f) I7 w
42.jpg
6 M, x; t% a- s6 @! n9 c/ X! O: \+ B- |  o% n4 I
结论:/ B9 x4 c3 W+ O% |  G6 P
需要提升STM32F7xx执行时间,发挥出最大效能时,请参考AN4667,同时需要注意RMW对内核性能发挥的影响。
+ l5 U/ t. {: W! R8 \( ^  m
" q# d; y/ Y- r) U+ O
8 D/ k9 f8 |) o. \$ `
& S8 m: T8 C* \8 `( p4 n& ~
* w9 m" j$ Y2 L) k! d
RMW(Read_Modify_Write)对STM32F7xx内核运行速度的影响.pdf (433.95 KB, 下载次数: 26)
赞 收藏 2 评论8 发布时间:2016-11-18 16:35

举报

8个回答
creep 回答时间:2016-11-18 16:49:50
纯干货啊,收藏学习,感谢无私分享!
moyanming2013 回答时间:2016-11-18 17:57:39
学习,         
jcx0324 回答时间:2016-11-23 16:19:54
绝对是干货啊
zengyi703-16313 回答时间:2016-11-23 19:36:38
感谢分享
andypanfan 回答时间:2016-11-29 09:04:24
很想有一块  那过来玩玩!!!!
小小超 回答时间:2016-11-29 09:08:38
学习一下。
5265325 回答时间:2016-11-29 09:20:31
tkloveyang 回答时间:2019-1-22 15:54:25
好贴,解答了我之前的困惑

所属标签

相似技术帖

官网相关资源

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