Gcc ARM低电平中断处理-我的链接寄存器被终止

Gcc ARM低电平中断处理-我的链接寄存器被终止,gcc,arm,interrupt,interrupt-handling,Gcc,Arm,Interrupt,Interrupt Handling,目标:手臂皮质-A9 编译器:GCC 4.9.2 各位好, 我有一个带有中断服务程序的程序,它处理每200ms周期性发生的中断。ISR本身调用一些子程序,这意味着它使用链接寄存器LR 我的ISR执行正确,但是,我的程序总是在几秒钟后崩溃。原因如下: 当主程序使用链接寄存器(BL命令)调用子例程,然后被中断时,链接寄存器的内容似乎在中断前被指令地址覆盖 现在,当主程序在ISR后恢复时,它会执行“BX lr”命令,因为以前使用过“BL”。但是,LR已被中断覆盖,因此“BX LR”跳到错误的位置 我理

目标:手臂皮质-A9
编译器:GCC 4.9.2

各位好,

我有一个带有中断服务程序的程序,它处理每200ms周期性发生的中断。ISR本身调用一些子程序,这意味着它使用链接寄存器LR

我的ISR执行正确,但是,我的程序总是在几秒钟后崩溃。原因如下:

当主程序使用链接寄存器(BL命令)调用子例程,然后被中断时,链接寄存器的内容似乎在中断前被指令地址覆盖


现在,当主程序在ISR后恢复时,它会执行“BX lr”命令,因为以前使用过“BL”。但是,LR已被中断覆盖,因此“BX LR”跳到错误的位置

我理解ISR应保存上下文并在事后恢复。但是,既然跳转到中断向量似乎已经覆盖了LR,那么如何保存它呢?
(顺便说一句:我看到ISR在开始时将LR-4推到堆栈中,并在结束时将其弹出,但它直接将其弹出到PC,并且根本不需要再向LR写入任何有用的内容)


非常感谢您的帮助

“当主程序在ISR后恢复时,它执行“BX lr”命令”-你的意思是你从未从IRQ模式返回异常?!嗯,这里有个问题。记住,LR在两种模式之间倾斜,它不会被“覆盖”。ARM倾斜
sp
LR
用于中断。此外,它还有一种称为“IRQ”的特殊模式(在cpsr中)。有另一个“spsr”可以从被中断的内容中保存。您必须在IRQ处理程序的开始处“分配了IRQ堆栈”和/或将模式从IRQ切换到系统。同样,像ldmdb sp、{r0-lr}^或其他一些序列必须恢复所有用户寄存器和模式。这里的'lr'是'lr_irq',它是中断前的指令(除非您有先发制人的操作系统)。你的操作系统是什么和/或给出一个简单的例子。您不能只编写“C”例程。