我需要编辑ISR的返回地址。处理完中断后,ISR应返回到特定地址,无论它来自何处。这是为了便于快速重置系统。此功能无法在普通固件中实现,因为时间太紧,无法在某处频繁检查标记。
我已经尝试编辑在异常进入时由ISR保存的堆栈帧,这似乎工作了几毫秒,然后它进入微型“哦,糟糕的东西变坏”状态。在这种状态下,堆栈看起来很正常,并且没有迹象表明出现任何问题。即使我弹出堆栈并将完全相同的数据推回到它上,也会发生这种情况。此外,使用堆栈指针相对存储会导致此失败。
有关异常处理的信息可以找到here,但我找不到足够的信息告诉我哪里出错了。
想法?我真的只需要让中断返回到相同的标签,无论中断在哪里发生,并且没有核心变得繁琐。
谢谢, 斯图尔特
答案 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技术参考手册”中找到更多详细信息。