RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响 * n5 o/ D. m+ E0 C; |+ e7 c前言 在客户使用STM32F7xx(Cortex-M7内核)实际测试中,会发现同等主频下STM32F4xx(Cortex-M4)执行同样一段简单程序在时间上要快于STM32F7xx,这个会影响到客户切换到STM32F7xx的信心,也对ST以及ARM宣传上Cortex-M7内核执行时间远快于Cortex-M4内核的说法提出质疑,本文将针对具体案例说明这一情况的产生以及解决办法。7 K5 U' C7 d3 G 问题描述 客户测试复杂程序运行时间,比如同样180MHz主频下,STM32F7xx执行Coremark测试程序时间远小于STM32F4xx的执行时间;也就是STM32F7xx的性能更佳,运算执行效率更好。但当客户程序顺序执行程序,尤其是简单程序时发现STM32F7xx执行时间大于STM32F4xx的执行时间,比如运行下面的同样的测试代码,就有明显差距: 为方便量化时间,使用Timer2计数方式对这段时间进行计数,Timer2运行在90MHz,向上计数,Test_Counter数据用于输出计数数值,增加后代码如下:5 \2 e8 I- V1 T7 w 通过上面的修改后测试下来,Test_Counter数据分别为: STM32F446 数据为 1543 STM32F746 数据为 1836) u7 L" ^, ^! C9 |6 P' D 如果使用Keil自带的States cycles计算方法得到如下数据,后面会按照这个来计算执行时间数据。- x6 m$ H9 i0 |4 d b4 \6 g STM32F446 数据为 3009 STM32F746 数据为 36350 M7 A! S, V, n2 b& G 产生上述问题的原因:- t0 q6 Y9 A' m; ^ 上面的测试都是在使用了Cache以及ART加速方法测得,如果针对STM32F7xx的性能优化可以参考AN4667 "STM32F7 Series system architecture and performance"这篇应用文档的描述,本例已经对文档描述部分做过优化,但问题依然是STM32F7xx速度慢于STM32F4xx。两颗芯片运行同样代码,比较两颗芯片汇编代码也是相同的: 通过查看ARM Cortex-M7内核文档发现下面描述: 反映到本例中发现定义的i数据为16-bit数据,同样也在汇编代码上发现了STRB这个汇编代码;这样在RMW(read-modify-write)机制下,当定义为byte以及half-word数据时将有一个先读取数据,修改后再写入数据的过程,这个读取-修改-写入的过程正是能够影响到内核执行效率的问题点,如果定义为32-bit就避免了这个问题的发生。0 @, ?+ O& n2 | 4 V% z- O" X$ Z- v1 X 问题解决 按照文档说明,我们将16-bit定义数据,改为32-bit的定义数据,即: - `3 w8 Y; E% d/ }+ y 测试下来结果如下:- e* T. ~! R. c0 }/ g r: @+ i STM32F446 数据为 2102! L: F! }4 Q6 S* }: i, b STM32F746 数据为 1807 可以看到不管是STM32F4xx还是STM32F7xx,当数据定义为32-bit时都有显著的速度提升,当然STM32F7xx的提升更加明显,同样测试条件下STM32F7xx执行时间小于STM32F4xx的执行时间。# r2 T5 X, {6 z6 |8 d 深入内核修改) 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* [ 实际上就是对CM7_ITCMCR寄存器的第1位写0, 即可以在程序中有下面的操作:5 H/ o. q8 Y. Q2 k3 A3 F 禁止RMW后测试下来数据如下:0 O( H2 j1 X. N. r 16-bit定义数据STM32F746 测试cycles数据为 3022 32-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 结论:: 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 |
纯干货啊,收藏学习,感谢无私分享! |
学习, |
绝对是干货啊 |
感谢分享 |
很想有一块 那过来玩玩!!!! |
学习一下。 |
好贴,解答了我之前的困惑 |
基于STM32F746G-Discover的扩展电路板
【合集】STM32F7教程、资料大集合
F769 Discovery实现播放U盘音乐的播放器
STM32 VS Code Extension (在Ubuntu上开发STM32,ST官方vscode插件使用指南)
STM32F765@216MHz跑NES模拟器【代码】【视频】
基于STM32F7实现ADC软件触发+轮询采集
基于STM32F7进行ADC采集解决更新问题
基于STM32F7使用定时器经验分享
实现基于STM32F7中周期采集
基于STM32F7中实现采集和中断