ARM Cortex-M异常入口和堆栈框架

时间:2017-03-09 06:43:06

标签: exception-handling arm cpu-architecture cortex-m

ARM Cortex-M内核文档说,在异常条目堆栈框架执行时。这导致寄存器R0,R1,R2,R3,R12,LR,PC,xPSR被推到当前堆栈上。 我的问题是为什么这种方式只推动那些寄存器而不是所有的上下文?例如,如果某些数据位于R5寄存器中,则异常处理程序使用该寄存器时将覆盖该数据。

异常处理程序本身的编译函数会推送一些寄存器(以及所有其他常规函数,因为异常处理函数没有区别),但经过大量调试后我发现事实并非总是如此,因为不同的变体寄存器被推送然后恢复。

1 个答案:

答案 0 :(得分:9)

  

为什么这种方式只推送那些寄存器而不是全部   上下文

改善中断响应时间。堆栈操作越少意味着处理程序可以更快地启动。

  

例如,如果某些数据在R5寄存器中,则会被覆盖   如果异常处理程序使用该寄存器。

然后处理程序负责保存R5。

  

异常处理程序本身的编译功能会推送一些寄存器   (以及其他所有常规函数,因为异常处理程序   功能没有区别)

那是故意的。被调用的函数必须保留与中断处理程序(R4-R11和SP)相同的寄存器集。因此,如果普通函数想要使用R5,它必须将其保存在某处并稍后恢复(有关详细信息,请参阅Procedure Call Standard for the ARM® Architecture)。这样,编译器就可以像处理普通函数一样处理中断函数。

  

并非总是如此,因为寄存器的不同变化是   推,然后恢复。

如果编译的函数覆盖R4-R11范围内的寄存器而不保存和恢复它,或者没有正确恢复PC或SP,则编译器会中断,周期。