2009-09-02 64 views
1

运行嵌入式系统,无协处理器,无MMU,Atmel 9263时出现未定义指令错误。嵌入式系统的内存范围为0x20000000 - 0x23FFFFFF。我已经有两个起这样的:ARM未定义指令错误

  1. SP 0x0030B840,LR 2000AE78 - 在有效的代码LR点,所以我不知道是什么原因导致的异常,虽然SP是伪造的。我应该看看还有哪些其他地址,寄存器,内存位置?

  2. SP 0x20D384A8,LR 0x1FFCA59C - SP正常,LR是假的。我能做些什么来验证LR是如何被粉碎的?看起来它从地址空间的末端向后滚动,但我无法弄清楚。

现在我只是模拟更换大块的代码并运行测试阿恩,试图找出问题 - 问题是有时需要4个小时,显示的问题。

任何提示将不胜感激,谢谢!

芯片是AT91SAM9263,我们正在使用IAR EWARM工具链。我很确定它是直的ARM,但我会检查。

EDIT

的未定义指令的另一个例子 - 此时SP/LR看起来很好。 LR = 0x2000b0c4,当我拆卸附近有:

2000b0bc e5922000 LDR R2,[R2,#+ 0]
2000b0c0 e12fff32 BLX R2
2000b0c4 e1b00004 MOVS R0,R4

因为LR是指令遵循Undef异常 - BLX如何被识别为未定义?请注意,CPSR是0x00000013,所以这是所有ARM模式。然而,R2是0x226d2a08,它在堆区,我认为是不正确的 - 拆分有ANDEQ R0,R0,R12,指令是0x0000000C,其他指令看起来像数据给我。所以我认为不好的R2是问题,我只是想了解为什么Undef在BLX上?

谢谢!

+1

1.)您能否给我们提供整个评估套件/ SoC的名称? 你说的9263,所以我认为Atmel AT91SAM9263。 2.)你有没有针对正确的指令集版本? 如果是上述芯片组,则将ARM9作为拱门系列 和ARMv5作为指令集版本。在调用arm-gcc时将这些设置为 -mcpu =和-march =。 3.)你使用ARM和Thumb还是ARM? – 2009-09-02 16:03:40

+0

你可以发布一些数据/说明,包括r14地址(有问题的说明)。 – 2009-09-03 13:33:52

+0

谢谢 - 请参阅我的最新编辑 – Jeff 2009-09-03 14:49:33

回答

1

检查CPSR中的T位。如果您无意中从ARM模式切换到Thumb模式(反之亦然),则会发生未定义的指令。

只要SP或LR被损坏,就可能是您执行了一些错误模式的指令,在触发未定义的指令之前就会破坏它们。

编辑

应对新的错误情况下,问题的编辑:

LR包含从BLX R2返回地址,所以之后的是有道理的,它指向一个指令BLX。

如果R2在执行BLX R2时指向堆,那么您将跳入堆并开始执行数据,就好像它们是指令一样。这将在短时间内导致未定义的指令异常...

如果您想查看未定义的确切指令,请查看R14_und寄存器(在您处于未定义指令处理程序时定义的) - 它包含未定义指令之后的下一条指令的地址。

根本原因是R2中的错误值。假设这是C代码,我的猜测是一个糟糕的指针取消引用,但我需要确认源代码。

+0

CPSR = 0x00000013这意味着ARM模式,对吧? – Jeff 2009-09-03 14:34:12

+0

是的,第5位是T位,0代表ARM。 – Brent 2009-09-03 22:05:41

1

这是一个未定义的指令或数据中止,因为您正在读取未对齐的地址?

编辑:

在未定义例外CPSR [4:0]应该0b11011或0x1B不0×13,0×13是根据臂臂复位。