硬件压栈:中断时CPU自动保存8个寄存器,不用你写代码
2026/7/7 3:37:14 网站建设 项目流程

短文标题:硬件压栈:中断时CPU自动保存8个寄存器,不用你写代码

你有没有想过一个问题:中断发生后,CPU怎么记得中断前执行到哪里?硬件帮你记住了。中断响应的第一个时钟周期,硬件自动压栈8个寄存器(32字节)。一行汇编都不用你写。自动压栈的8个寄存器

顺序固定:R0→R1→R2→R3→R12→LR→PC→xPSR。SP递减32字节。压栈过程中断前:SP → 指向栈顶已用数据,中断发生后(第一个时钟周期):SP = SP – 32,硬件将8个寄存器依次存入[SP]... [SP+32],整个压栈过程在中断响应的第一个时钟周期启动,连续存储,不消耗额外指令周期。

硬件压栈 vs 软件压栈

R4~R11怎么办?硬件只自动保存R0-R3、R12、LR、PC、xPSR。R4-R11由编译器处理——如果中断函数用到了这些寄存器,编译器会在函数开头插入PUSH指令保存,函数结尾POP恢复。

中断返回:硬件自动出栈,ISR结尾执行BX LR,LR中存的是EXC_RETURN特殊值(如0xFFFFFFF1)。CPU检测到特殊值,知道是异常返回,启动硬件出栈:从栈弹出之前压入的8个寄存器,恢复PC、xPSR等。不需要POP指令,硬件自动完成。尾链优化:连续中断更快

中断A未退出,中断B已挂起。传统架构:出栈A→压栈B→执行B。Cortex-M尾链:跳过出栈A和压栈B,直接执行B。连续响应仅6个时钟周期。

这个故事的启示,Cortex-M不是用软件一条条PUSH指令保存现场,是硬件在中断响应的第一个时钟周期并行压栈。硬件压栈是ARM中断响应快的核心原因之一。

写在最后,中断发生时,硬件已经帮你做了最繁重的工作。你只需要写中断业务逻辑,现场保护硬件包了。8个寄存器,一键压栈,一键出栈。


(本文灵感源于于振南《新概念ARM32单片机》教程第5.1节、第5.3节。)

觉得有用?点赞、转发,让更多人看懂硬件压栈的中断加速技术。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询