引言
AUTOSAR(AUTomotive Open System ARchitecture)2003 年由宝马、博世、大陆等发起,目标是解决一个具体问题:同一个 ECU 软件被不同车厂、不同车型复用时,硬件差异和通信差异让代码无法移植。AUTOSAR Classic 的答案是「分层 + 配置生成」——把软件切成应用层(SWC)和基础软件层(BSW),中间用 RTE 连接,所有硬件相关细节通过 ARXML 配置生成。
Classic 平台面向深嵌入式 MCU(AURIX、S32K、RH850),核心是硬实时与 ASIL D 认证。它的「配置即代码」范式初看繁琐(一个 ECU 的配置可能几百个参数),但换来的是可复用、可认证、可追溯。
工程难点集中在三处:一是 RTE 的生成逻辑(Runnable 何时被调用、数据怎么传);二是 OS 的调度配置(周期任务、优先级、调度表、时间保护);三是工具链的协作(不同厂商工具通过 ARXML 交换配置,版本兼容性坑多)。本文逐层拆解。
目录
- AUTOSAR Classic 分层架构
- BSW 模块分类与职责
- SWC 与端口接口建模
- RTE 生成与通信机制
- ECU 配置与 ARXML
- OS:OSEK 派生与任务调度
- 调度表与时间保护
- MCAL 与硬件抽象
- 工具链与生成流程
1. AUTOSAR Classic 分层架构
Classic 是严格的分层结构,每层只能调用下层:
┌─────────────────────────────────────┐
│ 应用层:SWC(软件组件) │
│ - 功能逻辑,硬件无关 │
├─────────────────────────────────────┤
│ RTE(运行时环境) │
│ - SWC 之间、SWC 与 BSW 之间的通信中介 │
├─────────────────────────────────────┤
│ 服务层(Services) │
│ - OS、COM、NVM、诊断、网络管理 │
├─────────────────────────────────────┤
│ ECU 抽象层(ECU Abstraction) │
│ - IO 抽象、通信硬件抽象、存储器抽象 │
├─────────────────────────────────────┤
│ 微控制器抽象层(MCAL) │
│ - 驱动:CAN、ADC、DIO、Flash、GPT │
├─────────────────────────────────────┤
│ 微控制器(硬件) │
└─────────────────────────────────────┘
复杂驱动(CDD):
跨越所有层的例外,直接访问硬件
用于 AUTOSAR 未覆盖的特殊外设
认证时必须单独论证
分层的价值是「可替换」:换 MCU 只需换 MCAL 与配置,应用层代码不动。代价是调用链长、开销大(一次 CAN 发送可能穿过 5 层)。
2. BSW 模块分类与职责
BSW 是 AUTOSAR 提供的基础软件,按功能分为几组:
| 组 | 代表模块 | 职责 |
|---|---|---|
| 系统服务 | OS、EcuM、BswM、WdgM | 启动、模式管理、看门狗 |
| 通信服务 | Com、PduR、CanIf、CanTp | 信号打包、路由、传输层 |
| 诊断 | Dcm、Dem、FiM | UDS 服务、故障管理 |
| 存储 | NvM、Fee、Ea、MemIf | 非易失存储抽象 |
| IO 抽象 | IoHwAb、Adc、Pwm、Dio | 传感器/执行器抽象 |
| MCAL | Can、Adc、Dio、Fls、Gpt | 芯片驱动 |
启动序列是理解 BSW 的钥匙:
上电
→ EcuM 初始化 MCU 时钟、内存
→ 初始化 MCAL(Can、Adc...)
→ 初始化 MemIf → Fee → NvM(读持久化数据)
→ 初始化 Com → PduR → CanIf → Can(通信就绪)
→ 初始化 Dem、Dcm(诊断就绪)
→ BswM 进入 RUN 模式
→ RTE 启动 → SWC 的 Init Runnable 执行
→ OS 启动调度,周期任务开始
3. SWC 与端口接口建模
SWC 是应用逻辑的封装单元,通过端口(Port)与外界通信:
端口类型:
P-Port(Provide):提供服务
R-Port(Require):请求服务
接口类型:
Sender-Receiver(S/R):数据传递,一对一/一对多
- 有队列(队列长度可配)或无队列(覆盖)
- 数据一致性:用 E2E 保护
Client-Server(C/S):函数调用
- 同步或异步(异步返回用 callback)
Runnable:
SWC 内可被调度的函数
- Init Runnable:初始化,执行一次
- Periodic Runnable:周期执行
- Triggered Runnable:事件触发
- Operation Runnable:响应 C/S 调用
示例(一个车速显示的 SWC):
R-Port:VehicleSpeed(S/R,来自 CAN)
P-Port:DisplaySpeed(S/R,输出到仪表)
Runnable:ReadSpeed(周期 20 ms)
SWC 的设计要遵循「可复用」原则:不依赖具体 ECU、不直接访问硬件、通过端口通信。
4. RTE 生成与通信机制
RTE 是 AUTOSAR 的核心创新——它不是手写的,而是从配置生成的:
RTE 生成器输入:
SWC 描述(ARXML):端口、Runnable、触发条件
ECU 配置:SWC 到 ECU 的映射、任务映射
通信矩阵:信号到 COM 的映射
RTE 生成器输出:
Rte.c / Rte.h:通信 API
Rte_<SWC>.c:SWC 的框架代码
任务主体:把 Runnable 挂到 OS Task
RTE API 示例:
/* 发送信号 */
Rte_Write_DisplaySpeed_speed(value);
/* 接收信号(带超时) */
Rte_Read_VehicleSpeed_speed(&speed);
/* C/S 调用 */
Rte_Call_MyPort_MyOperation(arg, &result);
RTE 通信有两种模式:
- 直接访问(direct):RTE 直接读写 COM 缓冲区,延迟低,适合周期信号。
- 队列访问(queued):数据进队列,SWC 逐个取,适合事件信号。
配置错误(如队列长度不足)会导致数据丢失,是常见的集成问题。
5. ECU 配置与 ARXML
ARXML 是 AUTOSAR 的配置交换格式(基于 XML),描述从软件到硬件的全部信息:
<!-- 一个 SWC 的简化 ARXML 片段 -->
<APPLICATION-SW-COMPONENT-TYPE>
<SHORT-NAME>SpeedDisplay</SHORT-NAME>
<PORTS>
<R-PORT-PROTOTYPE>
<SHORT-NAME>VehicleSpeed</SHORT-NAME>
<REQUIRED-INTERFACE-TREF>/Interfaces/Speed_SR</REQUIRED-INTERFACE-TREF>
</R-PORT-PROTOTYPE>
</PORTS>
<INTERNAL-BEHAVIORS>
<RUNNABLE-ENTITY>
<SHORT-NAME>ReadSpeed</SHORT-NAME>
<MINIMUM-START-INTERVAL>0.02</MINIMUM-START-INTERVAL>
</RUNNABLE-ENTITY>
</INTERNAL-BEHAVIORS>
</APPLICATION-SW-COMPONENT-TYPE>
ECU 提取(ECU Extract)是把「系统描述」(所有 ECU 的软件)裁剪成「单个 ECU 的配置」。这个流程常出问题:不同工具对 ARXML 版本(4.0.3 / 4.2.2 / 4.4.0)支持不一致,导致导入失败或配置丢失。
6. OS:OSEK 派生与任务调度
AUTOSAR OS 基于 OSEK/VDX,是静态配置的实时内核:
任务类型:
基本任务(Basic Task):无等待,跑完就绪队列切换
扩展任务(Extended Task):可等待事件(WaitEvent)
两者混用需谨慎,扩展任务开销大
调度策略:
完全抢占式(Full Preemptive):高优先级立即抢占
非抢占式(Non Preemptive)
混合式:按任务配置
优先级:
数字越大优先级越高
资源(Resource)用优先级天花板协议防优先级反转
中断:
Category 1:不经过 OS,最快,不调用 OS 服务
Category 2:由 OS 管理,可调用 OS 服务
计数器(Counter)与警报(Alarm):
计数器记录 tick(如 1 ms)
警报在计数到达时触发任务或事件
周期任务 = 用 Alarm 周期激活
任务划分原则:周期相近的 Runnable 合并到一个任务,减少任务切换开销;安全关键任务给高优先级。
7. 调度表与时间保护
调度表(Schedule Table)实现时间触发,时间保护(Timing Protection)是 ASIL 要求:
调度表(Schedule Table):
定义一组「到期点(Expiry Point)」
每个到期点激活特定任务或设置事件
保证确定性执行顺序
示例(1 ms 周期,4 个到期点):
T=0 → 激活 Task_10ms_A
T=250us → 激活 Task_10ms_B
T=500us → 激活 Task_1ms_C
T=750us → 设置事件 Ev_High
时间保护(Timing Protection,ASIL D 必需):
执行时间保护:任务执行超过预算 → 触发保护钩子
到达率保护:任务激活过于频繁 → 触发保护
锁时间保护:任务持锁超时 → 触发保护
保护动作:终止任务、记录、进入安全状态
配置示例:
Task_Period = 10 ms
ExecutionBudget = 2 ms
TimeFrame = 10 ms ← 到达率保护窗口
时间保护的配置需要结合 WCET 分析,预算太紧会误触发,太松则失去保护意义。
8. MCAL 与硬件抽象
MCAL 是 AUTOSAR 定义的芯片驱动层,由芯片厂商提供并配置:
主要 MCAL 模块:
Can / CanIf :CAN 控制器驱动
Adc :模数转换
Dio :数字 IO
Pwm :PWM 输出
Gpt :通用定时器
Fls / Fee :Flash 驱动 / Flash EEPROM 仿真
Spi :SPI 通信
Wdg :看门狗
Mcu :时钟、复位、电源
配置方式:
用芯片厂商的配置工具(如 Infineon AURIX 的 EB tresos)
生成 Mcu_Cfg.c、Can_Cfg.c 等配置文件
通过 ARXML 与其他 BSW 模块集成
多核(AURIX TC3xx 有 6 核):
每个核可跑独立 OS
MCAL 支持多核,注意共享外设的核间同步
核间通信(IOC)用 MCAL 的 Ipc 模块
MCAL 的配置与硬件强相关,是移植工作量的主要来源。
9. 工具链与生成流程
AUTOSAR 工具链由多家厂商组成,通过 ARXML 协作:
典型工具链组合:
系统设计:PREEvision / DaVinci Developer(Vector)
ECU 配置:DaVinci Configurator / EB tresos(Elektrobit)
MCAL 配置:芯片厂商工具
OS 配置:DaVinci Configurator
代码生成:各工具自带生成器
编译:Tasking / GHS / IAR 编译器
生成流程:
1. 系统设计工具产出系统 ARXML
2. ECU 提取 → 单 ECU 配置 ARXML
3. 导入 ECU 配置工具,配置 BSW
4. 生成 BSW 代码 + RTE 代码
5. 集成 SWC 代码(手写或 Simulink 生成)
6. 编译链接 → 可执行文件
7. 刷入 ECU,用 CANoe 验证
坑点:
不同工具 ARXML 版本不一致
配置项名称在各版本间会变
生成代码不可手改(会被覆盖)
一个 ECU 的完整配置可能有几千个参数,配置管理(版本、diff、评审)是工程管理的重点。
权衡取舍
| 决策点 | 选项 A | 选项 B | 建议 |
|---|---|---|---|
| 平台 | AUTOSAR Classic | 裸机/自研 | 安全关键用 Classic,简单功能可裸机 |
| RTE 访问 | 直接访问 | 队列访问 | 周期信号直接,事件信号队列 |
| 任务划分 | 细粒度多任务 | 粗粒度少任务 | 周期相近合并,减少切换开销 |
| 调度 | 优先级抢占 | 调度表 | 硬实时用调度表,其余用抢占 |
| 时间保护 | 开启 | 关闭 | ASIL C/D 必须开启,QM 可关 |
| 配置管理 | 工具链集成 | 手工维护 | 必须工具链 + 版本管理 |
常见坑清单
- 手改生成代码:重新生成后被覆盖,SWC 逻辑必须写在应用层。
- ARXML 版本不兼容:不同工具版本差异导致导入失败,需统一版本。
- RTE 队列长度不足:事件信号丢失,按最坏频率配置队列深度。
- 任务优先级配错:低优先级任务饿死,需做可调度性分析。
- 时间保护预算过紧:正常任务被误终止,预算须基于 WCET 加余量。
- 中断里调用 OS 服务:Category 1 中断不能调,否则系统崩溃。
- 多核共享外设冲突:未做核间同步导致数据错乱,用 IOC 或自旋锁。
- NvM 写入阻塞:Flash 写入耗时长,应放低优先级任务或后台。
- Com 超时监控缺失:通信中断无检测,需配 ComTimeout 与替换值。
- CDD 滥用:绕过分层直接访问硬件,认证时需额外论证,尽量少用。
小结
AUTOSAR Classic 的价值是「配置驱动的可复用性」:应用逻辑(SWC)与硬件(MCAL)解耦,中间靠 RTE 自动生成通信代码,所有差异收敛到 ARXML 配置。理解它的钥匙是三条线——分层架构(谁能调谁)、RTE(通信怎么生成)、OS(任务怎么调度)。
入门路径:先理解一个 SWC 从建模到 RTE 生成的全流程,再学 OS 的任务与调度表配置,最后深入 MCAL 与工具链集成。若你的项目需要 SOA 与高性能计算,AUTOSAR Adaptive 与面向服务架构 是自然延伸;服务通信细节见 SOME/IP 与车载中间件 。
MCAL 的驱动开发与 Linux 设备驱动模型 思路相通但约束不同——前者静态、无中断嵌套、无动态内存;OS 调度的实时性理论可参考 Linux 调度器 EEVDF 做对比。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。