如何退出 ARM 故障处理程序?

How do I exit from a ARM fault handler?

我正在使用 STM32F746,这是一款基于 ARM cortex-M7 的处理器。我正在尝试做一些骇人听闻的事情,这需要我从 MemManage 故障处理程序 return 到程序。

当进入MemManage Fault handler时,故障前的PC和我需要的一切都存储在堆栈中。所以我想我可以简单地将它们恢复到 return 到以前的执行点。

但是,我无法正确恢复 xPSR。 错误处理程序之前的前一个 CPSR 保存在堆栈中,所以我尝试使用 MSR 指令恢复它。 MSR, xpsr, r12MSR, apsr, r12 我都试过了 但是,它只会恢复标志而不是 CPSR 的其他部分,例如 GE 或系统模式位。 (而且我的模式位似乎也很奇怪。我的 xPSR 显示为:0x61070004,但是 this 告诉我最后 5 位不能是 0x04

如何回到故障处理程序之前的程序点?我也尝试弹出电脑,但它不起作用,我认为问题是 CPSR 没有得到正确恢复。

当 Cortex M7 进入异常处理程序时,执行上下文保存如下,当然在退出处理程序时恢复(来自 ARM Cortex M7 编程手册):

如您所见,xPSR 在 return 异常后恢复。

此外

faults are a subset of the exceptions.

您可以做一个简单的测试:故意解除对无效指针的引用。它将触发 HardFault。将您的 HardFault 处理程序修改为 return 并且什么也不做。您可以检查上下文是否已恢复。我试过STM32H753,它工作正常,xPSR最新位(ISR_NUMBER)确实是0(线程模式)。

不过要小心:我不知道 MemManage 但 HardFault returns 是触发错误的同一指令(而不是像常规异常那样的后续指令)。这意味着您将在 Hardfault 之后再次执行相同的指令。