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

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

[复制链接]
zero99 发布时间:2016-11-18 16:35
RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响
/ G. y6 j4 |& U: }- W7 l# ?

' A, L9 v- K+ I, l0 d8 Q7 a& @前言
( V( q# ?$ y( X1 m6 m: D9 L0 _- c在客户使用STM32F7xx(Cortex-M7内核)实际测试中,会发现同等主频下STM32F4xx(Cortex-M4)执行同样一段简单程序在时间上要快于STM32F7xx,这个会影响到客户切换到STM32F7xx的信心,也对ST以及ARM宣传上Cortex-M7内核执行时间远快于Cortex-M4内核的说法提出质疑,本文将针对具体案例说明这一情况的产生以及解决办法。
1 g, D# |  Y4 \% v, p- p- n8 p" }5 d* A( ?+ g

) r# Q2 q, ]& @8 _$ e5 y* `问题描述/ P! _; x0 t7 t- F
客户测试复杂程序运行时间,比如同样180MHz主频下,STM32F7xx执行Coremark测试程序时间远小于STM32F4xx的执行时间;也就是STM32F7xx的性能更佳,运算执行效率更好。但当客户程序顺序执行程序,尤其是简单程序时发现STM32F7xx执行时间大于STM32F4xx的执行时间,比如运行下面的同样的测试代码,就有明显差距: 0 N0 X6 ]% y1 `
31.jpg 7 y  `& r" q; X8 V7 {. F5 [" s
为方便量化时间,使用Timer2计数方式对这段时间进行计数,Timer2运行在90MHz,向上计数,Test_Counter数据用于输出计数数值,增加后代码如下:
7 _! e0 }+ N9 z* j: h3 {' V& O) s
32.jpg
' G+ u9 P7 h; B3 P% D& ^; |
33.jpg + b& y% a3 f, h1 x5 ^
通过上面的修改后测试下来,Test_Counter数据分别为:2 ]: P: X- W+ K6 e* m, F, n/ u! m
STM32F446 数据为 1543# i* x0 R! n! a$ q& w/ y
STM32F746 数据为 1836
# {# u/ w% n2 J$ l6 d9 g如果使用Keil自带的States cycles计算方法得到如下数据,后面会按照这个来计算执行时间数据。
: v9 w6 V, j0 z% ASTM32F446 数据为 3009
4 |' {" X7 b0 ~, _STM32F746 数据为 3635
+ s- L: {- n# B: v
34.jpg ! Q  _" u  b1 I
. a) b! J- u5 ?
产生上述问题的原因:
' D' ~, I- F- V& d- {0 {上面的测试都是在使用了Cache以及ART加速方法测得,如果针对STM32F7xx的性能优化可以参考AN4667 "STM32F7 Series system architecture and performance"这篇应用文档的描述,本例已经对文档描述部分做过优化,但问题依然是STM32F7xx速度慢于STM32F4xx。两颗芯片运行同样代码,比较两颗芯片汇编代码也是相同的:2 I9 H- ?0 i4 j9 |- h) L
36.jpg
; @2 P  ]$ c: J% k0 l( g$ j% g" G通过查看ARM Cortex-M7内核文档发现下面描述:
; n  A& l7 U/ p
37.jpg 6 j! L# z1 v* ]: F! h* e: v3 D2 I2 V& O; U+ k
反映到本例中发现定义的i数据为16-bit数据,同样也在汇编代码上发现了STRB这个汇编代码;这样在RMW(read-modify-write)机制下,当定义为byte以及half-word数据时将有一个先读取数据,修改后再写入数据的过程,这个读取-修改-写入的过程正是能够影响到内核执行效率的问题点,如果定义为32-bit就避免了这个问题的发生。
( H7 m! X9 h% S/ X$ d6 G2 m: L/ g6 d9 f! G% G- L. n; \! j0 h
问题解决
& s6 S2 @! Y/ G" |按照文档说明,我们将16-bit定义数据,改为32-bit的定义数据,即:
4 b$ q8 c% t- Z7 s1 d# T* N
38.jpg 9 S4 M6 P7 v2 l( P: _# c- _# t

# @; E2 Z5 w4 g1 [" v测试下来结果如下:
. w  N7 W% X" I/ v' |0 ]STM32F446 数据为 2102* v$ e' j8 P3 L- b$ ?: a
STM32F746 数据为 1807
& B: t, I* N: {" K& F; @可以看到不管是STM32F4xx还是STM32F7xx,当数据定义为32-bit时都有显著的速度提升,当然STM32F7xx的提升更加明显,同样测试条件下STM32F7xx执行时间小于STM32F4xx的执行时间。+ M+ G* {$ I: {- W, C5 ~
) q7 N$ D/ d7 i' C
深入内核修改
& D4 T" l% f5 J$ W9 c' A因为32-bit数据定义会增加内存,并且有时候定义为byte或halfword更方便,还需要提升速度的话我们看到同样是内核文件给出的说明,可以将RMW机制屏蔽掉:
1 x+ x7 Y( q& S8 R( y1 M, P
40.jpg ' z, {& W* v+ S8 m& m
实际上就是对CM7_ITCMCR寄存器的第1位写0, 即可以在程序中有下面的操作:) S* h" V; Y' k1 _8 @# ]5 _
41.jpg
4 h. P( G$ h; J1 Z2 ~; V: P禁止RMW后测试下来数据如下:8 i# o# r" }/ g% u! w
16-bit定义数据STM32F746 测试cycles数据为 3022
$ W" u: N0 K( O. z6 B32-bit定义数据STM32F746 测试cycles数据为 1808; j' W) B! e* {0 u
可以对比上面的测试数据也可以看到当禁止RMW后STM32F7xx性能也是优于STM32F4xx的。
- p5 e+ [+ _7 K3 E( u$ q- {
+ l) x, T! N4 ]5 w1 X& n+ Y7 p具体测试数据如下:
" Y1 Q7 }  Q0 T. ~4 K5 d
42.jpg ) h; S1 j+ J2 ~7 X8 y% l7 |5 _( C

6 Z6 F$ S1 r7 o6 \7 [* N/ e结论:  j& ]: V: w% z" m( H
需要提升STM32F7xx执行时间,发挥出最大效能时,请参考AN4667,同时需要注意RMW对内核性能发挥的影响。$ y. Z# M$ R/ _. t. y
+ \9 s! t" D, a' ]

$ {5 |: D! E. c& R+ c, ?9 J% J# k
1 U+ t0 F1 o0 h9 D% N' ^

8 \6 [+ |9 h: J% t 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 手机版