如何退出 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, r12
和 MSR, 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 之后再次执行相同的指令。
我正在使用 STM32F746,这是一款基于 ARM cortex-M7 的处理器。我正在尝试做一些骇人听闻的事情,这需要我从 MemManage 故障处理程序 return 到程序。
当进入MemManage Fault handler时,故障前的PC和我需要的一切都存储在堆栈中。所以我想我可以简单地将它们恢复到 return 到以前的执行点。
但是,我无法正确恢复 xPSR
。
错误处理程序之前的前一个 CPSR
保存在堆栈中,所以我尝试使用 MSR 指令恢复它。
MSR, xpsr, r12
和 MSR, 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 之后再次执行相同的指令。