1、中断基础概念:什么是中断、中断的作用、中断与轮询的区别、中断系统的组成
各位同学,咱们今天聊聊中断。说实话,中断这个概念,是嵌入式开发里最基础也最重要的东西之一。我刚开始学单片机那会儿,总觉得中断是个很玄乎的东西——CPU怎么就知道外面有事了?它怎么放下手头的活去处理别的事?处理完了怎么还能回来?
其实说白了,中断没那么神秘。咱们先把它搞明白。
1.1 什么是中断
中断,字面意思就是「打断正在做的事」。CPU正在执行主程序,突然来了个紧急信号,CPU就得暂停当前任务,转去处理这个信号。处理完了,再回来接着干。
我打个比方。你正在看书,电话响了。你放下书,接电话,聊完挂掉,再拿起书继续看。这个过程,就是中断。
- 电话响 —— 中断请求
- 放下书 —— 保存现场
- 接电话 —— 执行中断服务程序
- 挂电话 —— 恢复现场
- 继续看书 —— 返回主程序
你看,是不是很好理解?
核心要点:中断是一种硬件机制,它让CPU能够对外部或内部事件做出实时响应。它不是软件轮询那种「主动去看」,而是「被动被通知」。
1.2 中断的作用
中断到底有什么用?我直接说结论:没有中断,很多嵌入式系统根本没法用。
举个例子。你做一个按键检测。如果没有中断,CPU就得不停地去读IO口电平——这叫轮询。CPU大部分时间都在空转,啥正事也干不了。而且按键按下去的那一瞬间,CPU可能刚好在忙别的事,就漏掉了。
中断的作用,我归纳了三点:
- 实时响应 —— 外部事件来了,CPU能立刻知道。比如按键按下、串口收到数据、定时器溢出。
- 提高效率 —— CPU不用一直盯着某个事件。没中断的时候,CPU可以安心做别的事。
- 多任务处理 —— 虽然单片机是单核的,但通过中断,可以模拟出「同时处理多个任务」的效果。
我记得有一次做工业控制项目,要求对编码器脉冲做精确计数。如果用轮询,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.4.4 中断向量表
中断向量表是一张「地址映射表」。每个中断源对应一个固定的地址,里面存放着中断服务程序的入口地址。CPU根据中断号,直接查表跳转。
注意:我曾经遇到过一个坑——中断向量表配置错了,导致中断触发后程序跑飞。查了两天才发现是链接脚本里向量表地址没对齐。所以,向量表地址一定要按照芯片手册的要求来设置,不能想当然。
1.4.5 中断服务程序(ISR)
ISR就是中断触发后执行的代码。写ISR有几个铁律:
- 尽量短小 —— 不要在ISR里做复杂运算或延时
- 不要调用不可重入函数 —— 比如printf、malloc
- 注意共享资源的保护 —— 主程序和ISR都可能访问的变量,要用volatile修饰
我个人的习惯是:ISR里只做标志位设置或数据搬运,真正的处理逻辑放到主循环里去做。这样能最大程度减少中断对系统实时性的影响。
小结
这一节咱们把中断的基础概念捋了一遍。中断不是什么高深的东西,它就是CPU的一种「应急处理机制」。理解中断,关键是理解它的触发方式、响应流程和系统组成。
下一节,咱们会深入讲中断的优先级管理。那才是真正考验设计能力的地方。你想想看,多个中断同时来了怎么办?高优先级中断能不能打断低优先级中断?中断嵌套会不会导致栈溢出?这些问题,咱们后面一一拆解。