# AUTOSAR 中断处理说明 > **AUTOSAR CP Release 4.4.0** > > 原文:*Explanation of Interrupt Handling within AUTOSAR*(文档 ID 307) > > 翻译状态:**已完成 v1** > > 对应原文 PDF:`BSWGeneral/AUTOSAR_EXP_InterruptHandlingExplanation.pdf` --- ## 文档标识 | 字段 | 值 | |------|-----| | 文档标题 | AUTOSAR 中断处理说明(Explanation of Interrupt Handling within AUTOSAR) | | 文档标识号 | 307 | | 文档状态 | 正式版(Final) | | 所属标准 | Classic Platform | | 所属版本 | 4.4.0 | --- ## 文档变更历史(节选) | 日期 | 版本 | 变更说明 | |------|------|----------| | 2018-10-31 | 4.4.0 | 编辑性修订 | | 2017-12-08 | 4.3.1 | 编辑性修订 | | 2016-11-30 | 4.3.0 | 编辑性修订 | | 2013-03-15 | 4.1.1 | R4.1 定稿 | | 2007-12-21 | 3.0.1 | 初始发布 | --- ## 目录 1. 介绍与文档目的 2. 缩略语与简称 3. 相关文档 4. 中断配置概述 5. 中断操作概述 6. 中断操作步骤 7. 中断配置 8. 总结 --- ## 1 介绍与文档目的 本文档**解释** AUTOSAR 中断处理的机制和概念。它**不是规范**,而是说明性文档,帮助读者理解 AUTOSAR 如何处理中断。 读者应熟悉: - OSEK/VDX OS 概念 - AUTOSAR 分层架构 - 微控制器中断机制 --- ## 2 缩略语与简称 | 缩略语 | 描述 | |--------|------| | ISR | Interrupt Service Routine(中断服务例程) | | Cat1 | Category 1 interrupt(OS 不感知的中断) | | Cat2 | Category 2 interrupt(OS 感知的中断) | | OS | Operating System | | ECU | Electronic Control Unit | | ICU | Input Capture Unit(输入捕获单元) | | IRQ | Interrupt Request(中断请求) | --- ## 3 相关文档 | 编号 | 名称 | |------|------| | [1] | AUTOSAR_EXP_LayeredSoftwareArchitecture | | [2] | AUTOSAR_SRS_BSWGeneral | | [3] | AUTOSAR_SWS_OS | | [4] | AUTOSAR_SWS_ICUDriver | | [5] | ISO 17356-3 OSEK/VDX OS | --- ## 4 中断配置概述 AUTOSAR 中断配置涉及**三个层级**: 1. **硬件层**:微控制器的中断控制器(如 NVIC、INTC) 2. **驱动层**:设备驱动(ICU 驱动、Port 驱动等) 3. **OS 层**:AUTOSAR OS 管理 Cat2 中断 ### 中断源分类 | 中断源 | 示例 | 处理方 | |--------|------|--------| | 微控制器外设 | 定时器、ADC、UART | 设备驱动 | | 通信控制器 | CAN、LIN、FlexRay | 通信驱动 | | 外部中断 | GPIO、外部传感器 | ICU 驱动 | --- ## 5 中断操作概述 ### 5.1 Cat1 与 Cat2 中断的区别 AUTOSAR 区分两种类型的中断: | 特性 | Cat1 中断 | Cat2 中断 | |------|----------|----------| | OS 感知 | ❌ 不被 OS 感知 | ✅ 由 OS 管理 | | ISR 类别 | 不分类 | 类别 2 | | 可调用 OS 服务 | 仅允许中断使能/禁用 | 可调用受限的 OS 服务 | | 由谁实现 | 复杂驱动(CDD)或 BSW 模块 | AUTOSAR OS | | 用途 | 关键、低延迟、硬件紧密耦合 | 一般外设中断 | | 入口/出口处理 | 直接由硬件/驱动 | 由 OS 提供(保存/恢复上下文) | > **核心区别**:Cat2 中断由 OS 管理,可以安全地调用 OS 服务;Cat1 中断绕过 OS,必须自己保存上下文。 --- ## 6 中断操作步骤 ### 6.1 处理 Cat1 中断 #### 6.1.1 初始状态 - 中断向量已配置 - ISR 已安装(绕过 OS) - 全局中断使能 #### 6.1.2 当硬件请求中断时 1. 硬件自动保存 **部分上下文**(如 PC、SR) 2. 跳转到 ISR 入口(无 OS 中介) 3. ISR 内部保存必要的寄存器(编译器/手写) 4. 执行 ISR 主体 - 读取/清除外设中断标志 - 处理中断 5. ISR 内部恢复寄存器 6. 中断返回 **Cat1 ISR 限制**: - 不可调用 OS 服务 - 不可调用任何 OS API - 不可等待/阻塞 - 应**保持极短**(如 5-10 微秒) - 不可访问 OS 管理的资源(任务、事件、信号量等) ### 6.2 处理 Cat2 中断 #### 6.2.1 初始状态 - 中断向量已配置(由 OS 启动时设置) - ISR 由 OS 管理 - 中断优先级已分配 #### 6.2.2 当硬件请求中断时 1. 硬件自动保存 **部分上下文**(PC、SR、关键寄存器) 2. 跳转到 OS 提供的 ISR 入口 3. **OS 保存完整上下文**(所有寄存器) 4. OS 调用用户注册的 ISR 函数 5. 执行 ISR 主体 - 允许调用有限的 OS 服务 6. OS 恢复完整上下文 7. 中断返回 **Cat2 ISR 允许的 OS 服务**: - `ActivateTask` - `SetEvent` - `GetResource` - `ReleaseResource` - `GetAlarm` - `IncrementCounter` - `TerminateApplication`(受限) **Cat2 ISR 限制**: - 不可调用 `Schedule` - 不可调用 `WaitEvent`(任务级) - 不可访问某些 OS 资源 - 仍应保持**简短** --- ## 7 中断配置 ### 7.1 设备驱动配置和代码 #### 7.1.1 中断处理程序的放置 | 中断类型 | 中断处理程序位置 | |----------|------------------| | Cat1 | 由 BSW 模块(如 ICU 驱动)实现,放置在驱动 `.c` 文件中 | | Cat2 | 由 OS 实现,放置在 OS 配置中(中断向量表) | ### 7.2 OS 配置 #### 7.2.1 中断向量表 OS 启动时按 `Os_Cfg.h` 中的配置初始化中断向量表。Cat2 中断的 ISR 由 OS 在启动时注册。 #### 7.2.2 中断优先级 - **Cat1**:优先级**高于**所有 Cat2 中断(不受 OS 优先级限制) - **Cat2**:优先级由 OS 管理,**低于** Cat1 #### 7.2.3 中断嵌套 - Cat1 可以**中断** Cat2(Cat1 优先级更高) - Cat2 之间按 OS 优先级嵌套 - Cat1 之间按硬件优先级嵌套 --- ## 8 关键概念总结 | 概念 | 说明 | |------|------| | **Cat1** | 直接由硬件处理,绕过 OS。**不可调用 OS 服务**。极低延迟。 | | **Cat2** | 由 OS 包装,**可调用受限 OS 服务**。常规外设中断首选。 | | **中断优先级** | Cat1 > Cat2。Cat1 中断可中断 Cat2 ISR。 | | **ISR 长度** | Cat1 应 < 10μs;Cat2 应 < 100μs(一般)。 | | **上下文保存** | Cat1:部分(编译器);Cat2:完整(OS)。 | | **配置位置** | Cat1 在驱动中;Cat2 在 OS 中。 | --- ## 9 中断处理时间线(示例) ### Cat2 中断处理时序 ``` 硬件事件 ↓ [硬件自动保存 PC、SR 等] ↓ [OS 中断入口] ↓ [OS 保存完整上下文] ↓ [调用用户 ISR 主体] ↓ 允许调用受限 OS 服务 ├─ 清除中断标志 ├─ 读取外设数据 ├─ 激活任务 / 设置事件 └─ 释放资源 ↓ [OS 恢复完整上下文] ↓ [中断返回] ``` ### Cat1 中断处理时序 ``` 硬件事件 ↓ [硬件自动保存 PC、SR] ↓ [直接跳转到 ISR] ↓ [ISR 内部保存其他寄存器] ↓ 禁止调用 OS 服务 ├─ 清除中断标志 └─ 处理中断 ↓ [ISR 内部恢复寄存器] ↓ [中断返回] ``` --- ## 翻译说明 - 本文档为**说明性文档(EXP)**,非规范 - Cat1/Cat2 中断分类是 AUTOSAR 中断处理的核心概念 - 选择 Cat1 还是 Cat2 取决于:延迟要求、是否需要 OS 服务、是否访问 OS 资源 --- *翻译:opencode-translator / Step 3 P0 批量翻译*