← 返回 计组与微机控制

计组与微机控制

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 中通常把“中断”和“异常”统一纳入异常机制中管理。

9.0 异常和中断的概念以及中断来源和管理 图 1

2. 中断的作用

2.1 并行操作

定义: CPU 可以在主程序运行时,让外设独立工作,外设准备好后再通过中断通知 CPU。

作用:减少 CPU 空等时间,提高系统工作效率

2.2 实时处理

定义: 当外部事件发生时,CPU 可以及时响应,而不是等主程序轮询到它。

作用:适合按键、串口、定时器、传感器脉冲等需要及时响应的场景。

2.3 故障处理

定义: 当系统出现错误或异常状态时,通过异常/中断机制跳转到专门的处理程序。

作用:及时处理硬件错误、访问错误、运行错误等紧急情况。

3. 中断源

定义: 中断源是能够导致 CPU 产生中断或异常响应的事件来源。

9.0 异常和中断的概念以及中断来源和管理 图 2

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 指令、软件触发中断寄存器、设置挂起寄存器等。

9.0 异常和中断的概念以及中断来源和管理 图 3

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