手头有一块 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 的相同区域。
|