[STM32F7] STM32F746 时序异常问题。

[复制链接]
Hitomi22 发表于 2025-8-27 22:57 | 显示全部楼层 |阅读模式
手头有一块 Nucleo-F746 开发板,发现了一个无法解释的代码执行时间异常现象。

运行的代码非常简单:
unsigned int j = 750000;
while(j--)
     ;
本质上是一个空循环,仅用于消耗时间。当我在开发板上运行并通过 SysTick 计时器测量时,使用 Atollic True Studio、STMCubeIDE (v1.8.0) 和 Segger Embedded Studio 三种工具构建运行的结果各不相同。其中 STMCubeIDE 下的循环运行耗时是其他两种环境的两倍。

这并非代码优化问题,因为三个工具生成的循环汇编代码完全一致运行时已禁用中断:
loop:
ldr    r3,[sp, #4]
subs   r2,r3,#1
str    r2,[sp, #4]
cmp    r3,#0
bne.n  loop
我没有使用 IDE 自带的代码,而是自行完成了所有初始化工作,包括配置 STM32 时钟系统、初始化 SysTick 计时器、缓存及预取指等。所有 IDE 环境中的代码完全一致,且已验证系统时钟等寄存器配置结果完全相同。

更奇怪的是:在 STMCubeIDE 环境下运行时,循环计数变量存储在 DTCM 内存的栈中,而在 Embedded Studio 中则位于 SRAM1。两种情况下代码本身都运行在 FLASH 的相同区域。

麻花油条 发表于 2025-8-28 14:56 | 显示全部楼层
测试DTCM与SRAM的读写延迟,若DTCM明显更慢,说明其配置异常。
duo点 发表于 2025-8-28 14:57 | 显示全部楼层
检查链接脚本中栈的分配位置与其他IDE是否一致。
onlycook 发表于 2025-8-28 14:57 | 显示全部楼层
禁用调试信息生成。
七毛钱 发表于 2025-8-28 14:58 | 显示全部楼层
若必须使用DTCM,检查是否需要调整等待状态
内政奇才 发表于 2025-8-28 14:58 | 显示全部楼层
检查编译器优化选项,所有IDE的优化级别需要一致,避免因优化导致行为差异。
海滨消消 发表于 2025-8-28 14:59 | 显示全部楼层
最可能的原因是STMCubeIDE的默认链接脚本将栈分配到DTCM,但未正确优化DTCM的访问时序,而其他IDE默认将栈放在SRAM1。
豌豆爹 发表于 2025-8-28 14:59 | 显示全部楼层
统一内存布局,修改STMCubeIDE的链接脚本,将栈分配到SRAM1
麻花油条 发表于 2025-8-28 15:00 | 显示全部楼层
通过逻辑分析仪或调试器观察循环变量的访问时序。
星辰大海不退缩 发表于 2025-8-28 23:38 | 显示全部楼层
在 STMCubeIDE 环境下运行时,循环计数变量存储在 DTCM 内存的栈中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

47

帖子

0

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