中断是一种可以异步打断 CPU 正常指令执行流程的机制。当外部事件发生时,CPU 会暂停当前正在运行的任务,转而去执行与该事件相关的另一个任务。中断处理完成后,CPU 会回到先前的执行流程,恢复被中断的任务。中断发生后需要执行的代码称为中断处理程序或中断服务程序(ISR)。中断处理程序通常非常短小,主要完成对中断的确认和对相关事件的快速响应。中断服务程序结束后,CPU 会切换回中断前执行的任务。中断向量表是一个数组结构,包含了每个中断对应的中断服务程序的入口地址。当中断发生时,CPU 根据中断号在向量表中查找到对应的中断服务程序地址,然后跳转到该地址开始执行中断服务程序。当多个中断源同时请求中断时,中断控制器需要根据中断的优先级来仲裁,优先级高的中断可以打断优先级低的中断。Cat1:类别 1 中断,不依赖 OS 的支持,latency 低,只能调用有限的 OS 函数。Cat2:类别 2 中断,可以利用 OS 提供的中断服务框架,latency 略高,可以调用 OS 的大多数函数。
AUTOSAR 中的中断处理分为 Cat1 和 Cat2 两种类别,两者在交互方式、latency、OS 支持程度等方面有较大区别:
属性 | Cat1 | Cat2 |
与 OS 的交互 | 不允许访问 OS 的数据结构,只能调用有限的 OS 函数来使能/禁用中断 | 可以调用 OS 的大多数函数 |
Latency | 很低 | 略高 |
OS 支持程度 | 不支持,中断处理程序的移植需要设备驱动自己实现 | OS 提供可移植的中断服务框架 |
配置 | OS 配置包含 Cat1 中断的相关信息,但不一定使用这些信息 | OS 使用这些配置信息来生成中断向量表和中断处理程序框架 |
中断逻辑控制 | 依赖目标平台 | 由 OS 统一控制 |
与其他任务的通信 | 通过禁用所有中断实现互斥访问 | 使用 OS 的资源管理功能实现互斥访问 |
当外部设备发起一个中断请求时,整个中断处理流程如下:对于 Cat1 和 Cat2 中断,中断服务程序的执行和中断返回处理有较大不同。
当外部设备发起 Cat1 中断请求时,处理流程如下:

如果中断处理程序要访问与其他任务共享的资源,需要使用临界区实现互斥访问。对于优先级较低的任务,需要在访问共享资源前后添加 Suspend/Resume All Interrupts 调用,在临界区内禁用所有中断。对于与中断优先级相同或更高的任务,需要在中断处理程序内部添加 Suspend/Resume All Interrupts 调用来保护共享资源。

- OS 需要配置每个中断的向量号、优先级、名称、类别等信息- BSW 调度器生成调用各 BSW 主函数的 TASK- 除主函数,BSW 模块还可能被 RTE 的 TASK 调用- 需要收集所有访问临界区的 TASK 和 ISR 信息
4. 相邻模块使用 Cat1 中断通信时,应通过 BSW 调度器的 Disable/Enable All Interrupts 调用来保护临界区
1. 中断处理程序要短小精悍,主要用于 acknowledge 中断和响应事件2. 中断处理结束要禁用外部设备的中断,防止立即重入4. 对共享资源的访问要加锁,使用 OS 提供的互斥机制2. 只有在 OS 开销过大或对延迟敏感时才使用 Cat1 中断4. 相邻模块间使用 Cat1 中断通信时需加锁保护临界区3. OS 要配置每个中断的类别、优先级、入口等信息5. 访问同一临界区的所有任务和中断要配置到同一个资源3. Cat1 中断禁用中断会影响所有 ISR 和任务4. 使用 Cat1 中断会增加处理互斥访问的复杂度1. Cat2 中断相对于 Cat1 中断有更高的延迟3. 只禁用中断实现互斥访问会延长高优先级任务的阻塞时间