Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Cortex-M3:更改中断返回地址_Assembly_Arm_Interrupt_Cortex M3 - Fatal编程技术网

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

Assembly Cortex-M3:更改中断返回地址,assembly,arm,interrupt,cortex-m3,Assembly,Arm,Interrupt,Cortex M3,我需要编辑ISR的返回地址。无论中断来自何处,ISR都应在中断处理后返回到特定地址。这有助于快速重置系统。此功能无法在普通固件中实现,因为时间太紧,无法经常检查某个地方的标志 我尝试过编辑ISR在异常输入时保存的堆栈帧,它似乎工作了几毫秒,然后它进入了micro的“噢,该死,有些东西坏了”状态。在这种状态下,堆栈看起来正常,没有任何迹象表明出现了任何问题。即使我弹出堆栈并将完全相同的数据推回到堆栈上,也会发生这种情况。此外,使用堆栈指针相对存储也会导致此故障 可以找到有关异常处理的信息,但我找不

我需要编辑ISR的返回地址。无论中断来自何处,ISR都应在中断处理后返回到特定地址。这有助于快速重置系统。此功能无法在普通固件中实现,因为时间太紧,无法经常检查某个地方的标志

我尝试过编辑ISR在异常输入时保存的堆栈帧,它似乎工作了几毫秒,然后它进入了micro的“噢,该死,有些东西坏了”状态。在这种状态下,堆栈看起来正常,没有任何迹象表明出现了任何问题。即使我弹出堆栈并将完全相同的数据推回到堆栈上,也会发生这种情况。此外,使用堆栈指针相对存储也会导致此故障

可以找到有关异常处理的信息,但我找不到足够的信息来告诉我出了什么问题

想法?我真的只需要让中断返回到同一个标签,而不管中断在哪里,并且不让核心变得过于挑剔

谢谢, 斯图尔特

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

在处理堆栈帧一段时间后,我意识到保存的状态寄存器(xPSR)设置了一些在操作过程中没有设置的位。事实证明,中断有时是在LDM或STM命令的中间进行的。Cortex-M3具有保存这些命令状态的功能,以便可以正确恢复这些命令。当它从中断返回到我的指定位置,期望完成LDM/STM命令,但无法完成时,出现了问题


为了解决这个问题,我只需要清除堆栈帧中保存的状态寄存器中的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周围有很多模拟和数字外设,芯片运行这些东西所执行的启动代码(我真的,真的不想搞砸)可能需要太长时间。