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 为例,链路如下:

  1. 外设事件置位 SRN 请求;
  2. IR 仲裁后分发到目标 CPU;
  3. CPU 保存上下文,跳转到 ISR 入口;
  4. ISR 读取数据、清除中断标志;
  5. ISR 调用 ActivateTask 或 xTaskNotifyFromISR 等 API,把 Task 置为就绪;
  6. ISR 返回,调度器在退出中断时检查是否需要任务切换;
  7. 若新 Task 优先级高于当前 Task,则发生任务切换,Task 开始执行。

这里的关键点是:ISR 到 Task 的触发不是“直接调用 Task 函数”,而是通过 RTOS 的就绪队列和调度器完成。ISR 只负责“通知”,调度器负责“切换”。因此,ISR 中调用的 API 必须是中断安全版本,且不能阻塞。

AURIX 中断路由与 ISR→Task 触发链路 外设事件源 CAN / GPT / QSPI / STM SRN 服务请求节点 使能 / 优先级 / 目标 Interrupt Router 汇聚 / 仲裁 / 分发 CPU 中断响应 当前运行优先级 CCPN 比较:新请求 > CCPN ? 保存上下文 跳转 ISR 入口 ISR 执行 清标志 / 读数据 / 通知 中断嵌套 ISR_A 优先级 40 ISR_B 优先级 60 ISR_C 优先级 30 B 可嵌套 A,C 需等待 RTOS 调度与 Task 触发 ISR 调用 FromISR ActivateTask / Notify 就绪队列 Task 置为 Ready 退出中断 检查调度点 任务切换 高优先级 Task 运行 关键判断: SRN 使能 + 优先级 > CCPN + CPU 中断使能 → ISR 执行 ISR 只通知,调度器在退出中断时决定是否切换 Task

五、工程配置要点与常见陷阱

在 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 之前,避免数据被覆盖。

实践建议:把 ISR 的执行时间控制在几微秒以内。如果 ISR 中需要处理大量数据,优先使用 DMA 搬运,ISR 只处理“搬运完成”事件。这样既能降低 CPU 负载,也能减少中断嵌套带来的抖动。
注意:中断嵌套会显著增加栈使用量。每个嵌套层都需要保存上下文,若栈空间不足,可能导致栈溢出且难以定位。建议在项目早期用最坏嵌套深度估算栈需求,并留出至少 30% 余量。

总结来说,AURIX 中断链路可以概括为:外设事件 → SRN 登记 → IR 仲裁 → CPU 响应 → ISR 执行 → RTOS 通知 → Task 调度。理解每一层的职责和边界,才能在复杂 ECU 中把实时性和可维护性同时做好。