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

问题描述 投票:0回答:1

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

进入MemManage Fault处理程序时,发生故障之前的PC和我需要的所有信息都存储在堆栈中。因此,我认为我可以简单地恢复它们以返回到先前的执行点。

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

如何返回故障处理程序之前的程序点?我也尝试过弹出PC,但是它不起作用,我认为问题是CPSR无法正确还原。

arm handler stm32
1个回答
2
投票

[当Cortex M7进入异常处理程序时,执行上下文将按以下方式保存,并且当退出处理程序时当然会恢复执行上下文(来自ARM Cortex M7编程手册):

enter image description here

如您所见,从异常返回后,将恢复xPSR。

此外

故障是例外的子集。

您可以做一个简单的测试:故意取消引用无效的指针。它将触发HardFault。修改您的HardFault处理程序,使其仅返回而不执行任何操作。您可以检查上下文是否已还原。我在STM32H753上尝试过,它工作正常,xPSR最新位(ISR_NUMBER)的确为0(线程模式)。

不过请注意:我不知道MemManage,但是HardFault返回触发错误的同一条指令(而不是像常规异常一样返回到以下指令)。这意味着您将在Hardfault之后再次执行相同的指令。

© www.soinside.com 2019 - 2024. All rights reserved.