3. AURIX中断系统与调度触发机制
AURIX TC3xx 的中断系统并不是“外设拉一根线到 CPU”这么简单。它由外设中断源、Interrupt Router(IR)、Service Request Node(SRN)、CPU 仲裁单元以及各核的 ISR 入口共同组成。理解这条链路,才能解释为什么同一个 CAN 接收中断有时立刻进 ISR,有时却要等几十微秒;也才能把 ISR 与 Task 的触发关系设计得既实时又可控。
一、从外设事件到 SRN:中断请求的“登记”
在 TC3xx 中,每个可产生中断的外设(如 CAN、GPT12、QSPI、DMA、STM 比较通道等)都挂接一个或多个 Service Request Node。SRN 是中断路由的基本单元,它保存了该请求的使能位、优先级、目标服务提供者(Service Provider,通常指向某个 CPU 或 DMA)以及请求标志。外设事件发生时,硬件置位 SRN 的请求标志;只有该 SRN 被使能且优先级有效,请求才会被送往 Interrupt Router 参与仲裁。
因此,配置一个中断至少涉及三层:外设模块内部的中断使能、SRN 的使能与优先级、CPU 侧的中断使能。任何一层关闭,ISR 都不会执行。实际工程中常见的“中断不进”问题,多数不是 CPU 没开中断,而是 SRN 未使能或目标 Service Provider 配错。
二、Interrupt Router 与优先级仲裁
Interrupt Router 是中断请求的汇聚与分发中心。它接收来自各 SRN 的请求,按优先级进行仲裁,并把胜出的请求分发到对应的 CPU。TC3xx 的优先级通常用 8 位表示,数值越大优先级越高。仲裁遵循两条基本规则:
- 同一时刻,优先级最高的待处理请求先被服务;
- 同优先级请求按硬件固定顺序或轮询方式处理,具体取决于配置。
需要特别注意的是,AURIX 的优先级仲裁发生在 IR 层,而 CPU 是否真正响应还取决于该 CPU 当前的中断使能状态和当前运行优先级(CCPN)。如果 CPU 正在执行一个更高或同等优先级的 ISR,新请求会被挂起,直到当前 ISR 结束或主动降低优先级。
三、中断嵌套:CCPN 与优先级的动态关系
中断嵌套的本质是:CPU 进入 ISR 后,当前运行优先级 CCPN 被提升到该 ISR 的优先级;只有优先级高于 CCPN 的新请求才能打断当前 ISR。例如,CAN 接收 ISR 优先级为 40,进入后 CCPN=40;此时若 GPT 溢出中断优先级为 60,则可以嵌套;若另一个 CAN 发送中断优先级为 30,则必须等待。
嵌套深度不是越多越好。每层嵌套都要保存上下文,增加栈开销和响应抖动。工程上通常把硬实时、短小的中断设为高优先级,把耗时较长或可延迟的处理放到低优先级 ISR 或 Task 中。AURIX 允许在 ISR 内通过写 CCPN 主动降低当前优先级,从而在 ISR 中“开一个窗口”让同级或更低优先级请求进入,但这需要非常谨慎,避免破坏临界区。
四、ISR 到 Task 的触发链路
ISR 本身不应承担复杂业务逻辑。典型做法是:ISR 只做最小必要的硬件操作(清标志、读数据、置事件),然后通过 RTOS 的 FromISR API 触发一个 Task。以 AUTOSAR OS 或 FreeRTOS 为例,链路如下:
- 外设事件置位 SRN 请求;
- IR 仲裁后分发到目标 CPU;
- CPU 保存上下文,跳转到 ISR 入口;
- ISR 读取数据、清除中断标志;
- ISR 调用
ActivateTask或xTaskNotifyFromISR等 API,把 Task 置为就绪; - ISR 返回,调度器在退出中断时检查是否需要任务切换;
- 若新 Task 优先级高于当前 Task,则发生任务切换,Task 开始执行。
这里的关键点是:ISR 到 Task 的触发不是“直接调用 Task 函数”,而是通过 RTOS 的就绪队列和调度器完成。ISR 只负责“通知”,调度器负责“切换”。因此,ISR 中调用的 API 必须是中断安全版本,且不能阻塞。
五、工程配置要点与常见陷阱
在 TC3xx 上配置中断时,建议按以下顺序检查:
| 检查项 | 典型配置 | 常见错误 |
|---|---|---|
| 外设中断使能 | 模块寄存器中的中断使能位 | 只配 SRN,忘记外设内部使能 |
| SRN 使能与优先级 | SRC 寄存器:SRPN 设优先级,TOS 设目标 | 优先级为 0 或未使能 |
| 目标 Service Provider | 指向目标 CPU 或 DMA | 配到错误 CPU,导致中断丢失 |
| CPU 中断使能 | ICR 寄存器全局使能 | 临界区后忘记恢复 |
| ISR 到 Task 的 API | FromISR 版本,非阻塞 | 在 ISR 中调用阻塞 API |
另一个容易忽略的点是中断标志的清除时机。TC3xx 的 SRN 请求标志通常需要在 ISR 中显式清除,否则退出 ISR 后请求仍然有效,会立即再次进入。清除动作应放在读取数据之后、通知 Task 之前,避免数据被覆盖。
总结来说,AURIX 中断链路可以概括为:外设事件 → SRN 登记 → IR 仲裁 → CPU 响应 → ISR 执行 → RTOS 通知 → Task 调度。理解每一层的职责和边界,才能在复杂 ECU 中把实时性和可维护性同时做好。