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

LDMIA instruction results in corrupt register data

我正在尝试 运行 在 ARM Cortex-M3 裸机上编译程序。在系统到达应用程序代码之前,一个奇怪的错误将程序计数器炸毁并出错。

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

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}

并且正在读取的寄存器爆炸。它还会发送程序计数器,从而有效地终止程序。

...
r3             0x2  2
r4             0xffffffff   4294967295
r5             0xffffffff   4294967295
r6             0xffffffff   4294967295
r7             0xffffffff   4294967295
r8             0xffffffff   4294967295
r9             0xffffffff   4294967295
r10            0xffffffff   4294967295
r11            0x0  0
...
pc             0xfffffffe   0xfffffffe

我读过 , but it doesn't seem to be the direct issue that I'm facing here. The ATMEL documentation for this board 快速浏览一下,没有指定对一次读取的内部寄存器数量的限制。

对这个问题有什么想法,如果可能的话,在 gcc 中有一个解决方法来防止它?

说明(及其效果)完全正确。但是spbefore这个指令是绝对错误的。您的芯片在该地址上没有 RAM 内存。事实上——它可能在这个地址根本没有内存。请参阅手册的第 32 页(带有内存映射)。

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

您的 sp 应该在 SRAM 中的某处,所以在 0x20000000 之上。您拥有的值 - 0x7ffe0 位于 "Boot memory" 区域中的某处。如果您想找到问题,请找出 sp 具有无效值的原因。