1、中断基础概念:什么是中断、中断的作用、中断与轮询的区别、中断系统的组成

各位同学,咱们今天聊聊中断。说实话,中断这个概念,是嵌入式开发里最基础也最重要的东西之一。我刚开始学单片机那会儿,总觉得中断是个很玄乎的东西——CPU怎么就知道外面有事了?它怎么放下手头的活去处理别的事?处理完了怎么还能回来?

其实说白了,中断没那么神秘。咱们先把它搞明白。

1.1 什么是中断

中断,字面意思就是「打断正在做的事」。CPU正在执行主程序,突然来了个紧急信号,CPU就得暂停当前任务,转去处理这个信号。处理完了,再回来接着干。

我打个比方。你正在看书,电话响了。你放下书,接电话,聊完挂掉,再拿起书继续看。这个过程,就是中断。

  • 电话响 —— 中断请求
  • 放下书 —— 保存现场
  • 接电话 —— 执行中断服务程序
  • 挂电话 —— 恢复现场
  • 继续看书 —— 返回主程序

你看,是不是很好理解?

核心要点:中断是一种硬件机制,它让CPU能够对外部或内部事件做出实时响应。它不是软件轮询那种「主动去看」,而是「被动被通知」。

1.2 中断的作用

中断到底有什么用?我直接说结论:没有中断,很多嵌入式系统根本没法用。

举个例子。你做一个按键检测。如果没有中断,CPU就得不停地去读IO口电平——这叫轮询。CPU大部分时间都在空转,啥正事也干不了。而且按键按下去的那一瞬间,CPU可能刚好在忙别的事,就漏掉了。

中断的作用,我归纳了三点:

  1. 实时响应 —— 外部事件来了,CPU能立刻知道。比如按键按下、串口收到数据、定时器溢出。
  2. 提高效率 —— CPU不用一直盯着某个事件。没中断的时候,CPU可以安心做别的事。
  3. 多任务处理 —— 虽然单片机是单核的,但通过中断,可以模拟出「同时处理多个任务」的效果。

我记得有一次做工业控制项目,要求对编码器脉冲做精确计数。如果用轮询,CPU根本来不及,脉冲频率一高就丢数。后来改用外部中断,每个脉冲来了就触发一次中断,计数精准得很。嗯,这就是中断的威力。

1.3 中断与轮询的区别

很多新手会问:轮询也能检测事件啊,为什么非要用中断?

咱们来对比一下。

对比项 中断 轮询
触发方式 硬件自动触发 软件主动查询
实时性 高,事件发生立即响应 低,取决于查询频率
CPU利用率 高,无事时CPU可做其他工作 低,大量时间浪费在空查询上
编程复杂度 较高,需处理现场保护和优先级 较低,逻辑简单直接
适用场景 实时性要求高、事件不频繁 事件频繁、实时性要求低

你想想看,如果事件每秒发生一次,轮询每秒查1000次,CPU大部分时间都在做无用功。而中断只在事件发生时触发,CPU平时该干嘛干嘛。

我的建议:能用中断的地方尽量用中断。但也不是所有场景都适合。比如串口接收大量数据时,每个字节都中断一次,反而会拖慢系统。这时候用DMA+中断配合,才是正解。

1.4 中断系统的组成

一个完整的中断系统,由哪些部分组成?咱们拆开来看。

1.4.1 中断源

中断源就是「谁发出的中断请求」。常见的中断源有:

  • 外部中断(GPIO引脚电平变化)
  • 定时器中断(定时器溢出或比较匹配)
  • 串口中断(数据接收/发送完成)
  • ADC中断(转换完成)
  • DMA中断(传输完成)

1.4.2 中断控制器

中断控制器是中断系统的「大脑」。它负责:

  • 接收多个中断源的请求
  • 判断优先级
  • 决定哪个中断先被CPU处理
  • 向CPU发送中断信号

在STM32里,这个角色叫NVIC(嵌套向量中断控制器)。它支持中断嵌套——高优先级中断可以打断低优先级中断。这个特性非常实用。

1.4.3 CPU

CPU是执行者。它收到中断信号后,会:

  1. 保存当前正在执行的指令地址(压栈)
  2. 跳转到中断向量表,找到对应的中断服务程序入口
  3. 执行中断服务程序
  4. 执行完毕后,恢复现场(出栈)
  5. 继续执行被中断的程序

1.4.4 中断向量表

中断向量表是一张「地址映射表」。每个中断源对应一个固定的地址,里面存放着中断服务程序的入口地址。CPU根据中断号,直接查表跳转。

注意:我曾经遇到过一个坑——中断向量表配置错了,导致中断触发后程序跑飞。查了两天才发现是链接脚本里向量表地址没对齐。所以,向量表地址一定要按照芯片手册的要求来设置,不能想当然。

1.4.5 中断服务程序(ISR)

ISR就是中断触发后执行的代码。写ISR有几个铁律:

  • 尽量短小 —— 不要在ISR里做复杂运算或延时
  • 不要调用不可重入函数 —— 比如printf、malloc
  • 注意共享资源的保护 —— 主程序和ISR都可能访问的变量,要用volatile修饰

我个人的习惯是:ISR里只做标志位设置或数据搬运,真正的处理逻辑放到主循环里去做。这样能最大程度减少中断对系统实时性的影响。

小结

这一节咱们把中断的基础概念捋了一遍。中断不是什么高深的东西,它就是CPU的一种「应急处理机制」。理解中断,关键是理解它的触发方式、响应流程和系统组成。

下一节,咱们会深入讲中断的优先级管理。那才是真正考验设计能力的地方。你想想看,多个中断同时来了怎么办?高优先级中断能不能打断低优先级中断?中断嵌套会不会导致栈溢出?这些问题,咱们后面一一拆解。