我在运行嵌入式系统、无协处理器、无 MMU、Atmel 9263 时收到未定义指令错误。嵌入式系统的内存范围为 0x20000000 - 0x23FFFFFF。目前为止我遇到过两个案例:
SP 0x0030B840,LR 2000AE78 - LR指向有效代码,所以我不确定是什么导致了异常,尽管SP是假的。我还应该查看哪些其他地址、寄存器、内存位置?
SP 0x20D384A8,LR 0x1FFCA59C - SP 没问题,LR 是假的。我可以做一些事后分析来找出LR是如何被压垮的吗?看起来它从地址空间的末尾向后滚动,但我不知道如何。
现在我只是用模拟替换大块代码并再次运行测试来尝试隔离问题 - 问题是有时需要 4 个小时才能显示问题。
任何提示都将不胜感激,谢谢!
芯片是AT91SAM9263,我们使用的是IAR EWARM工具链。我很确定它是直接的 ARM,但我会检查一下。
EDIT
Undef Instruct 的另一个例子 - 这次 SP/LR 看起来不错。 LR = 0x2000b0c4,当我在附近拆解时:
2000b0bc e5922000 LDR R2,[R2,#+0]
2000b0c0 e12fff32 BLX R2
2000b0c4 e1b00004 MOVS R0、R4
由于 LR 是 Undef 异常之后的指令 - BLX 如何识别为 Undefined?注意CPSR是0x00000013,所以这都是ARM模式。但是,R2是0x226d2a08,位于堆区域中,我认为这是不正确的-反汇编有ANDEQ R0,R0,R12,指令是0x0000000C,那里的其他指令对我来说看起来像是数据。所以我认为糟糕的R2是问题所在,我只是想理解为什么Undef在BLX?
thanks!
检查 CPSR 中的 T 位。如果您无意中从 ARM 模式更改为 Thumb 模式(反之亦然),则会出现未定义的指令。
至于 SP 或 LR 被损坏,可能是因为您以错误的模式执行了一些指令,从而在命中未定义的指令之前损坏了它们。
EDIT
回应问题编辑中的新错误情况:
LR 包含 BLX R2 的返回地址,因此它指向 BLX 之后的一条指令是有意义的。
如果执行 BLX R2 时 R2 指向堆,您将跳转到堆并开始执行数据,就像它们是指令一样。这将在短时间内导致未定义的指令异常......
如果您想查看未定义的确切指令,请查看 R14_und 寄存器(在未定义指令处理程序中定义) - 它包含未定义指令之后的下一条指令的地址。
根本原因是 R2 的值不好。假设这是 C 代码,我的猜测是一个错误的指针取消引用,但我需要查看源代码才能确定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)