所以我在我们的 arm9 系统上遇到了“预取中止”异常。这个系统没有 MMU,所以这可能是软件问题吗?所有的寄存器对我来说似乎都是正确的,从 JTAG 的角度来看,代码看起来是正确的(没有损坏)。
现在我在想这是某种硬件问题(虽然我不想这么说——硬件一直都很好)。
你得到的异常到底是什么?
上次这种情况发生在我身上时,我有一段时间误入歧途,因为我没有意识到 ARM“预取中止”是指指令预取,而不是数据预取,而且我只是在玩数据预取指令。它只是意味着程序试图跳转到一个不存在的内存位置。(实际问题是我在引导加载程序中将“go 81000000”错误地输入为“go 81000”。)
也可以看看:
预取中止触发的地址是什么。这可能是因为程序计数器(PC 或 R15)被设置为在您的微控制器上无效的地址(即使您没有使用 MMU,也可能发生这种情况 - 微控制器的地址空间可能有“漏洞”它将触发预取中止)。如果您尝试预取不正确对齐的地址,也可能发生这种情况,但我认为这取决于微控制器的实现(ARM ARM 将行为列为“UPREDICTABLE”)。
CPU实际上是否处于中止模式?如果它正在执行预取处理程序但未处于中止模式,则意味着某些代码正在通过预取中止向量分支,通常通过地址 0x0000000c 但控制器通常允许重新映射向量地址。