Assembly Cortex-M3:更改中断返回地址
我需要编辑ISR的返回地址。无论中断来自何处,ISR都应在中断处理后返回到特定地址。这有助于快速重置系统。此功能无法在普通固件中实现,因为时间太紧,无法经常检查某个地方的标志 我尝试过编辑ISR在异常输入时保存的堆栈帧,它似乎工作了几毫秒,然后它进入了micro的“噢,该死,有些东西坏了”状态。在这种状态下,堆栈看起来正常,没有任何迹象表明出现了任何问题。即使我弹出堆栈并将完全相同的数据推回到堆栈上,也会发生这种情况。此外,使用堆栈指针相对存储也会导致此故障 可以找到有关异常处理的信息,但我找不到足够的信息来告诉我出了什么问题 想法?我真的只需要让中断返回到同一个标签,而不管中断在哪里,并且不让核心变得过于挑剔 谢谢, 斯图尔特一句警告的话:这个项目是用大量的假设写成的。在C或汇编语言中,这个过程可能是不安全的,因为在C或汇编语言中,当中断发生时,您不确切地知道CPU的状态 在处理堆栈帧一段时间后,我意识到保存的状态寄存器(xPSR)设置了一些在操作过程中没有设置的位。事实证明,中断有时是在LDM或STM命令的中间进行的。Cortex-M3具有保存这些命令状态的功能,以便可以正确恢复这些命令。当它从中断返回到我的指定位置,期望完成LDM/STM命令,但无法完成时,出现了问题Assembly Cortex-M3:更改中断返回地址,assembly,arm,interrupt,cortex-m3,Assembly,Arm,Interrupt,Cortex M3,我需要编辑ISR的返回地址。无论中断来自何处,ISR都应在中断处理后返回到特定地址。这有助于快速重置系统。此功能无法在普通固件中实现,因为时间太紧,无法经常检查某个地方的标志 我尝试过编辑ISR在异常输入时保存的堆栈帧,它似乎工作了几毫秒,然后它进入了micro的“噢,该死,有些东西坏了”状态。在这种状态下,堆栈看起来正常,没有任何迹象表明出现了任何问题。即使我弹出堆栈并将完全相同的数据推回到堆栈上,也会发生这种情况。此外,使用堆栈指针相对存储也会导致此故障 可以找到有关异常处理的信息,但我找不
为了解决这个问题,我只需要清除堆栈帧中保存的状态寄存器中的ICI位。这使Cortex-M3“忘记”它正在处理LDM/STM命令,并允许处理器返回任意位置而不产生任何后果。您可以通过在应用程序中断和复位控制寄存器(ADDES 0xE000ED0C)中设置SYSRESETREQ(位2)进行复位 在C中,我写道:
// Reset by setting SYSRESETREQ
SCB->AIRCR = 0x05FA0004;
这可能比您正在尝试的另一种方法更干净
您可以在ARM的Cortex M3技术参考手册中找到更多详细信息。您是否可以跳转到重置向量,而不是从ISR返回?应该可以编写一个函数,将大部分CPU状态恢复到类似于重置时的状态,然后跳转。我确实编写了ISR。我不想完全重置该部分,因为存在大量不应重做的通信初始化。我可以从中断跳转到想要的代码位置,但是中断将永远被处理,并且不会再次被触发。您是否记得将地址的LSB设置为1(对于Thumb模式)?是的,Thumb位始终设置为1。您为什么使用assembly?C在M3上非常好,GCC是免费的。没有足够的程序空间?系统重置请求方法看起来比中断返回地址编辑更干净,但我不确定请求系统重置会对该芯片产生什么影响。CM3周围有很多模拟和数字外设,芯片运行这些东西所执行的启动代码(我真的,真的不想搞砸)可能需要太长时间。