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

7nbnzgx9  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(103)

我需要编辑ISR的返回地址。中断处理后,ISR应返回到特定地址,而不管中断来自何处。这是为了便于快速系统复位。此功能无法在普通固件中实现,因为时间太紧,无法频繁检查某个位置的标志。
我试过编辑ISR在异常进入时保存的堆栈帧,它似乎工作了几毫秒,然后它进入了micro的“哦,糟糕,有些东西坏了”状态。在这种状态下,堆栈看起来很正常,没有任何出错的迹象。即使我弹出堆栈并将完全相同的数据推回堆栈,也会发生这种情况。此外,使用堆栈指针相对存储也会导致此故障。
有关异常处理的信息可以在here中找到,但我找不到足够的信息来告诉我出了什么问题。
想法?我真的只需要让中断返回到相同的标签,而不管中断在哪里命中,并且没有核心变得挑剔。
谢谢,斯图尔特

vdgimpew

vdgimpew1#

  • 警告一句 *:这个项目是用汇编语言编写,有很多假设。这个过程在C或汇编语言中可能是不安全的,因为当中断发生时,您并不确切知道CPU的状态。

在处理了一段时间的堆栈帧之后,我意识到保存的状态寄存器(xPSR)有一些在操作期间没有设置的位。结果发现,有时在LDM或STM命令的中间触发中断。Cortex-M3具有保存这些命令状态的功能,以便正确恢复这些命令。当它将从中断返回到我指定的位置,期望完成一个LDM/STM命令,但无法完成时,出现了问题。
为了解决这个问题,我只需要清除堆栈帧中保存的状态寄存器中的ICI位。这使得Cortex-M3“忘记”它正在处理LDM/STM命令,并允许处理器返回任意位置,而不会产生任何后果。

nlejzf6q

nlejzf6q2#

您可以通过设置应用中断和复位控制寄存器(地址0xE000ED0C)中的SYSRESETREQ(位2)进行复位。
在C中,我写道:

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

字符串
这可能是一个比你正在尝试的其他方法更干净的重置。
您可以在ARM的Cortex M3技术参考手册中找到更多详细信息。

相关问题