ARM低级中断处理 - 我的链接寄存器被杀死

时间:2016-02-03 14:27:45

标签: gcc arm interrupt interrupt-handling

目标: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写入任何有用的内容)

非常感谢帮助!!

0 个答案:

没有答案