[STM32G4] 高效利用 STM32G4:性能提升与代码优化

[复制链接]
64|11
STM新闻官 发表于 2026-6-13 23:14 | 显示全部楼层 |阅读模式
1. 应用需求 STM32G4由于其出色的外设以及中高性能的内核,得到了越来越多的客户认可,成功地应用到了工业、电机控制、数字电源等领域。在开发过程中,如何提升 STM32G4 的运行及计算性能成为越来越多工程师们开发过程中遇到的问题。本文结合文档以及实际测试提出来一些改进措施。

2. 改进性能方法

2.1. 对编译器设置合理的优化等级Arm® 嵌入式编译器执行多种优化,以减少代码大小并提升应用程序性能。不同的优化等级针对不同的优化目标。因此,针对某一目标进行优化会影响其他目标。优化等级总是在这些不同目标之间进行权衡。
4456a2d7172164d1.png
Arm® 嵌入式编译器提供多种优化等级,以控制不同的优化目标。最佳的优化等级取决于具体的应用程序和优化目标。

2.2. 加速对 FLASH 的访问Adaptive real-time memory Accelerator (ART Accelerator)针对 STM32 的 Arm®Cortex®-M4 处理器进行了优化,它平衡了 Arm® Cortex®-M4 处理器与 FLASH 技术之间固有的性能优势,通常 FLASH 需要处理器在较高工作频率下等待对 FLASH 访问。为了释放处理器的全部性能,ART Accelerator实现了指令预取、队列和分支缓存,从而提升对 FLASH 的程序执行速度。Cortex®-M4 通过 ICode 总线获取指令,通过 DCode 总线获取常量/数据。Prefetch 块旨在提高 ICode 总线访问的效率。ICode 总线上的 Prefetch 功能可以在 CPU 请求当前指令线时,同时读取 FLASH 中的下一条顺序指令线。如图 1 所示,通过设置 Flash 访问控制寄存器(FLASH_ACR)中的 PRFTEN 位启用预取功能,同时也可以通过使能 ICEN 位(Instruction cache enable)/DCEN 位(Data cacheenable)来提升对指令/数据的访问速度。

482436a2d71962a6f1.png
2.3. 合理利用 CCM SRAM 如图 2 所示,STM32G4 的 CCM RAM 与 Cortex™ 内核紧密结合。这主要为了以最高的系统时钟频率来执行代码,同时避免出现等待状态。因此,与在 FLASH 中执行代码的情况相比,在 CCM RAM 中运行代码能够大大减少了关键任务的执行时间。当代码位于 CCM RAM 且数据保存在普通 SRAM 当中时,Cortex-M4 内核便处于最优的哈佛配置。
不建议将代码和数据一起放在 CCM RAM 中,因为这样 Cortex 内核将不得不从同一个内存中获取代码和数据,造成总线访问冲突,从而影响效率。具体实现可以参照 AN4296(Use STM32F3/STM32G4 CCM SRAM with IAREmbedded Workbench®, Keil® MDK-ARM, STMicroelectronics STM32CubeIDE andother GNU-based toolchains),内有详细说明。
48476a2d71b1061f2.png
2.4. 代码在 SRAM1 中运行 如图 2 所示,CPU 可以通过系统总线(S-bus)访问 SRAM1。在默认配置下(SYSCFG_MEMRMP),CPU 并不可以通过 I-bus/D-bus 总线访问 SRAM1,除非选择了从 SRAM1 启动(boot from SRAM1)并且配置了物理地址重映射。因此,当代码与数据都在 SRMA1 中时,不一定能提升代码的运行效率,因为这样有可能会造成总线竞争,反而影响执行效率,这点需要注意。2.5. FLASH 的单/双 BANK 模式 在某些具有双 Bank FLASH 功能的 MCU,单双 Bank 的 FALSH 读总线宽度不一样,以STM32G474 为例,• 单 Bank 模式下(DBANK = 0),读总线宽度为 128 bits;• 双 Bank 模式下(DBANK = 1),读总线宽度为 64 bits; 因此,在不需要双 BANK 功能下,可以将 FLASH 配置为单 BANK 模式,以提升代码在FLASH 中运行的效率。可以使用 ST 的工具软件 STM32CubeProgrammer 配置芯片的DBANK 位。

465296a2d732e08030.png
我们使用 NUCLEO-G474 测试一下,使用一个电机控制环路代码进行测试,以下代码是在FALSH 中运行的,当其它条件都不变时,仅仅更改 G474 的选项字节内的 DBANK 配置,可以看到运行结果差异还是很大的。测试结果表明,在单 BANK 模式下,代码运行效率更高
53496a2d733f22825.png
• 单 Bank 模式下(DBANK = 0),环路总消耗 678 cycles 时间;• 双 Bank 模式下(DBANK = 1),环路总消耗 1053 cycles 时间;2.6. 注意使用 MicroLib MicroLib 是一个高度优化的库,专为基于 ARM 的嵌入式应用(用 C 语言编写)设计。与 ARM 编译工具链中包含的标准 C 库相比,MicroLib 在代码大小方面具有显著优势,这对于许多嵌入式系统来说非常重要。但是,需要注意的是,MicroLib 某些函数的执行速度可能比 ARM 编译工具中的标准 C库例程稍慢。简言之,MicroLib 省空间,并不省时间。我们使用 NUCLEO-G474 做一个简单测试,测试一下 memset 函数在是否使用MicroLib 的执行时间。如下图所示,建立一个 flolat 类型数组,大小 2000,用 memset 进行测试。
384096a2d735ec9c3a.png
测试结果表明,当其它条件不变时,仅仅更改编译器的 MicroLib 设置:• 当禁用 MicroLib 时,代码执行时间为 24 us;• 当使用 MicroLib 时,代码执行时间为 188 us ;可以看到这两种编译方式执行时间相差很大,因此要尤其小心使用编译器的 MicroLib 配置。

2.7. 优化程序代码分支的写法

Cortex-M4 处理器采用三级流水线架构,Prefetch 模块旨在提高 ICode 总线访问的效率。ICode 总线的 Prefetch 功能可以在 CPU 请求当前指令线的同时,从 FLASH 中读取下一条顺序指令线。
567146a2d737f3f008.png
如果是顺序执行代码,理论上可以达到 1cycle/指令的吞吐率。但是遇到分支,麻烦就来了,如果分支预测失败,则需要清空流水线 ,丢弃所有错误预取的指令,重新从目标地址开始取指,这就需要消耗额外的时间。但如果存在分支套嵌分支的情况,且一半的分支预测失败,则会导致整段代码的运行效率降低 10%以上。因此,在关键的代码(如环路控制计算),需要优化代码的书写逻辑,在不影响代码功能下,尽量减少代码分支(条件判断)。2

.8. 合理使用内联(inline)函数

内联函数可以用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:把内联函数的函数体在编译器预处理的时候替换到函数调用处,这样代码运行到这里时候,就不需要花时间去调用函数(减少了函数调用过程的入栈和出栈等开销),注意这种替代行为发生在编译阶段而非程序运行阶段。因此,合理使用内联函数可以提升程序的运行速度,避免了函数调用所带来保存现场、变量弹栈和压栈、跳转新函数、存储函数返回值、执行完返回原现场等开销。

3. 小结
对 MCU 优化计算性能是开发者需要面临的主要问题,对 MCU 性能的提升是一个系统工程,这需要开发工程师既要熟悉自己的代码及其算法,又需要熟悉 MCU 的架构以及相应的开发编译环境。本文从以上几个方面提出了对代码优化的方法,以供软件开发人员参考。当然还有其他一些方法:比如优化算法等。 本文对于其它系列 MCU,也可以参照此方法酌情进行优化。
528396a2d73bdd060b.png


CarterERO 发表于 2026-6-14 10:55 | 显示全部楼层
优化代码时,别忘了检查中断服务例程,确保它们尽可能短小,避免在关键路径上占用太多时间。
xiaoqizi 发表于 2026-6-18 10:13 | 显示全部楼层
激活ART加速器,突破Flash访问瓶颈
木木guainv 发表于 2026-6-18 11:58 | 显示全部楼层
将电机控制环路、浮点运算、中断服务程序等高频关键代码放入CCM SRAM,其直接挂载于内核总线,无访问延迟,速度等同内核主频
Jiangxiaopi 发表于 2026-6-18 13:43 | 显示全部楼层
将电机控制环路、浮点运算、中断服务程序等高频关键代码放入CCM SRAM,其直接挂载于内核总线,无访问延迟,速度等同内核主频
荣陶陶 发表于 2026-6-18 15:39 | 显示全部楼层
将PID算法、PWM中断程序放入CCM后,执行时间缩短40%以上
Zuocidian 发表于 2026-6-18 17:23 | 显示全部楼层
单BANK支持128位宽读取,一次读取4条指令;双BANK仅64位宽,一次读取2条指令,性能差距超50%
Zhiniaocun 发表于 2026-6-18 19:05 | 显示全部楼层
电机控制环路中,单BANK平均耗时678周期,双BANK平均耗时1053周期,性能提升显著
Puchou 发表于 2026-6-18 20:50 | 显示全部楼层
量产工程优先采用-O2/-O3/-Ofast,编译器自动执行循环展开、指令重排,实测电机控制代码耗时缩短30%以上;关键算法模块可单独开启-O3,无兼容性问题
Xiashiqi 发表于 2026-6-19 07:37 | 显示全部楼层
Flash资源紧张时选择-Os,兼顾代码体积与运行速度
小海师 发表于 2026-6-19 09:22 | 显示全部楼层
Cortex-M4采用三级流水线,分支预测失败会清空流水线,导致性能损失10%以上
Haizangwang 发表于 2026-6-19 11:05 | 显示全部楼层
使用ST-LINK进行硬件调试,结合逻辑分析仪监测信号时序,通过编译器性能分析工具查看函数耗时、流水线状态,针对性优化热点代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1625

主题

2134

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部
0