第一章:AURIX TC3xx 中断系统概述
各位同学,咱们今天正式开讲中断系统。说实话,中断这玩意儿,是嵌入式系统的灵魂。没有中断,你的CPU就得像个傻子一样轮询,效率低得吓人。我做了十几年汽车电子,从8位单片机一路干到TC3xx,中断系统的设计思路变化很大,但核心思想没变——让CPU在正确的时间,做正确的事。
1.1 中断向量表:CPU的“紧急联络簿”
先说说中断向量表。你想想看,CPU正在跑主循环,突然来了个中断请求。它怎么知道该跳到哪里去执行?答案就在中断向量表。
TC3xx的中断向量表,说白了就是一张地址映射表。每个中断源对应一个固定的入口地址。CPU收到中断后,硬件自动从这个表里取出地址,跳过去执行。
关键点:TC3xx支持两种向量表模式——直接模式和间接模式。直接模式下,向量表里存的就是中断服务函数的地址。间接模式呢,存的是指向函数指针的指针。我个人习惯用直接模式,简单粗暴,少一层间接访问,延迟更低。
我记得有个项目,客户要求中断响应时间必须小于1微秒。当时我查了半天,发现是向量表配置成了间接模式,多了一次内存访问。改成直接模式后,问题解决。嗯,这里要注意:性能敏感的中断,优先选直接模式。
向量表的位置可以重映射。默认在CPU启动地址,但你可以通过寄存器把它挪到RAM里。为什么这么做?因为RAM里可以动态修改向量表。我在做Bootloader时就用过这招——运行时切换中断服务函数,不用重新烧录。
1.2 中断优先级:谁更重要,谁先上
中断优先级,这是个老生常谈的话题。但TC3xx的优先级系统,跟传统的单片机不太一样。
TC3xx支持8级CPU优先级(0-7),数字越大优先级越高。但注意,这不是说只有8个中断源能用。实际上,每个中断源都可以独立配置优先级。你想想看,系统里可能有上百个中断源,但CPU优先级只有8级,怎么映射?
答案是:中断仲裁机制。TC3xx内部有个中断路由器(IR),它负责把多个中断源映射到有限的CPU优先级上。同一优先级的中断,按硬件端口号排序,端口号小的优先。
| CPU优先级 | 典型用途 | 我个人的建议 |
|---|---|---|
| 7(最高) | 系统定时器、紧急故障 | 留给最核心的中断,别乱用 |
| 5-6 | 高速通信(CAN、SPI) | 实时性要求高的放这里 |
| 3-4 | 普通外设中断 | 大部分中断放这层 |
| 1-2 | 低优先级任务 | 可以被打断的,比如按键扫描 |
| 0(最低) | 空闲中断 | 几乎不用,除非你故意让它垫底 |
避坑指南:我曾经在一个项目中,把两个关键中断都设成了优先级7。结果呢?它们互相抢资源,系统频繁死锁。后来我才意识到,同一优先级的中断不能嵌套。如果你有两个中断必须能互相打断,那就得设成不同优先级。
为什么会这样?因为TC3xx的硬件设计里,同一优先级的中断,CPU在处理完当前中断前,不会响应同优先级的另一个中断。这是为了简化硬件逻辑,但也给我们程序员挖了个坑。所以,优先级分配要留有余地,别把鸡蛋都放在一个篮子里。
1.3 中断源分类:五花八门,各有各的脾气
TC3xx的中断源,种类多得让人头疼。但别怕,咱们可以分门别类地看。
从来源上分,主要有这几类:
- 外部中断:来自芯片引脚,比如按键、传感器信号。每个端口组都有中断功能,可以配置上升沿、下降沿或双边沿触发。
- 内部外设中断:来自片内外设,比如CAN模块、SPI模块、定时器。这类中断最多,也最常用。
- 软件中断:由软件触发,用于任务间通信或同步。TC3xx的Service Request (SR) 机制,本质上就是软件中断。
- 系统中断:比如CPU陷阱、内存保护错误。这类中断优先级最高,一般用来处理致命错误。
我记得有个项目,客户反映系统偶尔死机。查了三天,发现是一个外部中断的毛刺信号触发了误中断。后来我在中断服务函数里加了去抖逻辑,问题解决。所以,外部中断一定要做硬件或软件去抖,别太相信信号的纯净度。
从触发方式上分,又可以分为:
- 电平触发:只要引脚电平符合条件,就一直触发。适合用来检测持续状态。
- 边沿触发:只在电平变化瞬间触发。适合用来检测事件。
我个人习惯,能用边沿触发就别用电平触发。电平触发容易产生重复中断,处理不好会拖死CPU。你想想看,如果中断服务函数执行时间太长,电平还没消失,CPU就会反复进中断,别的任务就别想跑了。
小技巧:TC3xx的每个中断源都可以独立配置触发方式。我一般把外部中断设成双边沿触发,然后在中断服务函数里判断当前电平。这样既能捕获上升沿,也能捕获下降沿,一个中断搞定两种事件。
最后说说中断的使能和屏蔽。TC3xx提供了多级控制:
- 全局使能:CPU的ICR寄存器控制,一关全关。
- 优先级组使能:可以屏蔽某个优先级的所有中断。
- 单个中断使能:每个中断源有自己的使能位。
这种分层设计,给了我们很大的灵活性。比如在临界区保护时,我通常只屏蔽当前优先级及以下的中断,而不是关全局中断。这样高优先级的中断还能响应,系统的实时性不会受影响。
好了,第一章的内容就到这里。中断系统是TC3xx的基石,后面讲任务调度、实时性分析,都离不开这些基础概念。下一章,咱们深入中断配置的细节,手把手教你写中断服务函数。