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

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

[复制链接]
zero99 发布时间:2016-11-18 16:35
RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响
3 o0 t. o/ J1 X; W* W+ b. d+ a, s
* n5 o/ D. m+ E0 C; |+ e7 c
前言
+ Y% t1 I( m. j2 [) S6 Z在客户使用STM32F7xx(Cortex-M7内核)实际测试中,会发现同等主频下STM32F4xx(Cortex-M4)执行同样一段简单程序在时间上要快于STM32F7xx,这个会影响到客户切换到STM32F7xx的信心,也对ST以及ARM宣传上Cortex-M7内核执行时间远快于Cortex-M4内核的说法提出质疑,本文将针对具体案例说明这一情况的产生以及解决办法。7 K5 U' C7 d3 G

1 a( n, S; G5 n( {$ e
1 a6 I  C9 R3 d" ^: J问题描述
8 F1 D. Q; Y4 n  t; @客户测试复杂程序运行时间,比如同样180MHz主频下,STM32F7xx执行Coremark测试程序时间远小于STM32F4xx的执行时间;也就是STM32F7xx的性能更佳,运算执行效率更好。但当客户程序顺序执行程序,尤其是简单程序时发现STM32F7xx执行时间大于STM32F4xx的执行时间,比如运行下面的同样的测试代码,就有明显差距:
4 S; X7 N5 ^! ?& {3 O
31.jpg
2 ]+ O* s, K( s9 s3 U4 |1 _. f为方便量化时间,使用Timer2计数方式对这段时间进行计数,Timer2运行在90MHz,向上计数,Test_Counter数据用于输出计数数值,增加后代码如下:5 \2 e8 I- V1 T7 w
32.jpg ! V' u/ h" n; T0 N* M6 f
33.jpg
+ V! I- i0 {- u- p. Z2 H1 c5 K) O通过上面的修改后测试下来,Test_Counter数据分别为:
9 f9 |% p3 d  R- K  uSTM32F446 数据为 1543
) s- H0 P3 @( x- S' KSTM32F746 数据为 1836) u7 L" ^, ^! C9 |6 P' D
如果使用Keil自带的States cycles计算方法得到如下数据,后面会按照这个来计算执行时间数据。- x6 m$ H9 i0 |4 d  b4 \6 g
STM32F446 数据为 3009
: r& X# Z5 E3 l; z0 ^9 J$ X5 Y: CSTM32F746 数据为 36350 M7 A! S, V, n2 b& G
34.jpg
5 ^3 R0 c# o' D0 W# @+ P
3 q& k/ q% g" V+ ?* k产生上述问题的原因:- t0 q6 Y9 A' m; ^
上面的测试都是在使用了Cache以及ART加速方法测得,如果针对STM32F7xx的性能优化可以参考AN4667 "STM32F7 Series system architecture and performance"这篇应用文档的描述,本例已经对文档描述部分做过优化,但问题依然是STM32F7xx速度慢于STM32F4xx。两颗芯片运行同样代码,比较两颗芯片汇编代码也是相同的:
* o# n' Y$ j2 S" J- H7 _
36.jpg
7 R- n/ T5 \3 B. j. D5 s通过查看ARM Cortex-M7内核文档发现下面描述:
, G; f5 `) U' ~* Q
37.jpg
- b% F; s! i4 c  Z% \反映到本例中发现定义的i数据为16-bit数据,同样也在汇编代码上发现了STRB这个汇编代码;这样在RMW(read-modify-write)机制下,当定义为byte以及half-word数据时将有一个先读取数据,修改后再写入数据的过程,这个读取-修改-写入的过程正是能够影响到内核执行效率的问题点,如果定义为32-bit就避免了这个问题的发生。0 @, ?+ O& n2 |
4 V% z- O" X$ Z- v1 X
问题解决
, D8 Q$ ^0 e0 n# [7 l按照文档说明,我们将16-bit定义数据,改为32-bit的定义数据,即:
' k0 }0 m4 ~. h. e9 q7 l
38.jpg 0 E+ P+ D6 u+ ~8 Q
- `3 w8 Y; E% d/ }+ y
测试下来结果如下:- e* T. ~! R. c0 }/ g  r: @+ i
STM32F446 数据为 2102! L: F! }4 Q6 S* }: i, b
STM32F746 数据为 1807
/ R+ T& M& l7 G( Z8 [! z  W% ~可以看到不管是STM32F4xx还是STM32F7xx,当数据定义为32-bit时都有显著的速度提升,当然STM32F7xx的提升更加明显,同样测试条件下STM32F7xx执行时间小于STM32F4xx的执行时间。# r2 T5 X, {6 z6 |8 d

- s% i! g% s/ e1 }7 b3 @/ t深入内核修改) a0 _- f- E& {, q6 i! N4 E  R
因为32-bit数据定义会增加内存,并且有时候定义为byte或halfword更方便,还需要提升速度的话我们看到同样是内核文件给出的说明,可以将RMW机制屏蔽掉:6 g8 @3 b+ b* H" \* F0 b8 H% a$ ?6 C, U* [
40.jpg ' [* k+ c6 K, M8 N" ~) Y
实际上就是对CM7_ITCMCR寄存器的第1位写0, 即可以在程序中有下面的操作:5 H/ o. q8 Y. Q2 k3 A3 F
41.jpg 5 J: f% a* {$ a: S
禁止RMW后测试下来数据如下:0 O( H2 j1 X. N. r
16-bit定义数据STM32F746 测试cycles数据为 3022
: b$ C* {" Y& d32-bit定义数据STM32F746 测试cycles数据为 1808. C6 G0 G: X0 Y! S9 d
可以对比上面的测试数据也可以看到当禁止RMW后STM32F7xx性能也是优于STM32F4xx的。$ W9 ?# E2 s  s7 f& |, B6 y
5 E1 \" Q9 A/ t/ [# \# `4 r
具体测试数据如下:( V1 s5 E) s/ j1 W" _; N
42.jpg
. `* {5 o" }0 h0 D* U
3 L# d* ]& P1 D0 o结论:: L4 s$ [1 G- |9 D1 X/ Y3 |2 x
需要提升STM32F7xx执行时间,发挥出最大效能时,请参考AN4667,同时需要注意RMW对内核性能发挥的影响。* }8 x# W& L5 \/ b
2 _2 ]' e  X6 }/ W$ u) _
- W) m# y- p; K) i  S  A
6 B, M5 F* X7 i8 C6 }) F1 Q$ z
  g* ]. e2 o" y+ ?' Y+ T( ~. q9 P
RMW(Read_Modify_Write)对STM32F7xx内核运行速度的影响.pdf (433.95 KB, 下载次数: 24)
收藏 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版