Cortex-M3:更改中断返回地址

时间:2012-03-01 23:54:40

标签: assembly arm interrupt cortex-m3

我需要编辑ISR的返回地址。处理完中断后,ISR应返回到特定地址,无论它来自何处。这是为了便于快速重置系统。此功能无法在普通固件中实现,因为时间太紧,无法在某处频繁检查标记。

我已经尝试编辑在异常进入时由ISR保存的堆栈帧,这似乎工作了几毫秒,然后它进入微型“哦,糟糕的东西变坏”状态。在这种状态下,堆栈看起来很正常,并且没有迹象表明出现任何问题。即使我弹出堆栈并将完全相同的数据推回到它上,也会发生这种情况。此外,使用堆栈指针相对存储会导致此失败。

有关异常处理的信息可以找到here,但我找不到足够的信息告诉我哪里出错了。

想法?我真的只需要让中断返回到相同的标签,无论中断在哪里发生,并且没有核心变得繁琐。

谢谢, 斯图尔特

2 个答案:

答案 0 :(得分:4)

警告 :此项目是使用很多的假设在程序集中编写的。在C或汇编中,这个过程可能不安全,因为当中断命中时你不确切知道CPU的状态。

在搞乱堆栈帧一段时间之后,我意识到保存的状态寄存器(xPSR)有一些我在运行期间未设置的位设置。事实证明,中断有时会在LDM或STM命令的中间触发。 Cortex-M3具有保存这些命令状态的功能,以便可以正确恢复它们。当它从中断返回到我指定位置的期望完成LDM / STM命令时出现问题,但是不能。

为了解决这个问题,我只需要清除堆栈帧中保存状态寄存器中的ICI位。这使得Cortex-M3“忘记”它正在处理LDM / STM命令,并允许处理器返回任意位置而没有后果。

答案 1 :(得分:2)

您可以通过在应用程序中断和复位控制寄存器(地址0xE000ED0C)中设置SYSRESETREQ(第2位)来进行复位。

在C中,我写道:

// Reset by setting SYSRESETREQ
SCB->AIRCR = 0x05FA0004;

这可能比你正在尝试的其他方法更清晰。

您可以在ARM的“Cortex M3技术参考手册”中找到更多详细信息。