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 中有一个解决方法来防止它?
说明(及其效果)完全正确。但是sp
值before这个指令是绝对错误的。您的芯片在该地址上没有 RAM 内存。事实上——它可能在这个地址根本没有内存。请参阅手册的第 32 页(带有内存映射)。
您的 sp
应该在 SRAM 中的某处,所以在 0x20000000
之上。您拥有的值 - 0x7ffe0
位于 "Boot memory" 区域中的某处。如果您想找到问题,请找出 sp
具有无效值的原因。
我正在尝试 运行 在 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
我读过
对这个问题有什么想法,如果可能的话,在 gcc 中有一个解决方法来防止它?
说明(及其效果)完全正确。但是sp
值before这个指令是绝对错误的。您的芯片在该地址上没有 RAM 内存。事实上——它可能在这个地址根本没有内存。请参阅手册的第 32 页(带有内存映射)。
您的 sp
应该在 SRAM 中的某处,所以在 0x20000000
之上。您拥有的值 - 0x7ffe0
位于 "Boot memory" 区域中的某处。如果您想找到问题,请找出 sp
具有无效值的原因。