计组与微机控制
9.0 异常和中断的概念以及中断来源和管理
9.0 异常和中断的概念以及中断来源和管理
本章可以分成两条主线:
微机原理中的中断技术
-> 中断/异常概念 -> 中断源
-> 中断管理 -> 中断优先级
-> 中断向量表 -> 中断过程
Cortex-M 处理器异常
-> 异常源
-> NVIC
-> 屏蔽寄存器
-> 优先级寄存器
-> 向量表重定位
-> 中断响应
-> 中断服务
-> 中断返回
引入:中断/异常本质上是 CPU 暂停当前程序,转去处理更紧急或更特殊事件的一套硬件机制;Cortex-M 把这套机制做成了异常模型,并由 NVIC 统一管理大多数外部中断。
中断的概念
1. 中断与异常的基本概念
1.1 中断
定义:中断是 CPU 与外部设备交换数据、响应外部事件的重要方式之一。
当外部设备发生某一事件时,会向 CPU 发出中断请求信号;CPU 如果允许响应,就暂停当前正在执行的程序,转去执行对应的中断服务程序,处理完后再返回原程序继续执行。
典型例子:
键盘输入,串口接收数据,定时器溢出
外部按键触发,传感器产生脉冲
1.2 异常
定义:异常是程序执行过程中发生的意外事件或特殊事件,使 CPU 暂停正常程序,转去执行对应处理程序。
典型例子:
除法溢出,非法指令,访问非法地址
调试断点,系统调用,硬件错误
1.3 中断与异常的关系
定义: 中断可以看成异常的一种,二者都会使 CPU 转入特殊处理流程。
中断:多数请求来自外部设备,通常是异步发生的。
异常:多数由处理器内核或当前程序执行引发,通常与当前指令执行有关。
Cortex-M 中通常把“中断”和“异常”统一纳入异常机制中管理。

2. 中断的作用
2.1 并行操作
定义: CPU 可以在主程序运行时,让外设独立工作,外设准备好后再通过中断通知 CPU。
作用:减少 CPU 空等时间,提高系统工作效率
2.2 实时处理
定义: 当外部事件发生时,CPU 可以及时响应,而不是等主程序轮询到它。
作用:适合按键、串口、定时器、传感器脉冲等需要及时响应的场景。
2.3 故障处理
定义: 当系统出现错误或异常状态时,通过异常/中断机制跳转到专门的处理程序。
作用:及时处理硬件错误、访问错误、运行错误等紧急情况。
3. 中断源
定义: 中断源是能够导致 CPU 产生中断或异常响应的事件来源。

3.1 硬中断源
定义: 硬中断源通常来自外部硬件设备,通过 CPU 引脚或中断控制器向 CPU 发送请求。
例子:
键盘,鼠标,打印机,定时器,外部传感器
串口接收,I/O 接口
3.2 软中断源
定义: 软中断源通常由 CPU 执行程序过程中产生,不一定来自外部硬件引脚。
例子:
系统调用指令,除法溢出,未定义指令
调试断点,软件触发中断寄存器
3.3 Cortex-M 的中断源分类
Cortex-M 中断源大致可分为:
外部中断 IRQ:
定时器、I/O 端口、通信接口等外设产生。
不可屏蔽中断 NMI:
优先级很高,通常用于严重硬件事件,如看门狗或掉电检测。
SysTick 系统节拍中断:
来自处理器内核的系统定时器。
内核系统异常:
复位、HardFault、MemManage、BusFault、UsageFault 等。
软件中断源:
SVC 指令、软件触发中断寄存器、设置挂起寄存器等。

4. 中断管理
4.1 条件中断与无条件中断
无条件中断: 一旦提出请求,CPU 必须响应,通常不可屏蔽。例如 NMI。
条件中断 CPU 只有在开中断、优先级满足、未被屏蔽等条件满足时才响应。
4.2 中断屏蔽
定义:中断屏蔽是控制 CPU 是否允许响应某类中断或某级别中断的机制。
在 Cortex-M 内核中,常见屏蔽寄存器:
PRIMASK:
屏蔽除 NMI 和 HardFault 之外的所有可屏蔽异常/中断。
FAULTMASK:
屏蔽除 NMI 之外的所有异常/中断。
BASEPRI:
屏蔽某个优先级数值及其以下等级的中断。
注意:
优先级数值越小,实际优先级越高。
BASEPRI 写入某个阈值后,会屏蔽优先级数值大于等于该值的中断。
4.3 中断嵌套
定义: 中断嵌套是指 CPU 正在处理一个中断时,又被更高优先级中断打断,先去处理更高优先级中断。
规则:
高优先级中断可以抢占低优先级中断。
低优先级中断不能抢占高优先级中断。
同级中断一般不能互相抢占。
5. 中断优先级
5.1 优先级的含义*定义: 中断优先级用于决定多个中断同时请求时 CPU 先响应哪一个,以及正在处理一个中断时是否会被另一个中断抢占。
关键规则:
优先级数值越小,优先级越高。
Reset、NMI、HardFault 等系统异常优先级固定,且优先级很高。
多数外部中断的优先级可以编程修改。
5.2 抢占优先级
定义: 抢占优先级决定一个中断能不能打断另一个正在执行的中断。
规则:抢占优先级更高的中断,可以抢占抢占优先级更低的中断。
5.3 子优先级
定义: 子优先级用于在抢占优先级相同、多个中断同时到来时决定先响应谁。
规则:
抢占优先级相同时,子优先级数值小的先响应。
子优先级不能决定中断嵌套,只决定排队顺序。
5.4 中断编号
定义: 中断编号是异常/中断在异常表中的编号,用于计算向量表入口位置。
在 Cortex-M 中:
异常编号 1~15: 系统异常。
异常编号 16 及以上:外部中断输入 IRQ。
CMSIS 中外部中断编号通常从 0 开始,对应异常编号:
异常编号 = 外部中断 IRQ 编号 + 16
