我在拇指模式下使用STM32L486ZG板.我正在运行一个没有任何RTOS的简单裸机应用程序.我使用FSM将外部SRAM连接到电路板.外部SRAM位于地址0x60000000.系统初始化并以72MHz运行(我已尝试过这个问题,频率从18-80 MHz)现在在我的主要功能中,我有以下代码:
int main(){
asm volatile (
"push {r0}\n"
"mov r0, #0x60000000\n"
"add r0, #0x400\n"
"stmdb r0!, {r1-r12}\n"
"ldmia r0!, {r1-r12}\n"
"pop {r0}\n"
);
}
Run Code Online (Sandbox Code Playgroud)
根据此代码,在执行此main函数后不应更改寄存器,但在以下指令之后不是这种情况
ldmia r0!, {r1-r12}
Run Code Online (Sandbox Code Playgroud)
即r9执行后不正确.stmdb指令工作正常但未正确ldmia加载数据.我通过查看内存中的内容来验证这一点.
这个问题在ldmia指令中的任何参数都是持久的:第9个寄存器总是受到影响.
说明: 假设我正在调试此代码,下一条要执行的指令是:
stmdb r0!, {r1-r12}
Run Code Online (Sandbox Code Playgroud)
加强所有这些寄存器后,已保存在内存和价值r0是0x600003d0
记忆的内容:
0x600003D0 00000000 40021008 0000000C .......@....
0x600003DC 40000000 00000000 00000000 ...@........
0x600003E8 20017FEC 00000000 00000000 ì.. ........
0x600003F4 00000000 00000000 00000000 ............
Run Code Online (Sandbox Code Playgroud)
登记册内容:
r0 0x600003d0
r1 0x00000000
r2 0x40021008
r3 0x0000000c
r4 …Run Code Online (Sandbox Code Playgroud)