1. 中断系统概述:什么是中断、中断的作用、中断与轮询的对比、DSP中断系统的特点

各位同学,咱们今天聊聊中断系统。说实话,中断这个概念,是嵌入式开发里最核心、也最容易让人迷糊的东西之一。我当年刚接触DSP时,就被中断的优先级、嵌套这些概念搞得头大。但等你真正理解了,你会发现——没有中断,DSP就是个“聋子”和“哑巴”。

1.1 什么是中断?

先讲个生活化的例子。你正在写代码,突然手机响了。你是放下手头工作接电话,还是等代码写完再接?正常人都会接电话,对吧?接完电话,再回来继续写代码。

中断就是这个道理。CPU正在执行主程序,突然来了个紧急事件(比如定时器溢出、AD转换完成、外部引脚电平变化)。CPU会暂停当前任务,跳转去处理这个事件。处理完了,再回来接着干。

中断的本质:一种硬件机制,让CPU能够响应异步事件。说白了,就是“插队”机制——但插队是有规矩的,不是谁都能插。

在DSP里,中断源有很多。我常用的TMS320F28335,就有96个中断源。包括定时器、ePWM、eCAP、ADC、SCI、SPI、I2C……几乎每个外设都能产生中断。

1.2 中断的作用

中断到底有什么用?我总结了三句话:

  • 实时响应:事件来了,立刻处理。不用等CPU轮询。
  • 提高效率:CPU不用一直盯着某个状态位,可以专心干别的事。
  • 多任务处理:不同优先级的中断,可以嵌套执行。高优先级的打断低优先级的。

我在做电机控制项目时,就深刻体会到了中断的价值。电流环需要每10微秒执行一次,速度环每100微秒一次。如果没有中断,靠轮询根本不可能实现——CPU会被活活累死。

我的经验:中断服务程序(ISR)一定要短。能放主循环的,就别放中断里。我曾经见过有人把浮点运算放在中断里,结果系统直接崩了。中断里只做“标记”,具体处理交给主循环。

1.3 中断与轮询的对比

轮询是什么?就是CPU不停地问:“你好了没?你好了没?” 比如你要等AD转换完成,轮询就是一直读AD的状态寄存器,直到它告诉你“我好了”。

中断呢?AD转换完了,它会主动喊一声:“我好了!” CPU听到后,放下手头的事去拿数据。

我画了个对比表,大家一看就明白:

对比项 中断 轮询
CPU利用率 高(有事才处理) 低(一直在问)
实时性 好(事件触发) 差(取决于轮询频率)
编程复杂度 较高(需配置中断向量、优先级) 低(就是读寄存器)
适用场景 实时性要求高、事件不频繁 简单任务、事件频率极高
资源消耗 需中断控制器、堆栈 几乎无额外资源

你想想看,如果事件每1秒才发生一次,你用轮询每1毫秒查一次,CPU有99.9%的时间都在空转。这不是浪费吗?

但反过来,如果事件每1微秒发生一次,中断反而成了负担——因为进中断、出中断的开销(保存现场、恢复现场)比处理事件本身还大。这时候轮询反而更合适。

避坑指南:我曾经在一个项目中,把串口接收用中断处理。结果数据量一大,中断频繁触发,导致主循环几乎没时间运行。后来改成DMA+中断的方式,才解决问题。记住:中断不是万能的,高频事件慎用中断。

1.4 DSP中断系统的特点

DSP的中断系统和普通MCU有什么不同?我总结了几个关键点:

  • 中断源多且复杂:DSP外设多,中断源自然也多。而且很多外设(如ePWM)有多个事件,每个事件都能触发中断。
  • 优先级可编程:不像一些低端MCU,中断优先级是固定的。DSP里你可以自己设定哪个中断更重要。
  • 中断嵌套:高优先级中断可以打断低优先级中断。但要注意,嵌套层数太多会导致堆栈溢出。
  • 快速中断(FIQ):有些DSP(如C6000系列)有快速中断,专门处理时间要求极苛刻的任务。
  • 中断向量表可重定位:你可以把中断向量表放在RAM里,运行时动态修改。这在Bootloader里很常用。

以TI的C2000系列为例,它的中断系统叫PIE(外设中断扩展)。为什么叫“扩展”?因为CPU本身只有12个中断线,但外设太多,所以通过PIE模块把96个中断源映射到12个CPU中断线上。这就像你只有12个门,但来了96个人,得有个“门卫”来分流。

下面这张图,是我用SVG画的PIE中断系统结构图,帮你理清思路:

DSP中断系统结构图(以C2000 PIE为例) 外设中断源 ADC ePWM eCAP SCI SPI I2C 定时器 GPIO ... 共96个 PIE中断控制器 中断分组(1-12组) 每组8个中断源 中断使能寄存器 中断标志寄存器 优先级仲裁 96 → 12 映射 CPU内核 INT1 ~ INT12 中断向量表 保存现场 跳转ISR 执行中断服务 恢复现场 流程:外设产生中断 → PIE分组映射 → CPU响应中断 → 执行ISR 96个中断源通过PIE映射到12个CPU中断线

这张图你看懂了吗?外设产生中断后,先到PIE模块。PIE根据你配置的映射关系,把中断路由到对应的CPU中断线上。CPU收到中断后,查向量表,找到对应的ISR地址,跳过去执行。

嗯,这里要注意:PIE模块里还有使能位和标志位。你必须在ISR里手动清除标志位,否则中断会一直触发。我刚开始学的时候,就忘了清标志,结果程序一直在中断里出不来,主循环根本跑不了。

我的习惯:写ISR时,第一件事就是清中断标志。然后再处理业务逻辑。这样即使处理过程中又来了中断,也不会丢失。当然,如果你需要防止重入,可以先把全局中断关了,处理完再开。

最后说一句,DSP中断系统的配置,说白了就是三步:

  1. 使能外设中断:让外设能产生中断信号
  2. 配置PIE映射:告诉PIE模块,哪个外设中断对应哪个CPU中断
  3. 编写ISR:中断来了,你要干什么

这三步缺一不可。我见过有人只配了外设,忘了配PIE,结果中断死活不触发。也见过有人ISR写得又臭又长,导致系统响应变慢。这些都是坑,咱们后面会一个一个填。


专注资料整理