2

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

  1. SP 0x0030B840,LR 2000AE78 - LR 指向有效代码,所以我不确定是什么导致了异常,尽管 SP 是假的。我应该查看哪些其他地址、寄存器、内存位置?

  2. SP 0x20D384A8,LR 0x1FFCA59C - SP 正常,LR 是假的。有没有什么我可以做的事后检查来找出LR是如何被压碎的?看起来它从地址空间的末尾向后滚动,但我不知道如何。

现在我只是用模拟替换大块代码并再次运行测试以尝试隔离问题 - 问题是有时需要 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 异常之后的指令 - BLX 如何识别为未定义?注意CPSR是0x00000013,所以这都是ARM模式。但是,R2 是堆区域中的 0x226d2a08,我认为是不正确的 - 分解存在 ANDEQ R0、R0、R12,指令是 0x0000000C,而那里的其他指令对我来说看起来像数据。所以我认为糟糕的R2是问题所在,我只是想了解为什么BLX的Undef?

谢谢!

4

2 回答 2

2

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

至于 SP 或 LR 损坏,可能是您在错误的模式下执行了一些指令,在命中未定义的指令之前损坏了它们。

编辑

在问题的编辑中响应新的错误案例:

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

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

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

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

于 2009-09-02T23:48:25.407 回答
1

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

编辑:

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

于 2009-09-03T21:05:25.570 回答