我需要编辑ISR的返回地址。无论中断来自何处,ISR都应在处理中断后返回到特定地址。这是为了便于快速系统重置。该功能不能在普通固件中实现,因为定时太紧,无法频繁地检查某处的标志。
我试过编辑ISR在异常进入时保存的堆栈框架,这似乎工作了几毫秒,然后它进入了micro的“哦,见鬼,有些东西变坏了”状态。在这种状态下,堆栈看起来很正常,并且没有任何错误的迹象。即使我弹出堆栈并将完全相同的数据推回到堆栈上,也会发生这种情况。此外,使用堆栈指针相对存储会导致此故障。
有关异常处理的信息可以在here上找到,但我找不到足够的信息来告诉我出了什么问题。
想法?我真的只需要让中断返回到相同的标签,而不管中断在哪里命中,并且不会让内核变得如此繁琐。
谢谢,斯图尔特
发布于 2012-03-03 02:39:32
A word of warning:这个项目是用lot的假设用汇编编写的。这个过程在C或汇编中可能是不安全的,因为你不知道当中断发生时CPU的确切状态是什么。
在摆弄堆栈帧一段时间后,我意识到保存的状态寄存器(xPSR)设置了一些我在操作过程中没有看到的位。原来,中断有时是在LDM或STM命令执行过程中触发的。Cortex-M3具有保存这些命令状态的功能,以便正确恢复这些命令。当它从中断返回到我指定的位置,期望完成LDM/STM命令,但无法完成时,就会出现问题。
为了解决这个问题,我只需清除堆栈帧中保存的状态寄存器中的ICI位。这使得Cortex-M3“忘记”它正在处理LDM/STM命令,并允许处理器返回到任意位置而不会产生任何后果。
发布于 2012-03-03 02:44:51
通过设置应用中断和复位控制寄存器(addess 0xE000ED0C)中的SYSRESETREQ (位2),可以进行复位。
在C语言中,我写道:
// Reset by setting SYSRESETREQ
SCB->AIRCR = 0x05FA0004;与你正在尝试的其他方法相比,这可能是一个干净得多的重置。
您可以在ARM的Cortex M3技术参考手册中找到更多详细信息。
https://stackoverflow.com/questions/9526077
复制相似问题