ARM未定义指令错误

时间:2009-09-02 15:15:38

标签: exception debugging arm

运行嵌入式系统时没有未定义指令错误,没有协处理器,没有MMU,Atmel 9263.嵌入式系统的内存范围为0x20000000 - 0x23FFFFFF。到目前为止我有两个案例:

  1. SP 0x0030B840,LR 2000AE78 - LR指向有效代码,所以我不确定导致异常的原因,尽管SP是假的。我应该看一下其他地址,寄存器,存储位置?

  2. SP 0x20D384A8,LR 0x1FFCA59C - SP正常,LR是假的。有什么样的验尸可以让我知道LR是如何被压碎的?看起来它在地址空间的末尾向后滚动,但我无法弄清楚如何。

  3. 现在我只是用模拟替换大块代码并运行测试agin试图找出问题 - 问题有时需要4个小时来显示问题。

    任何提示都会受到赞赏,谢谢!

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

    修改

    Undef Instruct的另一个例子 - 这次SP / LR看起来很好。 LR = 0x2000b0c4,当我在那附近拆卸时:

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

    因为LR是Undef Exception之后的指令 - BLX如何被识别为Undefined?请注意,CPSR为0x00000013,因此这是所有ARM模式。但是,R2是堆区域中的0x226d2a08,我认为是不正确的 - 释放有ANDEQ R0,R0,R12,指令是0x0000000C,其他指令看起来像我的数据。所以我认为糟糕的R2是问题,我只是想了解为什么BLX的Undef?

    谢谢!

2 个答案:

答案 0 :(得分:2)

检查CPSR中的T位。如果您无意中从ARM模式更改为Thumb模式(反之亦然),则会出现未定义的指令。

就SP或LR损坏而言,可能是你在错误的模式下执行了一些指令,在命中未定义的指令之前它们会破坏它们。

修改

在编辑问题时回应新的错误案例:

LR包含来自BLX R2的返回地址,因此它指向BLX之后的一条指令是有意义的。

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

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

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

答案 1 :(得分:1)

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

编辑:

在未定义的异常中,CPSR [4:0]应为0b11011或0x1B不是0x13,0x13是根据臂臂复位。