LDMIA指令导致寄存器数据损坏

时间:2017-02-26 10:09:56

标签: c gcc assembly gdb cortex-m3

我试图在ARM Cortex-M3裸机上运行已编译的程序。在系统到达应用程序代码之前,奇怪的错误会导致程序计数器消失并出错。

在指令之前,寄存器被观察为:

<input onKeyPress={onEnter(doSomething)} />

以下说明名义上执行:

r0             0x0  0
r1             0x1  1
r2             0x0  0
r3             0x2  2
r4             0x18564  99684
r5             0x18418  99352
r6             0x0  0
r7             0x0  0
r8             0x8311   33553
r9             0x0  0
r10            0x0  0
r11            0x0  0
r12            0xc84404 13124612
sp             0x7ffe0  0x7ffe0
lr             0x80df   32991
pc             0x8380   0x8380

正在读取的寄存器爆炸。它还以有效终止程序的方式发送程序计数器。

0x829c <__call_exitprocs+112>:  ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}

我已经阅读了a similar issue on stack overfflow,但它似乎并不是我在这里面临的直接问题。 The ATMEL documentation for this board并未快速指定对一次读取的内部寄存器数量的限制。

关于这个问题的任何想法,如果可能的话,还有gcc的解决方法来阻止它?

1 个答案:

答案 0 :(得分:2)

指令(及其效果)绝对正确。但是此指令之前的sp 是完全错误的。您的芯片在该地址上没有RAM内存。事实上 - 在这个地址可能根本就没有记忆。请参见手册第32页(带有存储器映射)。

http://www.atmel.com/Images/Atmel-6430-32-bit-Cortex-M3-Microcontroller-SAM3U4-SAM3U2-SAM3U1_Datasheet.pdf

您的sp应位于SRAM中的某个位置,因此高于0x20000000。您拥有的值 - 0x7ffe0位于&#34;启动内存&#34;区域。如果您想找到问题,请找出sp无效值的原因。