2017-02-26 124 views
0

我试图在ARM Cortex-M3裸机上运行已编译的程序。在系统甚至达到应用程序代码之前,奇怪的错误将程序计数器吹走并出错。LDMIA指令导致寄存器数据损坏

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

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 

我读过a similar issue on stack overfflow,但它似乎并没有是我在这里面临的直接问题。 The ATMEL documentation for this board没有指定一个快速浏览一次读取的内部寄存器数量的限制。

对这个问题有任何想法,如果可能的话,在gcc的一个解决方法,以防止它?

+0

'ldmia'从堆栈中加载,并且没有显示堆栈中的内容。如果堆栈中的数据损坏,该指令可能会正常运行。 – Jester

+0

拇指指令不允许除Thumb2(armv7m)扩展名外的许多寄存器。假设您的文本来自反汇编程序,反汇编程序不会显示所有这些寄存器。正如你自己指出的那样,电脑坏了,所以ldmia正在修改电脑,而Jester指出的电脑可能是坏的。在指令前转储堆栈并查看它包含的内容。 –

+0

只有'sp 0x7ffe0'在指令前很重要,不确定为什么你发布了其他寄存器。你不是想要做一个“推入堆栈”'stmia'吗?如果不是,那么在此之前的代码必须已经将足够的值放入堆栈。 – Ped7g

回答

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位于“引导内存”区域中的某个位置。如果你想找到问题,找出为什么sp具有无效值。

相关问题