4. 中断系统与中断路由
在AURIX TC3xx的多核架构里,中断系统不是“一个中断控制器”那么简单,而是由IR(Interrupt Router,中断路由器)、ICU(Interrupt Control Unit,中断控制单元)、SRN(Service Request Node,服务请求节点)以及各外设自己的服务请求源共同组成的一张“路由网”。面试官问中断,往往不是问你“中断是什么”,而是问“一个CAN报文到达后,它是怎么一步步变成CPU上的ISR的”“为什么你的中断延迟会抖动”。这一章就围绕这条链路展开。
一、先理清四个角色:SRN、IR、ICU、CPU
在TC3xx中,任何一个外设想要打断CPU,都必须先产生一个服务请求(Service Request)。这个请求的载体就是SRN。SRN可以理解为“中断的入口节点”,它挂载在某个外设上(例如CAN、GPT、DMA、ADC),每个SRN有独立的使能位、请求标志和优先级字段。外设触发事件后,SRN把请求置起,等待被路由。
IR是真正做“路由决策”的硬件。它接收来自所有SRN的请求,根据每个SRN配置的TOS(Type of Service,服务类型)决定这个请求送往哪个目标:是送给某个CPU的ICU,还是送给DMA,还是触发某个软件中断。TOS字段是IR路由的核心,它把“谁请求”和“送给谁”解耦,这也是AURIX中断系统灵活性的来源。
ICU位于每个CPU内部,是CPU本地中断的“总闸”。它管理该CPU能接收哪些中断、当前优先级是多少、是否允许嵌套。IR把请求送到ICU后,ICU再根据优先级和当前CPU状态决定是否立即响应。
所以完整链路是:外设事件 → SRN置位 → IR按TOS路由 → 目标CPU的ICU仲裁 → CPU跳转ISR。面试时能把这条链路说清楚,基本就过了第一关。
二、优先级与嵌套:谁先响应,谁能打断谁
AURIX的中断优先级由SRN的SRPN(Service Request Priority Number)字段决定,通常是一个8位左右的数值,数值越大优先级越高。ICU内部维护一个CCPN(Current CPU Priority Number),表示当前正在处理的最高优先级。当新请求的SRPN大于CCPN时,且ICU允许嵌套,CPU就会保存现场并跳转到更高优先级的ISR,这就是嵌套中断。
这里有一个容易被忽略的点:嵌套不是默认开启的。ICU有一个全局的嵌套使能控制,同时每个中断还可以配置是否允许被更高优先级打断。如果关闭嵌套,即使来了更高优先级的中断,也要等当前ISR返回后才处理,这会直接拉高最坏情况延迟。
举个教学示例(以下参数为合理假设,用于说明机制,非实测值):假设CAN接收SRN的SRPN=80,GPT定时器SRN的SRPN=120,当前CPU正在处理SRPN=80的CAN ISR,CCPN=80。此时GPT触发,SRPN=120>80,若嵌套使能打开,CPU会压栈当前上下文,跳转到GPT ISR;GPT ISR执行完返回后,继续执行CAN ISR。如果嵌套关闭,GPT请求会一直挂起,直到CAN ISR结束。这个差异在实时性要求高的场景里可能就是几十微秒的抖动来源。
三、中断向量表:跳转的落点
中断向量表是CPU响应中断后查找ISR入口地址的地方。在AURIX中,向量表通常位于内存的固定区域,每个中断向量对应一个表项,表项里存放的是ISR的入口地址或跳转指令。SRN被路由到ICU后,ICU会根据中断号索引向量表,取出入口地址并跳转。
实际工程中,向量表一般由启动代码或链接脚本安排,编译器通过特定的段(如.intvec)把ISR入口放进去。面试中常问的一个点是:向量表能不能重定位?答案是可以,通过配置基址寄存器把向量表放到RAM或指定Flash区域,这在Bootloader跳转到Application时很关键——因为两个程序的向量表不能冲突。
四、中断延迟与抖动:面试中的分析题
中断延迟指从事件发生到ISR第一条指令执行的时间。抖动则是这个延迟的最大值与最小值之差。面试官问这个,通常想看你能否把延迟拆解成可分析的几段。
延迟可以拆成:外设响应时间 + SRN置位与IR路由时间 + ICU仲裁时间 + CPU现场保存时间 + 向量表取址跳转时间。其中前两段相对固定,抖动主要来自后三段,尤其是ICU仲裁和现场保存。
抖动的典型来源有:
- 嵌套被关闭:高优先级中断必须等当前ISR结束,等待时间取决于当前ISR执行时长,这是最大的抖动源。
- 中断被临时屏蔽:临界区里关中断,关多久,抖动就增加多少。
- 多核竞争:多个CPU同时访问同一外设或共享资源,IR路由和总线仲裁会引入不确定延迟。
- Cache与Flash等待:ISR代码不在Cache里时,取指延迟会明显增加,且是否命中不确定。
- DMA与CPU争总线:DMA大块搬运时占用总线,CPU取指和压栈都会被拖慢。
分析抖动时,建议用“最坏情况执行时间(WCET)”的思路:把每个可能阻塞中断的临界区找出来,测出或估算其最大执行时间,再叠加到延迟上。例如某临界区关中断最长约3μs,那么任何中断的最坏延迟至少增加3μs。如果系统要求中断延迟不超过10μs,而临界区就占了3μs,剩下的预算就要精打细算。
五、可落地的检查清单
下面这份清单可以直接用于项目评审或面试准备,逐项确认能覆盖大部分中断相关问题:
| 检查项 | 确认内容 | 判断依据 |
|---|---|---|
| SRN配置 | 每个外设中断的SRPN是否合理,是否存在优先级反转 | 高实时性任务优先级应高于低实时性任务 |
| TOS路由 | 请求是否送到正确的CPU/DMA | 与核间任务分配一致 |
| 嵌套使能 | ICU嵌套是否开启,哪些中断允许被打断 | 高优先级中断能否及时响应 |
| 临界区 | 关中断时间是否可测、是否可接受 | 关中断时间 < 延迟预算的30% |
| 向量表 | Bootloader与App向量表是否隔离 | 跳转后中断仍能正确落点 |
| 抖动测量 | 是否用GPIO翻转+示波器测过实际延迟 | 实测最大延迟满足系统要求 |
测量抖动的一个实用方法:在ISR入口翻转一个GPIO,在事件触发源处翻转另一个GPIO,用示波器看两者时间差。多次触发后观察最大值和最小值,差值就是抖动。这个方法简单直接,面试时说出来会显得你有实际调试经验。
六、面试回答的组织建议
如果被问到“AURIX中断延迟怎么分析”,可以按这个顺序回答:先讲链路(SRN→IR→ICU→CPU),再讲影响延迟的环节,然后指出抖动主要来自嵌套关闭、临界区、Cache和多核竞争,最后给出测量方法和优化手段(合理设置优先级、缩短临界区、把ISR放RAM或Cache、用DMA卸载CPU)。这样既有理论框架,又有工程落地,是面试官想听到的答案。
需要强调的是,AURIX的中断系统灵活性很高,但灵活性也意味着配置错误的空间大。SRPN设错会导致优先级反转,TOS设错会导致中断送到错误的核,嵌套没开会导致实时性不达标。理解这条链路,比记住某个寄存器地址更重要。