ARM Cortex-M内核文档说,在异常条目堆栈框架执行时。这导致寄存器R0,R1,R2,R3,R12,LR,PC,xPSR被推到当前堆栈上。
我的问题是为什么这种方式只推动那些寄存器而不是所有的上下文?例如,如果某些数据位于R5寄存器中,则异常处理程序使用该寄存器时将覆盖该数据。
异常处理程序本身的编译函数会推送一些寄存器(以及所有其他常规函数,因为异常处理函数没有区别),但经过大量调试后我发现事实并非总是如此,因为不同的变体寄存器被推送然后恢复。
答案 0 :(得分:9)
为什么这种方式只推送那些寄存器而不是全部 上下文
改善中断响应时间。堆栈操作越少意味着处理程序可以更快地启动。
例如,如果某些数据在R5寄存器中,则会被覆盖 如果异常处理程序使用该寄存器。
然后处理程序负责保存R5。
异常处理程序本身的编译功能会推送一些寄存器 (以及其他所有常规函数,因为异常处理程序 功能没有区别)
那是故意的。被调用的函数必须保留与中断处理程序(R4-R11和SP)相同的寄存器集。因此,如果普通函数想要使用R5,它必须将其保存在某处并稍后恢复(有关详细信息,请参阅Procedure Call Standard for the ARM® Architecture)。这样,编译器就可以像处理普通函数一样处理中断函数。
并非总是如此,因为寄存器的不同变化是 推,然后恢复。
如果编译的函数覆盖R4-R11范围内的寄存器而不保存和恢复它,或者没有正确恢复PC或SP,则编译器会中断,周期。