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

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

[复制链接]
zero99 发布时间:2016-11-18 16:35
RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响3 C( @( J2 v4 J( K' w
0 D! |" i, t7 ^5 a
前言
: N7 T. L$ i8 ~1 b在客户使用STM32F7xx(Cortex-M7内核)实际测试中,会发现同等主频下STM32F4xx(Cortex-M4)执行同样一段简单程序在时间上要快于STM32F7xx,这个会影响到客户切换到STM32F7xx的信心,也对ST以及ARM宣传上Cortex-M7内核执行时间远快于Cortex-M4内核的说法提出质疑,本文将针对具体案例说明这一情况的产生以及解决办法。
% Q1 Z, h* t% W0 v% T/ L  M- u8 M0 O
& _5 |% W( y& w0 a) k, u! j* v( K3 p/ [
问题描述7 g% w( {# _: n3 O; O, ?# R" z
客户测试复杂程序运行时间,比如同样180MHz主频下,STM32F7xx执行Coremark测试程序时间远小于STM32F4xx的执行时间;也就是STM32F7xx的性能更佳,运算执行效率更好。但当客户程序顺序执行程序,尤其是简单程序时发现STM32F7xx执行时间大于STM32F4xx的执行时间,比如运行下面的同样的测试代码,就有明显差距:
) c: j5 q9 D' B$ l3 W
31.jpg
# C' o9 h0 l1 H5 a% i8 l8 P为方便量化时间,使用Timer2计数方式对这段时间进行计数,Timer2运行在90MHz,向上计数,Test_Counter数据用于输出计数数值,增加后代码如下:" ?4 V7 Q# ]5 e$ W/ }$ z* M$ ^/ ~/ |
32.jpg
- w& e, [. V- Y) _4 D: v8 n" B% ]5 I
33.jpg ! u$ n& K8 J0 }* a( s1 j* ?
通过上面的修改后测试下来,Test_Counter数据分别为:
$ q' L) ^+ y# N. i+ N/ m$ [; X3 ySTM32F446 数据为 1543
5 a4 L) G2 p, o* y* r  J' j- XSTM32F746 数据为 1836
7 y9 G0 y+ {2 H如果使用Keil自带的States cycles计算方法得到如下数据,后面会按照这个来计算执行时间数据。
" |; s2 a" Q/ Z, \: s  b$ g2 gSTM32F446 数据为 3009
. A4 s' z- J7 |, OSTM32F746 数据为 3635
: \+ T" G' X6 f7 o1 j
34.jpg ! k/ {) V& t, }) S1 r) v* F
9 V9 o* W9 ]1 j
产生上述问题的原因:
7 U* q6 P1 ~9 x上面的测试都是在使用了Cache以及ART加速方法测得,如果针对STM32F7xx的性能优化可以参考AN4667 "STM32F7 Series system architecture and performance"这篇应用文档的描述,本例已经对文档描述部分做过优化,但问题依然是STM32F7xx速度慢于STM32F4xx。两颗芯片运行同样代码,比较两颗芯片汇编代码也是相同的:6 p6 n6 m$ Z8 w4 N1 q% c
36.jpg
0 y3 Q. x: P/ g通过查看ARM Cortex-M7内核文档发现下面描述:
! q5 P9 j" B, F/ r
37.jpg
& j: H$ o5 P6 `8 x- x2 k反映到本例中发现定义的i数据为16-bit数据,同样也在汇编代码上发现了STRB这个汇编代码;这样在RMW(read-modify-write)机制下,当定义为byte以及half-word数据时将有一个先读取数据,修改后再写入数据的过程,这个读取-修改-写入的过程正是能够影响到内核执行效率的问题点,如果定义为32-bit就避免了这个问题的发生。
8 M9 I% ~8 F! A% |" Y8 k" C: h
2 M2 x# t5 z0 H' Y+ i问题解决; Q( B  F9 d$ j# O  C2 c' }
按照文档说明,我们将16-bit定义数据,改为32-bit的定义数据,即:+ v4 x1 p! n& Y  x2 }' A
38.jpg # i3 I; c& W! r' B% W% l1 C, f
# s9 i8 n$ E4 G* [" R
测试下来结果如下:
5 O! L. K, h6 s$ P: j+ ^. O& K6 t, PSTM32F446 数据为 2102
; V& H% S$ U) x& p8 O+ @- k6 P; e" DSTM32F746 数据为 1807
* D5 J9 ?. F/ B" s9 A5 v$ m可以看到不管是STM32F4xx还是STM32F7xx,当数据定义为32-bit时都有显著的速度提升,当然STM32F7xx的提升更加明显,同样测试条件下STM32F7xx执行时间小于STM32F4xx的执行时间。
$ {/ {- G) M3 B5 [8 K
% h5 \0 `2 r! n: g$ \  F7 U( U2 y深入内核修改
1 a) J% G& X' P& |( q6 i! \0 ?8 T- W因为32-bit数据定义会增加内存,并且有时候定义为byte或halfword更方便,还需要提升速度的话我们看到同样是内核文件给出的说明,可以将RMW机制屏蔽掉:+ L& p  n( t  p2 O2 v, j
40.jpg 2 W2 H/ t( n8 r+ j
实际上就是对CM7_ITCMCR寄存器的第1位写0, 即可以在程序中有下面的操作:
, X2 p. N/ E. u) `9 O) W
41.jpg
9 j3 {- e6 o5 {/ H5 i- f9 j禁止RMW后测试下来数据如下:
( {5 Z' u; k! s3 _) D16-bit定义数据STM32F746 测试cycles数据为 30227 _# d) I( d- F5 H/ t# h
32-bit定义数据STM32F746 测试cycles数据为 1808
" z' V( K3 \" @/ K可以对比上面的测试数据也可以看到当禁止RMW后STM32F7xx性能也是优于STM32F4xx的。$ k9 b! _3 {4 m8 ?5 }7 k% @
8 m4 w3 O7 u6 G! {( H. ]6 x
具体测试数据如下:" C4 S$ x6 q. y* o$ D6 F/ P: d4 I
42.jpg 3 ]% V  I% _, H  H, h

: y6 J9 G: p: w9 f结论:
7 j- w  H7 W/ z; }" V3 w需要提升STM32F7xx执行时间,发挥出最大效能时,请参考AN4667,同时需要注意RMW对内核性能发挥的影响。- u6 z4 ]( G/ Z% G
% Z8 D3 T- t% d/ g4 Y1 @, ?8 e

: s7 |, h, X" B! ^' {! R" b) d' z2 J$ |, z- ]0 H' s
' i% W- f+ S! B8 h. V# V: \* A5 y: 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 手机版