目标:ARM Cortex-A9
编译:GCC 4.9.2
大家好,
我有一个带有中断服务程序的程序,它处理每200ms周期性发生的中断.ISR本身调用一些子程序,这意味着,它使用链接寄存器LR。
我的ISR正确执行,然而,我的程序在几秒钟后总是崩溃。原因如下:
当主程序使用链接寄存器(BL命令)调用子程序然后被中断时,链接寄存器的内容似乎被中断前的指令地址覆盖。
现在当主程序在ISR之后恢复时,它会执行" BX lr"命令,因为" BL"以前用过。但是,LR已被中断覆盖,因此" BX lr"跳到某个错误的位置。
我知道ISR应该保存上下文并在之后恢复它。但是由于跳转到中断向量似乎已经覆盖了LR,它怎么能被保存呢? (顺便说一句:我看到ISR在开始时将LR-4推到堆栈,并在结束时将其弹出,但它会直接将其弹出到PC并且根本不打算再次向LR写入任何有用的内容)
非常感谢帮助!!