Cortex-M 中断机制基础

Cortex-M 处理器针对嵌入式实时系统的特点,提供了高效、硬件自动化的中断响应机制,使得中断函数能够直接使用 C 语言编写,而无需传统的汇编"中断入口/出口"代码。

1. 寄存器概览

寄存器 名称 说明
R0--R12 通用寄存器 用于存放数据和中间结果
R13 (SP) 栈指针 指向当前栈顶。Cortex-M 有两种栈指针: • MSP (Main Stack Pointer):复位后默认使用,用于中断和特权级任务 • PSP(Process Stack Pointer):用于线程模式的普通任务
R14 (LR) 链接寄存器 存储函数调用的返回地址。当主函数调用子函数时,下一条指令地址会保存到 LR
R15 (PC) 程序计数器 指向即将执行的指令地址

2. C 语言函数调用机制(普通函数)

Cortex-M 遵循 AAPCS(ARM Procedure Call Standard) 调用约定:

  • R0--R3:用于传递函数参数和返回值,调用子函数时,这些寄存器的值可以被覆盖。
  • R4--R11:被调用者若使用这些寄存器,必须先入栈,返回前再恢复。
  • LR(R14):保存返回地址。

3. 中断调用机制

在某些传统 MCU(如 ARM7)中,中断发生时,CPU不会自动保存 R0--R3,因此中断函数通常需要用汇编手动压栈和出栈,保证现场保护。

Cortex-M 通过硬件自动压栈机制,大大简化了中断编写流程。

当中断发生时,硬件会自动将以下寄存器压入当前使用的栈(MSP 或 PSP)中:

  • R0--R3
  • R12
  • LR(调用时的链接寄存器)
  • PC(中断触发时的下一条指令地址)
  • xPSR(程序状态寄存器)

这一过程称为 自动堆栈(Exception Entry Stacking)

✅ 因此,在 Cortex-M 上,中断服务函数可以直接用 C 语言编写,无需手工保存现场。

复制代码
void SysTick_Handler(void) {
    // 这里可以安全地使用 R0--R3
    // 进入中断时硬件已经自动压栈
}

4. 中断返回机制

为了区分"普通函数调用返回"和"中断返回",Cortex-M 在中断进入时会修改 LR 的值为一个特殊标志(例如 0xFFFFFFF90xFFFFFFFD),用于指示返回路径。

当中断服务函数执行 BX LR 时,硬件检测到这个特殊 LR 值,就会自动触发 异常返回(Exception Return) 流程:

  • 从栈中弹出之前保存的 PC、LR、R0--R3 等寄存器
  • 恢复中断前的 CPU 状态
  • 跳转回中断前的代码继续执行
相关推荐
大聪明-PLUS7 小时前
Linux 上的 GitOps:使用 Git 进行无缝基础设施管理
linux·嵌入式·arm·smarc
大聪明-PLUS21 小时前
嵌入式 Linux 初学者指南 – 第 2 部分
linux·嵌入式·arm·smarc
普中科技4 天前
【普中STM32F1xx开发攻略--标准库版】-- 第 13 章 STM32 位带操作
stm32·单片机·嵌入式硬件·arm·gpio·普中科技·位带操作
大聪明-PLUS4 天前
io_uring:Linux 上的高性能异步 I/O
linux·嵌入式·arm·smarc
普中科技4 天前
【普中STM32F1xx开发攻略--标准库版】-- 第 12 章 STM32 时钟系统
stm32·单片机·嵌入式硬件·arm·时钟树·普中科技
大聪明-PLUS5 天前
从 C 到 C++20 协程编写方法的演变。第一部分:函数 + 宏 = 协程
linux·嵌入式·arm·smarc
大聪明-PLUS5 天前
3 个诊断 Linux 服务器的脚本
linux·嵌入式·arm·smarc
大聪明-PLUS7 天前
使用 GitLab CI/CD 为 Linux 创建 RPM 包(一)
linux·嵌入式·arm·smarc
大聪明-PLUS7 天前
使用 GitLab CI/CD 为 Linux 构建 RPM 包(二)
linux·嵌入式·arm·smarc
酷飞飞8 天前
GD32F407VE天空星开发板的188数码管
stm32·单片机·嵌入式硬件·mcu·arm