AUTOSAR Classic 平台与 RTE

AUTOSAR Classic 平台深度拆解:分层架构与 BSW 模块划分、SWC 与端口接口建模、RTE 如何生成通信代码、ARXML 配置与 ECU 提取、OSEK 派生 OS 的任务调度与调度表、时间保护与内存保护、MCAL 硬件抽象,以及完整工具链的配置生成流程。

引言

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 交换配置,版本兼容性坑多)。本文逐层拆解。

目录

  1. AUTOSAR Classic 分层架构
  2. BSW 模块分类与职责
  3. SWC 与端口接口建模
  4. RTE 生成与通信机制
  5. ECU 配置与 ARXML
  6. OS:OSEK 派生与任务调度
  7. 调度表与时间保护
  8. MCAL 与硬件抽象
  9. 工具链与生成流程

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、FiMUDS 服务、故障管理
存储NvM、Fee、Ea、MemIf非易失存储抽象
IO 抽象IoHwAb、Adc、Pwm、Dio传感器/执行器抽象
MCALCan、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 可关
配置管理工具链集成手工维护必须工具链 + 版本管理

常见坑清单

  1. 手改生成代码:重新生成后被覆盖,SWC 逻辑必须写在应用层。
  2. ARXML 版本不兼容:不同工具版本差异导致导入失败,需统一版本。
  3. RTE 队列长度不足:事件信号丢失,按最坏频率配置队列深度。
  4. 任务优先级配错:低优先级任务饿死,需做可调度性分析。
  5. 时间保护预算过紧:正常任务被误终止,预算须基于 WCET 加余量。
  6. 中断里调用 OS 服务:Category 1 中断不能调,否则系统崩溃。
  7. 多核共享外设冲突:未做核间同步导致数据错乱,用 IOC 或自旋锁。
  8. NvM 写入阻塞:Flash 写入耗时长,应放低优先级任务或后台。
  9. Com 超时监控缺失:通信中断无检测,需配 ComTimeout 与替换值。
  10. CDD 滥用:绕过分层直接访问硬件,认证时需额外论证,尽量少用。

小结

AUTOSAR Classic 的价值是「配置驱动的可复用性」:应用逻辑(SWC)与硬件(MCAL)解耦,中间靠 RTE 自动生成通信代码,所有差异收敛到 ARXML 配置。理解它的钥匙是三条线——分层架构(谁能调谁)、RTE(通信怎么生成)、OS(任务怎么调度)。

入门路径:先理解一个 SWC 从建模到 RTE 生成的全流程,再学 OS 的任务与调度表配置,最后深入 MCAL 与工具链集成。若你的项目需要 SOA 与高性能计算,AUTOSAR Adaptive 与面向服务架构 是自然延伸;服务通信细节见 SOME/IP 与车载中间件 。

MCAL 的驱动开发与 Linux 设备驱动模型 思路相通但约束不同——前者静态、无中断嵌套、无动态内存;OS 调度的实时性理论可参考 Linux 调度器 EEVDF 做对比。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「车载软件」更多文章

  1. 三电与动力总成软件
  2. 车载软件测试与 HIL 台架
  3. ADAS 决策规划与横纵向控制