STMCU小助手
发布时间:2022-2-26 16:17
|
前言 在客户使用 STM32F7xx(Cortex-M7 内核)实际测试中,会发现同等主频下 STM32F4xx(Cortex-M4)执行同样一段简单程序在时间上要快于 STM32F7xx,这个会影响到客户切换到 STM32F7xx 的信心,也对 ST 以及 ARM 宣传上 Cortex-M7 内核执行时间远快于 Cortex-M4 内核的说法提出质疑,本文将针对具体案例说明这一情况的产生以及解决办法。$ D) {7 x% t8 |: [# P 问题描述 客户测试复杂程序运行时间,比如同样 180MHz 主频下,STM32F7xx 执行 Coremark 测试程序时间远小于 STM32F4xx 的执行时间;也就是 STM32F7xx 的性能更佳,运算执行效率更好。但当客户程序顺序执行程序,尤其是简单程序时发现STM32F7xx 执行时间大于 STM32F4xx 的执行时间,比如运行下面的同样的测试代码,就有明显差距:
通过上面的修改后测试下来,Test_Counter 数据分别为: STM32F446 数据为 1543 STM32F746 数据为 18368 h0 e5 X! ~- _0 r8 M; q. ? 如果使用 Keil 自带的 States cycles 计算方法得到如下数据,后面会按照这个来计算执行时间数据。 STM32F446 数据为 3009' x0 @2 G1 H5 N5 m+ U STM32F746 数据为 36352 M6 f5 S& c) O
产生上述问题的原因:3 j- F, O( G& C 上面的测试都是在使用了 Cache 以及 ART 加速方法测得,如果针对 STM32F7xx 的性能优化可以参考 AN4667 "STM32F7 Series system architecture and performance"这篇应用文档的描述,本例已经对文档描述部分做过优化,但问题依然是STM32F7xx 速度慢于 STM32F4xx。两颗芯片运行同样代码,比较两颗芯片汇编代码也是相同的:
1 S3 I! K6 ? Z; w6 | 通过查看 ARM Cortex-M7 内核文档发现下面描述:$ m( N- \, n8 G' M* g
反映到本例中发现定义的 i 数据为 16-bit 数据,同样也在汇编代码上发现了 STRB 这个汇编代码;这样在 RMW(readmodify-write机制下,当定义为 byte 以及 half-word 数据时将有一个先读取数据,修改后再写入数据的过程,这个读取-修改-写入的过程正是能够影响到内核执行效率的问题点,如果定义为 32-bit 就避免了这个问题的发生。 9 L+ _2 `: m: w: ~$ Q) [% Z ( h9 e$ e( G( r4 c- S $ y% W0 o" G, O0 ]% J& p+ J 问题解决 按照文档说明,我们将 16-bit 定义数据,改为 32-bit 的定义数据,即$ U( M! P' O9 V4 }3 c* _
STM32F446 数据为 2102 STM32F746 数据为 1807 可以看到不管是 STM32F4xx 还是 STM32F7xx,当数据定义为 32-bit 时都有显著的速度提升,当然 STM32F7xx 的提升更加明显,同样测试条件下 STM32F7xx 执行时间小于 STM32F4xx 的执行时间。 ( _, l6 ^1 W) B* E* G7 ` , t8 Y7 s& B. G8 e+ d+ m! r/ b6 D 深入内核修改 因为 32-bit 数据定义会增加内存,并且有时候定义为 byte 或 halfword 更方便,还需要提升速度的话我们看到同样是内核文件给出的说明,可以将 RMW 机制屏蔽掉:" Y) \; f# }: m" U3 N2 i- ], n % J( v- z1 }+ {' G 3 Z7 Q% ~5 x$ `4 \
实际上就是对 CM7_ITCMCR 寄存器的第 1 位写 0, 即可以在程序中有下面的操作:
禁止 RMW 后测试下来数据如下: 16-bit 定义数据 STM32F746 测试 cycles 数据为 3022/ R, H; g8 S2 f 32-bit 定义数据 STM32F746 测试 cycles 数据为 1808, {- B% Q: F* f6 X. F 可以对比上面的测试数据也可以看到当禁止 RMW 后 STM32F7xx 性能也是优于 STM32F4xx 的。 具体测试数据如下:
结论: 需要提升 STM32F7xx 执行时间,发挥出最大效能时,请参考 AN4667,同时需要注意 RMW 对内核性能发挥的影响 3 p [- R# t2 X7 R6 V 3 t6 T6 q6 X5 P3 P9 V; R8 L 1 G. D0 H$ u0 E5 ^; c3 ` * a9 _/ h3 F3 B' |2 A - u( E9 q! k- _# O ' p& X2 J4 x! _9 z ) Z' f; Y2 b# f9 q + [8 S6 h' m8 g& f |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版