# AUTOSAR CP 培训教材 — 配置总结与工作输出物梳理

> 基于 AUTOSAR Classic Platform 开发流程，聚焦各阶段配置产物与集成方法

---

## 第一篇：AUTOSAR CP 基础与开发流程总览

### 第 1 章 AUTOSAR 概述

**1.1 什么是 AUTOSAR**
AUTOSAR（AUTomotive Open System ARchitecture）是由全球汽车制造商、供应商和工具开发商联合制定的汽车电子软件架构标准。其核心目标是：
- 实现软件与硬件的解耦（Application 与 Hardware 分离）
- 提高软件复用率，降低开发成本
- 支持跨 OEM/Tier1 的标准化接口

**1.2 Classic Platform vs Adaptive Platform**
- Classic Platform（CP）：面向传统 MCU（如 Infineon TC2xx/TC3xx、NXP S32K、RH850），运行实时 OS（OSEK/AUTOSAR OS），采用单核/多核裸跑或轻量 RTOS
- Adaptive Platform（AP）：面向高性能 SoC（如 Qualcomm SA8155、NXP S32G），运行 POSIX OS（Linux/QNX），支持动态部署和 SOA 通信

**1.3 AUTOSAR 方法论**
AUTOSAR 定义了"V 模型"开发方法论，强调配置驱动 > 手写代码。核心概念：
- 虚拟功能总线（VFB）：在系统设计阶段抽象 SWC 间的通信
- 配置时生成代码：ECUC 参数 → 代码生成器 → 可编译 C 代码

**1.4 AUTOSAR 开发工作流**

AUTOSAR CP 开发遵循从配置到调试的完整流水线，分为三大阶段：配置阶段 → 集成阶段 → 调试阶段。各阶段依次处理不同的 AUTOSAR 模块，每个模块由对应工具完成。

```
                        [三大阶段]
  配置阶段                集成阶段              调试阶段
┌────────┬────┬────┬───┬────┬──┐ ┌────┬────┬────┐ ┌────┬────┐
│ SYS    │BSW │ASW │RTE│MCAL│OS│ │Int │ Cmp│Link│ │Debug│Test│
│系统信息│生  │数  │Map│MCU │操 │ │集成 │编  │链  │ │调   │观  │
│       │成  │据  │   │GPT │作 │ │.arxm│译  │接  │ │试   │测  │
│       │通信│接  │   │FLS │系 │ │.c.h │    │    │ │     │    │
│       │模式│口  │   │Port│统 │ │.s   │    │    │ │     │    │
│       │存储│SWC │   │WDG │   │ │.ld  │    │    │ │     │    │
│       │服务│Com │   │DIO │   │ │.mk  │    │    │ │     │    │
│       │网络│... │   │ADC │   │ └────┴────┴────┘ └────┴────┘
│       │休眠│    │   │CAN │   │
│       │... │    │   │LIN │   │
│       │    │    │   │SPI │   │
│       │    │    │   │I2C │   │
│       │    │    │   │ETH │   │
└───────┴────┴────┴───┴────┴──┘

                  对应工具：
┌──────────Т─────────────────────────────┬──────┬────┬──────┬──────┐
│ ISOLAR A/B           EB Tresos        │RTAOS │S32DS│ GHS  │Trace│
│ (配置阶段)            (配置阶段)        │(OS)  │(Int)│(Cmp) │(Dbg)│
│                                       │      │     │      │     │
│                                       │  CANoe (Test)      │     │
└───────────────────────────────────────┴──────┴────┴──────┴──────┘
```

**阶段与章节对应表：**

| 阶段 | 模块 | 对应章节 | 产出物 |
|------|------|---------|--------|
| 配置阶段 | SYS | 第 4 章 系统定义 | System.arxml, DBC, LDF |
| 配置阶段 | BSW | 第 5 章 BSW 设计 | BSW 配置 ARXML 和 cfg 代码 |
| 配置阶段 | ASW | 第 6 章 ASW 设计 | SWC ARXML + SWC 骨架代码 |
| 配置阶段 | RTE | 第 7 章 RTE 设计 | Rte.c, SchM.c, Rte_ASW_*.h |
| 配置阶段 | MCAL | 第 9 章 MCAL 设计 / 第 24 章 MCAL深入 | MCAL cfg 代码 + 静态驱动 |
| 配置阶段 | OS | 第 8 章 OS 设计 / 第 23 章 OS深入 | OS 配置 (.rtaos), StartOS.c |
| 集成阶段 | Integration | 第 26 章 工程组织 | 目录结构、sources.mk、链接脚本 |
| 集成阶段 | Compile | 第 26 章 编译链 | *.o 中间文件 |
| 集成阶段 | Link | 第 10 章 链接脚本 | .elf + .map + .hex/.srec |
| 调试阶段 | Debug | 3.4 (调试器) + 3.8.9 (S32DS Debug Config) | 硬件调试会话 |
| 调试阶段 | Test | 3.3 (CANoe Workflow) | 网络仿真、诊断测试 |

**工具与阶段的映射：**

| 工具 | 应用阶段 | 用途 |
|------|---------|------|
| ISOLAR A/B | 配置阶段（SYS/BSW/ASW/RTE） | ECU 配置、SWC 设计、BSW 配置、RTE 生成 |
| EB Tresos | 配置阶段（BSW/MCAL） | BSW 配置、MCAL 配置、cfg 代码生成 |
| RTA-OS | 配置阶段（OS） | OS 专项配置（Task/Counter/Alarm） |
| S32DS | 集成阶段 | 工程组织、编译、链接 |
| GHS (Green Hills MULTI) | 集成阶段（Compile） | 高可靠性编译器（ISO 26262） |
| TRACE32 | 调试阶段 | JTAG/SWD/NEXUS 调试 + 实时追踪 |
| CANoe | 测试阶段 | CAN/LIN/Ethernet 网络仿真与测试 |

---

### 第 2 章 AUTOSAR 分层架构

```
┌─────────────────────────────────────────────┐
│               Application Layer              │
│  SWC-A  ───  SWC-B  ───  SWC-C (Runnables)  │
├─────────────────────────────────────────────┤
│                  RTE Layer                   │
│   Runtime Environment（调度 + 通信中介）      │
├──────────┬──────────────────────────────────┤
│  BSW     │  Services Layer                  │
│          │  (OS, EcuM, BswM, WdgM, Dem, Dcm)│
│          ├──────────────────────────────────┤
│          │  ECU Abstraction Layer           │
│          │  (MCU, GPT, PWM, ICU, ADC, SPI) │
│          ├──────────────────────────────────┤
│          │  MCAL Layer                      │
│          │  (Microcontroller Abstraction)   │
├──────────┴──────────────────────────────────┤
│             Microcontroller                  │
└─────────────────────────────────────────────┘
```

**分层职责：**
- **SWC（Software Component）**：应用逻辑，独立于硬件
- **RTE（Runtime Environment）**：SWC 间的通信总线，由配置生成
- **BSW（Basic Software）**：基础软件层，包含服务、抽象、MCAL
- **MCAL（Microcontroller Abstraction Layer）**：直接操作寄存器的最底层

**2.3 VCU（整车控制器）硬件结构示例**

以下 VCU（Vehicle Control Unit）简要结构框图是一个典型的 AUTOSAR ECU 硬件平台参考，展示了 MCU 与外设的接口映射关系。

```
                      ┌──────────────┐
                      │   电源模块    │
                      └──────┬───────┘
                             │
             ┌───────────────┼───────────────┐
             │               │               │
     ┌───────┴───────┐       │       ┌───────┴───────┐
     │ 模拟量测量     │       │       │ 开关量测量     │
     │ ─ 加速踏板     │       │       │ ─ 充电开关     │
     │ ─ 制动踏板     │       │       │ ─ 启动钥匙     │
     └───────┬───────┘       │       │ ─ 空调开关     │
             │               │       │ ─ 模式开关     │
             ├───────────────┼───────┤ ─ 制动踏板开关 │
             │               │       └───────┬───────┘
             │          ┌────┴────┐          │
             └──────────┤  MCU   ├───────────┘
                        │ (微控) │
             ┌──────────┤        ├───────────┐
             │          └─────────┘           │
             │               │               │
     ┌───────┴───────┐       │       ┌───────┴───────┐
     │  光电隔离      │       │       │  光电隔离      │
     │  + 总线接口    │       │       │  + 继电器驱动  │
     └───────┬───────┘       │       └───────┬───────┘
             │               │               │
             ▼               │               ▼
     ┌───────────────┐       │       ┌───────────────┐
     │  应急仪表显示   │       │       │   继电器组     │
     │ ─ 电机转速     │       │       │ ─ 主继电器     │
     │ ─ 车速         │       │       │ ─ 空调继电器   │
     │ ─ 电池SOC      │       │       │ ─ DC/DC继电器  │
     │ ─ 故障指示灯   │       │       │ ─ 备用继电器   │
     └───────────────┘       │       └───────────────┘
                              │
                     ┌────────┴────────┐
                     │  光电隔离       │
                     │  + 高速CAN接口  │
                     └────────┬────────┘
                              │
                     ┌────────┴────────┐
                     │   高速CAN总线   │
                     └──┬──┬──┬──┬──┬─┘
                        │  │  │  │  │
                        ▼  ▼  ▼  ▼  ▼
                   电机  电池  通信  其它  监控
                   ECU   ECU  节点  节点  节点
```

**模块与 AUTOSAR 分层对应关系：**

| VCU 硬件模块 | AUTOSAR 层次 | 说明 |
|-------------|-------------|------|
| MCU（微控制器） | MCAL + OS | 运行 AUTOSAR OS，MCAL 层直接操作 MCU 寄存器 |
| 模拟量测量（加速/制动踏板） | MCAL Adc → BSW EcuM | 模拟信号 → ADC 采样 → BSW 处理 → ASW 应用 |
| 开关量测量（充电/启动/空调/模式） | MCAL Dio/Icu → BSW EcuM | 数字电平 → GPIO 中断/轮询 |
| 高速 CAN 总线（电机/电池/通信/监控） | MCAL Can → BSW CanIf/PduR/Com → ASW | AUTOSAR 通信栈的标准路径 |
| 光电隔离 | 硬件层（非软件模块） | 隔离模拟前端与 MCU 的数字电平转换 |
| 继电器驱动（主继/空调/DC-DC） | MCAL Pwm/Dio → BSW EcuM/BswM → ASW | 输出控制信号 → 执行器 |
| 应急仪表显示 | ASW 层处理 | 从 CAN 总线上接收电机/电池数据，映射到仪表显示 |
| 电源模块 | MCAL Mcu | MCU 电源状态管理（Normal/Sleep/Stop） |

**VCU 结构对 AUTOSAR 配置的指导意义：**
- 左侧输入通道（模拟量+开关量）决定 Adc/Dio/Icu 的 MCAL 配置需求
- 右侧 CAN 总线决定通信栈（Can/PduR/Com/Dcm）的配置规模
- 继电器输出决定 Pwm/Dio 的输出通道数量
- 应急仪表显示指示了需要从 CAN 总线上接收的信号列表（Com Rx Signal）
- 电源模块决定了 EcuM（ECU Manager）的电源状态机设计

---

### 第 3 章 开发工具链概览

**3.1 典型 AUTOSAR 工具链**

以三大主流厂商 Vector、EB（Elektrobit）、ETAS 为例：

| 工具类型 | Vector | EB (Elektrobit) | ETAS |
|---------|--------|-----------------|------|
| 系统设计 | DaVinci Developer | EB tresos Studio | SystemDesk |
| ECU 配置 | DaVinci Configurator Pro | EB tresos Studio | ISOLAR-A / ISOLAR-B |
| BSW/BSW 配置 | DaVinci Configurator Pro | EB tresos Studio | ISOLAR-B |
| 代码生成 | DaVinci 自带 | EB tresos 自带 | RTA-BSW / RTA-RTE 7.x |
| 标定/测量 | CANape | — | INCA |
| 诊断工具 | CANdela Studio | — | — |
| 网络仿真 | CANoe | — | — |
| 编译器 | Tasking / GCC / Green Hills | Tasking / GCC | Tasking / GCC |

**3.2 ISOLAR-A/B 集成开发环境**

ISOLAR（ETAS 出品，基于 Eclipse 平台）是 AUTOSAR CP 开发的完整 IDE 解决方案。

**ISOLAR 版本说明：**
- **ISOLAR-A**：专注 ASW/RTE 配置（SWC 设计、RTE 生成、VFB 设计）
- **ISOLAR-B**：专注 BSW/MCAL 配置（BSW 模块配置、ECU 提取、代码生成）
- **RTA-RTE**：RTE 代码生成器，从 ARXML 配置生成 RTE 引擎代码（如 v7.0.1）
- **RTA-BSW**：BSW 代码生成器，生成 EcuM、Com、DCM 等模块的动态配置代码

**ISOLAR 的主要视图：**

| 视图名称 | 功能 |
|---------|------|
| AUTOSAR Explorer | 按 AUTOSAR 标准结构浏览项目 |
| AR Explorer | 按 ARXML 包结构浏览 |
| ECU Navigator | 按 ECU 实例定位配置项 |
| Bswsystem Navigator | 按 BSW 模块导航 |
| **BSW Overview** | BSW 模块概览图（分层着色） |
| Traceability View | 追踪需求/配置/代码的映射关系 |

**ECU Configurator 项目导航树：**
```
ECU Configurator
├── TC397 [id 4.2.2]          # 目标芯片 + AUTOSAR 版本
│   ├── Software/
│   │   └── System/
│   ├── Parameter Definitions/   # BSW 模块参数定义
│   ├── Bsw Modules/             # BSW 模块配置
│   │   ├── Com Stack/           # 通信栈
│   │   ├── Memory Stack/        # 存储栈（Fee、NvM）
│   │   ├── Mode Mgm/            # 模式管理
│   │   ├── Services/            # 服务模块
│   │   ├── Bsw Dm/              # BSW 诊断
│   │   └── Other Modules/       # 其他模块
│   ├── Ecuc Value Collections/  # ECUC 配置值
│   ├── Variant Info/            # 变体信息
│   ├── Board/                   # 板级配置
│   ├── Generic Structure/       # 通用结构
│   ├── Ar Metamodel Extensions/ # AR 元模型扩展
│   └── Build Artifacts/         # 构建产物
```

**BSW Overview 视图说明（最重要）：**
该视图以**分层着色框图**展示所有 BSW 模块及其依赖关系。颜色分层与 AUTOSAR 架构严格对应：
- 浅色/紫色区域：**Service Layer**（ComM、Com、NvM、CanTp、SoAd、PduR、IpduM、Nm 等）
- 绿色区域：**Hardware Abstraction**（Spi、Adc、Pwm、Icu、Dio、Port、Mcu、Wdg、MemIf、Fee、Eep、CanIf、EthIf、FrIf）
- 红色区域（下层）：**MCAL / Drivers**（WdgDrv、CanDrv、SpiDrv、EthDrv、Memory Drivers、IO Drivers）
- 黄色便签标注（右侧）：关键路由标记（Ra_SysR、Ra_MemL、Ra_Diag、Ra_Anm、ComStack）

提示：鼠标悬停在任意模块上可查看详细工具提示。

**3.3 Workflow（工作流）面板**

ISOLAR 内置了 AUTOSAR 开发的标准工作流，通过引导式步骤降低配置复杂度：

| 工作流 | 用途 |
|--------|------|
| Can Configuration BSW | CAN 协议栈 BSW 配置 |
| Dbc Can Configuration | 从 DBC 导入 CAN 矩阵 |
| Ecu Extract Bsw Generation | ECU 提取 + BSW 代码生成 |
| Extend SWC Composition to RTE Generation | SWC 组合 → RTE 生成 |
| Component Integration | 组件集成 |
| Component Configuration | 组件配置 |
| FlatView Component Integration | 扁平视图下的组件集成 |

这些工作流可以直接在 ISOLAR 的 Workflow 面板中一键启动，自动化执行配置和代码生成步骤。

**3.4 编译器与调试器**

**编译器选项：**
- **Tasking**：Tricore/Arm 编译器，AURIX 系列标准工具
- **Green Hills（MULTI）**：高可靠性编译器，ISO 26262 认证
- **GCC ARM Embedded**：arm-none-eabi-gcc，NXP S32DS 默认工具链

**调试器（Debug Probe）：**

AUTOSAR 开发的调试器主要分三类：

| 调试器 | 厂商 | 接口 | 适用芯片 | 特色功能 |
|--------|------|------|---------|---------|
| **TRACE32** | Lauterbach | JTAG/SWD/NEXUS/ETM | Arm® Cortex®-A/R/M, TriCore™, RH850, RISC-V, Power Architecture® | 硬件追踪（ETM/NEXUS）、实时分析（Statistical Profiling）、OS 感知（AUTOSAR/FreeRTOS/OSEK） |
| PowerDebug | PLS（iSYSTEM） | JTAG/SWD | Infineon, NXP, Renesas | 功耗测量、逻辑分析 |
| J-Link / J-Trace | SEGGER | JTAG/SWD | Arm Cortex 全系列 | 性价比高、Flash 烧录快、支持 J-Scope |
| PEMicro | NXP | JTAG/SWD | NXP S32K/S32G | 随 S32DS 开发板附带的开箱即用方案 |
| UDE | pls | JTAG/SWD/NEXUS | Infineon AURIX | AUTOSAR OS 调试认证 |

**Lauterbach TRACE32 详解：**

Lauterbach 是全球最大的独立微处理器开发工具制造商，自 1979 年起专注调试器和实时追踪。TRACE32 产品线是汽车嵌入式调试的事实标准。

**支持的调试接口：**
- JTAG（IEEE 1149.1，标准 4/5 线调试接口）
- SWD（Serial Wire Debug，ARM 2 线调试接口）
- NEXUS（IEEE-ISTO 5001，Power Architecture 标准追踪）
- ETM（Embedded Trace Macrocell，ARM 指令跟踪）

**支持的核心架构（>5000 芯片家族）：**
- Arm® Cortex®-A/R/M、Neoverse、Armv9
- RISC-V®
- Power Architecture®
- TriCore™（Infineon AURIX）
- RH850（Renesas）
- Xtensa®（Cadence Tensilica）
- ARC（Synopsys）

**TRACE32 在 AUTOSAR 开发中的典型用途：**

| 调试场景 | 用 TRACE32 做什么 |
|---------|------------------|
| OS 调度验证 | 查看任务/中断执行序列、调度表时序 |
| 实时追踪（Trace） | 记录所有指令执行历史（ETM/NEXUS） |
| OS 感知调试 | 查看 AUTOSAR OS 的任务列表、堆栈使用、资源锁状态 |
| 硬件追踪 + 时间戳 | 分析响应时间、中断抖动、最坏执行时间 |
| 多核同步 | 多核同时调试 + 追踪（TC3xx 的 3 核同步调试） |
| 低功耗调试 | 调试进入/退出 Sleep 模式的时序 |

**Lauterbach 对新芯片的支持（在线演示示例）：**
- NEW SUPPORT FOR NXP S32Z + S32E Real-Time Processors
- 在 chip selection 功能中可搜索指定芯片的 TRACE32 配置文件
- 所有支持的芯片在左侧导航 CHIP: Search for chip 中搜索

**调试器选择的工程考量：**
| 项目类型 | 推荐调试器 | 理由 |
|---------|-----------|------|
| Infineon AURIX TC2xx/TC3xx | Lauterbach TRACE32 | 原生 TriCore/NEXUS 支持，AUTOSAR OS 感知 |
| NXP S32K146/S32K3 | J-Link 或 PEMicro | S32DS 内置 PEMicro 支持，J-Link 烧录快 |
| Renesas RH850 | Lauterbach TRACE32 | RH850 专用追踪支持 |
| 量产测试 | PEMicro 或 J-Link | 批量烧录和自动测试 |
| 时序/性能分析 | Lauterbach TRACE32 | 唯一支持硬件实时追踪的工具 |

**ARXML 编辑：**
- 基于 Eclipse 的开发环境均提供表单编辑器和纯文本编辑器
- ARXML 本质是 XML 格式，也可用任何 XML 编辑器（VS Code、XMLSpy）打开

---

### 3.5 工具界面导航指南（操作篇）

以下基于 ISOLAR-A/B（RTA-RTE 7.x）的实际界面说明工具用法。

**3.5.1 界面总览**

```
┌──────────────────────────────────────────────────────┐
│ 菜单栏: File | Edit | Navigate | Search | Project   │
│         RTE | Run | RTA BSW | Window | Help         │
├──────────────────────────────────────────────────────┤
│ 视图标签页: AUTOSAR Explorer | AR Explorer | ECU    │
│ Navigator | Bswsystem Navigator | BSW Overview | ... │
├──────────────────┬───────────────────────────────────┤
│                  │  BSW Overview 绘图区              │
│  左导航树        │  分层色块（Service/HA/MCAL）      │
│  ECU Config.     │  - 鼠标悬停: 模块工具提示         │
│  ├─ TC397        │  - 点击模块: 跳转配置             │
│  │  ├─ Bsw Mod.  │  - 黄色便签: 路由标记             │
│  │  ├─ Mem Stack │                                   │
│  │  └─ ...       │                                   │
├──────────────────┴───────────────────────────────────┤
│  底部标签页: Properties | Problems | Workflow |	 │
│  Scripts | Error Log | Progress | Search | Config   	 │
│  Logger | Model API View | Catalog | Element Nav   	 │
├──────────────────────────────────────────────────────┤
│  底部面板: Description View | Build Control View    │
│           | Outline                                  │
├──────────────────────────────────────────────────────┤
│  状态栏: [版本号] 时间 日期                           │
└──────────────────────────────────────────────────────┘
```

**3.5.2 视图标签页的作用与用法**

**BSW Overview（最重要视图）：**
- 以分层色块图展示所有 BSW 模块
- 色块位置对应 AUTOSAR 层次（上层=Service Layer，中层=Hardware Abstraction，下层=MCAL）
- 操作：点击任意模块 → 自动跳转到该模块的 ECUC 参数配置页
- 操作：鼠标悬停 → 弹出工具提示（模块版本、配置状态、依赖关系）
- 黄色便签（Ra_SysR、Ra_MemL、Ra_Diag 等）= 信号路由标记，指示模块间数据流
- 适用阶段：ASW 设计完成后、BSW 精细化配置时

**AUTOSAR Explorer：**
- 按 AUTOSAR 元模型树形结构浏览整个项目
- 展开树节点可查看：ARPackage → 模块定义 → 容器 → 参数
- 适用阶段：系统定义导入/导出、全局参数搜索

**AR Explorer：**
- 按 ARXML 包结构直接浏览文件级内容
- 可查看每个 arxml 文件中定义的完整内容
- 适用阶段：ARXML 合并/差异对比

**ECU Navigator：**
- 按 ECU 实例浏览配置
- 从系统定义的 ECU 实例出发，逐级进入模块配置
- 适用阶段：多 ECU 项目中的单体 ECU 配置

**Bswsystem Navigator：**
- 按 BSW 模块名称字母序排列，快速定位任意 BSW 模块
- 适用阶段：已知模块名、快速修改参数时

**Traceability View：**
- 显示配置项的追踪关系（需求 → 配置 → 代码）
- 适用阶段：需求追溯、配置评审

**3.5.3 底部标签页的功能**

| 标签页 | 用途 | 使用场景 |
|--------|------|---------|
| Properties | 显示选中模块的属性 | 查看/编辑模块参数 |
| Problems | 显示配置错误/警告 | 运行配置检查后查看问题 |
| **Workflow** | 工作流引导面板 | **日常配置入口** |
| Problems Log | 问题的详细日志 | 调试配置问题 |
| Modules Explorer | 模块资源浏览器 | 浏览 BSW 模块资源树 |
| Scripts | 运行 Python 脚本 | 自动化配置操作 |
| Error Log | 工具运行错误日志 | 工具崩溃或异常时查看 |
| Progress | 显示后台任务进度 | 代码生成/导入导出时 |
| Search | 全局搜索 | 搜索模块/参数/配置项 |
| Configuration Logger | 配置变更日志 | 审计配置变更 |
| Model API View | 模型 API 控制台 | 高级用户调试 AUTOSAR 模型 |
| Catalog Navigator | 目录浏览器 | 浏览 ECUC 参数目录 |
| Element Navigator | 元素定位器 | 按 AUTOSAR 元类型导航 |

**3.5.4 Workflow 面板的完整用法**

Workflow 面板是 ISOLAR 的配置引导工具，界面包含：

- **项目选择**：下拉框选择当前项目（如 TC397）
- **搜索栏**：Search / Search Inner Modules → 按关键词过滤工作流
- **操作按钮**：Create Workflow（新建）/ Import（导入）/ Export（导出）
- **结果数量**：Results = 11（默认标准工作流数量）
- **排序**：按名称（Sort By Name）
- **筛选圆点**：All（全部）/ 🕐 Recent（最近使用）/ 🟦 Software（软件）/ 🟪 System（系统）/ 🟥 BSW（基础软件）

**标准工作流列表（7 个常用）：**

| 工作流 | 用途 | 输入 | 输出 |
|--------|------|------|------|
| Can Configuration BSW | CAN 协议栈 BSW 配置 | DBC + ECUC 参数 | Can 模块配置代码 |
| Dbc Can Configuration | 从 DBC 导入 CAN 矩阵到系统定义 | DBC 文件 | CAN 通信相关 ARXML |
| Ecu Extract Bsw Generation | ECU 提取后生成 BSW 代码 | ECU 提取 ARXML | BSW 动态配置代码 |
| Extend SWC Composition to RTE Generation | SWC 组合设计完成后生成 RTE | ASW 设计 ARXML | RTE 代码 + SchM |
| Component Integration | 组件集成 | 各模块生成代码 | 集成后的工程 |
| Component Configuration | 组件配置 | 基础 ARXML | 完整的 ECUC 配置 |
| FlatView Component Integration | 扁平视图下的组件集成 | 分层配置 | 扁平化集成结果 |

**用法步骤：**
1. 从筛选圆点选择范围（通常选 All 或 🟥 BSW）
2. 在列表中找到目标工作流（如 Dbc Can Configuration）
3. 双击或右键 → Run 启动
4. 按向导提示依次完成各步骤
5. 每个步骤完成后自动记录到 Progress 标签页

**3.5.5 导航树（ECU Configurator）用法**

左侧导航树是日常配置操作的核心入口：

```
ECU Configurator
├── TC397 [id 4.2.2]          # ← 双击: 打开项目属性
│   ├── Software/              # 系统层配置
│   │   └── System/            # 系统定义引用
│   ├── Parameter Definitions/ # BSW 模块参数定义（只读，来自厂家）
│   │                           # → 右键可查看依赖关系
│   ├── Bsw Modules/           # ← 日常操作最频繁的目录
│   │   ├── Com Stack/         # 通信栈（点击展开各模块）
│   │   │   ├── Can/           # CAN 驱动
│   │   │   ├── CanIf/         # CAN 接口
│   │   │   ├── CanTp/         # CAN 传输层
│   │   │   ├── PduR/          # ← 最常用的路由模块
│   │   │   ├── Com/           # 通信管理器
│   │   │   └── ...
│   │   ├── Memory Stack/      # 存储栈
│   │   │   ├── Fee/           # Flash 模拟 EEPROM
│   │   │   │   └── FeeInit    # 双击打开初始化参数
│   │   │   └── NvM/           # NVRAM 管理器
│   │   ├── Mode Mgm/          # 模式管理
│   │   ├── Services/          # 服务模块
│   │   ├── Bsw Dm/            # BSW 诊断
│   │   └── Other Modules/
│   ├── Ecuc Value Collections/# ECUC 配置值（保存具体参数值）
│   ├── Variant Info/          # 变体信息
│   ├── Board/                 # 板级配置
│   ├── Generic Structure/     # 通用结构定义
│   ├── Ar Metamodel Extensions/# AUTOSAR 元模型扩展
│   └── Build Artifacts/       # 构建工件配置
```

**导航树操作口诀：**
- 找模块配置 → Bsw Modules/
- 找系统信号 → Software/System/
- 找参数定义 → Parameter Definitions/
- 找配置值 → Ecuc Value Collections/
- 找板级引脚 → Board/

**3.5.6 底部面板的使用**

| 面板 | 位置 | 功能 |
|------|------|------|
| Description View | 底部左侧 | 选中模块的功能描述和说明文档 |
| Build Control View | 底部中间 | 编译控制（增量/全量编译）和构建配置 |
| Outline | 底部右侧 | 当前文档/配置的大纲视图，快速跳转 |

**3.5.7 菜单栏各菜单的用途**

| 菜单 | 主要功能 |
|------|---------|
| File | 导入/导出 ARXML、保存配置、关闭项目 |
| Edit | 撤销/重做、参数批量修改 |
| Navigate | 按模块/参数名跳转 |
| Search | 全文搜索、按类型搜索 |
| Project | 构建项目、清理、刷新 |
| RTE | RTE 代码生成、RTE 配置验证 |
| Run | 运行工作流、启动代码生成 |
| RTA BSW | BSW 代码生成、BSW 配置检查 |
| Window | 视图切换、重置透视图 |
| Help | 文档、版本信息、更新 |

**3.5.8 AUTOSAR Contents Tree 视图与 BSW Modeling Workflow**

ISOLAR 的 AUTOSAR Contents Tree 视图按 AUTOSAR BSW 模块层级组织 ECUC 参数值，不同于 ECU Configurator 导航树的芯片/堆栈分组方式。

**进入方式：**
- 双击 .arxml ECUC 值文件（如 Project_EcuValues.arxml）
- 编辑器自动切换到此视图

**Contents Tree 层级示例（VCU Starter 项目）：**
```
AUTOSAR
└── ETAS_Project
    └── EcuModuleConfigurationValues
        ├── CanNm   CAN 网络管理
        ├── ComM    通信管理器
        ├── CanIf   CAN 接口
        ├── CanSM   CAN 状态管理器
        ├── PduR    PDU 路由器
        ├── EcuC    ECU 配置
        ├── Com     通信模块
        └── NvM     NVRAM 管理器
```

**与 ECU Configurator 导航树的区别：**
ECU Configurator = 按芯片/堆栈/分组树组织（适合全局参数查看）
AUTOSAR Contents Tree = 按模块名组织（适合快速定位单个 BSW 模块参数）

**BSW Modeling Workflow 控制台日志解读：**
BSW 配置导出时 Console 输出工作流引擎日志：

BSW Modeling workflow Engine 1.3.21 (oAW openArchitectureWare)
running workflow: GeneratedBsw.csv
BswschronizedElementComponent: executing "GenerateBsw"
workflow completed in 1799ms

关键参数：Engine 1.3.21 = 工作流引擎版本 / GenerateBsw = 配置代码生成 / 1799ms = 耗时

**典型操作流：**
打开 .arxml → AUTOSAR Contents Tree 列表 → 双击 BSW 模块 → Properties 编辑参数 → 右键 Run Checks → Workflow GenerateBsw → Console 查看日志

**PDU Trace View（PDU 追踪视图）：**
右侧面板，可视化追踪 PDU 路由路径（Com → PduR → CanIf）。

---

**3.6 EB tresos Studio 界面导航（操作篇）**

EB tresos Studio（Elektrobit 出品）是 AUTOSAR 开发的另一款主流 IDE，与 ETAS ISOLAR、Vector DaVinci Configurator 并列为三大 ECU 配置工具。以下基于 tresos 27.12.0 版本的实际界面。

**3.6.1 界面布局**

```
┌──────────────────────────────────────────────────────┐
│ trecs 27.12.0 - workspace: D:\tresos\workspace     │
├──────────────────────────────────────────────────────┤
│ 菜单: File | Edit | Search | Project | Window | Help│
├─────────────────┬────────────────────┬──────────────┤
│                 │                    │  Workflow     │
│ Project Explorer│  编辑器区域（空白） │  No workflow  │
│                 │                    │  selected     │
│ ├─ Eth_Internal │  未打开任何配置    │               │
│ │  Loopback_    │                    │  No workflow  │
│ │  S32G274A_M7  │                    │  selected     │
│ ├─ Fls_Example_ │                    ├──────────────┤
│ │  S32G274A_M7  │                    │ No desc.     │
│ └─ S32K         │                    │              │
│                 │                    │              │
├─────────────────┴────────────────────┴──────────────┤
│ 底部标签页: Properties | Information | Problems     │
│ View | Error Log | Search                            │
├──────────────────────────────────────────────────────┤
│ 状态栏: 0 items selected | 时间 1:04 | 2022/6/27    │
│ Working File: untitled1.awml                        │
└──────────────────────────────────────────────────────┘
```

**3.6.2 视图说明**

| 视图 | 位置 | 功能 |
|------|------|------|
| Project Explorer | 左上 | 显示工作区所有 AUTOSAR 项目，双击展开模块树 |
| Outline | 左下 | 当前文件的大纲视图（无文件时显示 An outline is not available） |
| Workflow | 右上 | 工作流引导面板（选择项目后显示可用工作流） |
| Description | 右侧下方 | 选中模块/参数的描述说明 |
| Properties | 底部左 | 选中配置项的属性编辑 |
| Information | 底部中 | 编译/配置过程的日志信息 |
| Problems View | 底部右 | 配置检查错误/警告列表 |
| Error Log | 底部 | 工具运行错误日志（工具崩溃/异常时查看） |
| Search | 底部 | 全局搜索所有项目文件 |

**3.6.3 项目结构说明**

Project Explorer 中的项目以 **芯片 + 应用场景** 命名：

| 项目名 | 芯片 | 功能 |
|--------|------|------|
| Eth_InternalLoopback_S32G274A_M7 | S32G274A（NXP） | 以太网内部回环测试，M7 核 |
| Fls_Example_S32G274A_M7 | S32G274A（NXP） | Flash 示例工程，M7 核 |
| S32K | S32K 系列 | 通用 S32K 项目 |

**关于 EB tresos Studio 的命名习惯：**
- 项目名通常包含芯片名 + 核（M7、M4） + 功能模块名
- S32G 是 NXP 的车规级网关芯片，含 M7 和 M4 双核
- S32K 是 NXP 的通用汽车 MCU 系列

**3.6.4 与 ISOLAR 的功能对比**

| 特性 | EB tresos Studio | ISOLAR-A/B (ETAS) | DaVinci Configurator (Vector) |
|------|-----------------|-------------------|-------------------------------|
| 厂商 | Elektrobit | ETAS | Vector |
| 适用芯片 | NXP S32K/S32G, Infineon TCx | Infineon TCx, Renesas RH850 | 全平台 |
| 工作流 | 内置于 Workflow 面板 | 内置于 Workflow 面板 | 通过 Project 菜单 |
| MCAL 配置 | 含 MCAL 配置插件 | 依赖芯片厂家插件 | 独立 MCAL 工具 |
| 项目组织 | 一个 workspace 可以放多项目 | 每个项目独立 | 类似 |
| 免费版本 | 有社区版 | — | 大客户授权 |
| Eclipse 基础 | 是 | 是 | 是 |

**3.6.5 基本操作——打开现有项目**

1. 启动 EB tresos Studio，选择 workspace 路径
2. 在 Project Explorer 中展开目标项目（如 S32K）
3. 双击项目名称或展开 Bsw Modules/ 树节点
4. 打开一个具体的模块配置（如 Can、NvM、EcuM）
5. 此时：
   - Workflow 面板会显示该项目可用的工作流列表
   - Properties 视图会显示选中模块的参数
   - 编辑器区域打开模块的配置表单

**3.6.6 tresos Studio 的配置检查与构建**

- **配置检查**：右键项目 → Run Checks → 结果展示在 Problems View 标签页
- **代码生成**：右键项目 → Generate Code → 生成 BSW 模块的 cfg 动态代码
- **构建**：菜单 Project → Build Project → 编译整个 AUTOSAR 工程

**3.6.7 EB tresos 与 ISOLAR 的操作差异**

| 操作 | EB tresos Studio | ISOLAR-A/B |
|------|-----------------|------------|
| 打开导航树 | Project Explorer 双击展开 | ECU Configurator 树节点展开 |
| 查看 BSW 模块总览 | 每个模块独立配置页 | BSW Overview 分层色块图 |
| 工作流启动 | Workflow 面板（需要选中项目） | Workflow 面板（Project 下拉选择） |
| 搜索模块 | Quick Access 搜索框 或 Search 标签页 | Search 标签页 |
| Mcal 配置 | 通过 MCAL 配置插件（同厂家包） | 通过 ECU Configurator Parameter Definitions |

注意：EB tresos Studio 没有 ISOLAR 的 BSW Overview 层叠色块图功能，BSW 模块以树形结构呈现，配置入口在树节点的子节点中。

### 3.7 DaVinci Developer / DaVinci Configurator Pro 界面导航

DaVinci（Vector 出品）提供 AUTOSAR 开发的两款关键工具。

**DaVinci Developer：**
- 专注 ASW / RTE 设计阶段
- 可视化的 SWC（Software Component）设计器
- 通过拖拽方式定义端口、接口、Runnables 和触发事件
- 核心功能：SWC 组合 → RTE 生成

**DaVinci Configurator Pro：**
- 专注 BSW / MCAL 配置阶段
- 加载 ARXML 配置文件，生成 BSW 模块配置代码
- 包含图表化 BSW 模块配置编辑器（类似 ISOLAR 的 BSW Overview）
- 支持 ECUC 参数编辑、模块间依赖检查、代码生成

**DaVinci 工具链在项目中的分工：**

```
         SystemDesk / DaVinci Developer（系统设计 + ASW）
                        │
                        ↓  SWC 定义 ARXML
          DaVinci Configurator Pro（BSW 配置 + 代码生成）
                        │
             ┌──────────┼──────────┐
             ↓          ↓          ↓
        BSW 代码    RTE 代码    MCAL 配置
             ↓          ↓          ↓
         ┌─────────────────────────────┐
         │      Target Compiler        │
         │   (Tasking / GCC / GHS)     │
         └─────────────────────────────┘
```

**DaVinci Developer 的使用流程：**
1. 导入系统定义 ARXML → 打开已有 SWC 组合
2. 创建新 SWC：右键 → New AtomicSWC
3. 添加端口：选中 SWC → 在 Ports 面板添加 P-Port 或 R-Port
4. 定义接口：为端口分配 SenderReceiverInterface 或 ClientServerInterface
5. 创建 Runnables：在 InternalBehavior 中定义 RunnableEntity
6. 分配触发事件：TimingEvent / DataReceivedEvent / OperationInvokedEvent
7. 连接 SWC：拖拽连线建立端口间连接
8. 验证：Project → Validate → 查看 Error/Warning 列表
9. 生成输出：RTE Generate → 得到 Rte.c + SchM.c + SWC 骨架代码

**DaVinci Configurator Pro 的使用流程：**
1. 启动 → 创建新工程或导入现有 .vcproj 文件
2. 导入系统 ARXML（包括 DBC、CDD 等外部文件）
3. 在 BSW 模块树中配置每个模块（Can、PduR、Com、Dcm、EcuM、NvM 等）
4. 模块依赖检查：右键模块 → Check Dependencies
5. 全局检查：Project → Run Configuration Check
6. 代码生成：Project → Generate Code → 输出 BSW 动态配置代码
7. 查看输出：在 Output/ 目录下确认代码生成完整

**与 ISOLAR 的关键差异：**
- ISOLAR 是一款 IDE 同时完成 ASW + BSW + MCAL 三个层次
- DaVinci 则需要 Developer 和 Configurator Pro 两款工具配合
- DaVinci 的 BSW 配置以树形图为主，不带 BSW Overview 色块图
- DaVinci 的 RTE 生成在 Developer 中完成（ISOLAR 是在 RTE 透视图生成）

**DaVinci Configurator Pro 的 ECUC 参数编辑：**
- 参数按 ARXML 容器结构组织（Container → Parameter → Value）
- 使用 Symbolic Name 关联跨模块参数（如 PduR 路由表引用 CanIf 的 TxConfirmation）
- 使用 Value Matrix Editor 批量编辑多个变体的参数值
- 使用 Expression Editor 设置条件化参数（如 "if CAN0_BAUDRATE == 500000 then..."）

**DaVinci 工具的常见操作快捷键：**
| 操作 | 快捷键 |
|------|--------|
| 全局搜索 | Ctrl + H |
| 保存全部 | Ctrl + Shift + S |
| 验证项目 | Ctrl + V |
| 代码生成 | Ctrl + G |
| 打开/关闭 Outline | Ctrl + O |

### 3.8 NXP 工程集成编译环境

S32 Design Studio（S32DS）是 NXP 官方嵌入式 IDE，支持 S32K/S32G 系列 MCU 的 AUTOSAR MCAL 包集成与固件编译。

**3.8.1 NXP AUTOSAR 工具链全景**

```
┌─────────────────────────────────────────────────────────────────────┐
│                        AUTOSAR 配置阶段                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  EB tresos Studio（ECU 配置 + BSW 代码生成）                         │
│       │                                                             │
│       ↓  输出 .arxml 配置 + 动态 MCAL cfg 代码                       │
│                                                                     │
│  NXP MCAL 包（厂家静态 SDK）                                         │
│       │                                                             │
│       ↓  输出 SDK/platform/drivers/ 下的 .c/.h 驱动                  │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│                        编译集成阶段                                  │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  S32 Design Studio（Eclipse 平台）                                   │
│       │                                                             │
│       ├── 导入 MCAL cfg 代码（EB tresos 输出）                       │
│       ├── 导入 MCAL 静态代码（NXP SDK 包）                          │
│       ├── 导入 ASW 手写代码（用户工程）                              │
│       ├── 导入 FreeRTOS 或 FreeRTOS（RTOS 层）                      │
│       └── 配置链接脚本 .ld + 启动文件 startup.s                      │
│                                                                     │
│  arm-none-eabi-gcc 编译链                                           │
│       │                                                             │
│       ↓  .elf（可执行文件）+ .map（内存映射）+ .hex/.srec（烧录文件）  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
```

**3.8.2 S32DS 界面介绍**

| 组件 | 位置 | 功能说明 |
|------|------|---------|
| Project Explorer | 左侧 | 列出 workspace 中所有工程；每一层按路径组织（如 freertos_S32K146/src/、SDK/platform/drivers/clock/） |
| Dashboard | 左侧面板 | 快捷功能入口（新建 Project、Build/Clean/Debug、Settings） |
| 编辑器区域 | 中央 | 支持多标签页：.c / .h / .s（汇编）/ .ld（链接脚本）/ .mk（makefile） |
| Outline / Build Targets | 右侧 | 当前文件的符号大纲（函数列表、变量列表）；编译目标面板（make all/clean） |
| Console | 底部 | 编译日志输出（arm-none-eabi-gcc 调用日志、链接脚本加载、错误定位） |
| Problems / Tasks | 底部 | 编译错误/警告列表（双击跳转到源码） |
| Properties | 底部 | 选中文件的属性/编译器设置 |

**3.8.3 S32DS 工程结构详解（以 freertos_S32K146 为例）**

工程在磁盘上的目录布局以**模块化方式组织**，每个子目录对应一个软件组件：

```
freertos_S32K146/
│
├── src/                                # 用户源文件目录
│   ├── main.c                          # 主函数入口
│   └── user_app.c                      # 应用逻辑
│
├── board/                              # 板级初始化
│   ├── board.c                         # 板级外设初始化（GPIO、时钟源选择）
│   └── board.h
│
├── SDK/                                # NXP SDK（芯片厂商提供）
│   ├── rtos/FreeRTOS/                  # FreeRTOS 实时操作系统移植
│   │   ├── Source/
│   │   │   ├── include/                # FreeRTOS 内核 API 头文件
│   │   │   ├── portable/
│   │   │   │   ├── MemMang/heap_4.c    # 堆内存管理策略（heap_4 = 合并空闲块）
│   │   │   │   └── GCC/ARM_CM0F/       # S32K146 的 FreeRTOS 移植层（Cortex-M0+）
│   │   │   └── *.c                     # FreeRTOS 内核源码（tasks.c、queue.c 等）
│   ├── platform/drivers/               # MCAL 驱动层
│   │   ├── src/clock/
│   │   │   └── S32K1xx/               # S32K1xx 时钟配置（PLL、分频器、SOSC/PIRC/FIRC）
│   │   ├── src/interrupt/              # 中断向量重定向
│   │   └── S32K146/startup/           # 启动文件（reset_handler、中断向量表）
│
├── Project_Settings/                   # 工程配置
│   ├── Startup_Code/                   # 启动代码
│   │   └── startup_S32K146.s           # 汇编启动文件（定义 Reset_Handler 入口）
│   └── Linker_Files/                   # 链接脚本
│       └── S32K146_128_flash.ld        # Flash/RAM 地址空间定义
│
├── makefile                            # 顶层 Makefile（自动生成，勿手动编辑）
├── sources.mk                          # 源文件列表（所有 .c 文件路径）
├── objects.mk                          # 目标文件列表（.c → .o 映射关系）
├── subdir.mk                           # 子目录编译规则
└── subdir.mk ...
```

**模块间调用关系图：**

```
startup_S32K146.s（汇编入口）
    │  设置 SP 指针
    │  将 .data 从 Flash 复制到 RAM
    │  清 .bss 段
    ↓
board.c（板级初始化）
    │  SOSC → PLL → CORE_CLK / BUS_CLK 配置
    ↓
main.c（用户代码入口）
    │  PRDM_Init() → FreeRTOS 启动 → vTaskStartScheduler()
    ↓
SDK/platform/drivers/（MCAL 驱动）
     ── clock_S32K1xx.c（时钟树）
     ── interrupt_S32K1xx.c（中断管理）
     ── ...
```

**3.8.4 makefile 结构详细解读**

S32DS 使用 GNU Make 构建系统，整个构建由 **include 链**驱动：

```
顶层 makefile
    ├── include ../makefile.init        # 编译环境初始化（工具链路径、全局变量）
    ├── include sources.mk              # 全部 .c 源文件集合（SDK + user 合并在内）
    ├── include src/subdir.mk           # 用户源文件子目录编译规则
    ├── include board/subdir.mk         # 板级文件编译规则
    ├── include SDK/rtos/FreeRTOS/...   # 每个 SDK 组件独立 .mk（模块化编译）
    ├── include SDK/platform/...        # MCAL 驱动子目录的 .mk
    ├── include Project_Settings/...    # 启动文件和链接脚本所在目录的 .mk
    ├── include subdir.mk               # 递归规则
    ├── include objects.mk              # .c → .o 映射表
    ├── include ../makefile.defs        # 编译/链接默认标志定义
    │
    └── 链接目标（最终构建产物）：
        freertos_S32K146.elf: $(OBJS) $(LD_SCRIPT)
            arm-none-eabi-gcc -T "S32K146_128_flash.ld"    ← 指定链接脚本
                -Wl,-Map,freertos_S32K146.map                ← 输出内存映射
                -Xlinker --gc-sections                        ← 移除未使用段
                -O1                                           ← 优化级别
                -o "freertos_S32K146.elf" $(OBJS)

        大小检查目标：
        freertos_S32K146.siz: freertos_S32K146.elf
            arm-none-eabi-size --format=berkeley $^            ← Berkeley 格式输出 text/data/bss 分隔
```

**链接脚本的关键 Section 布局（S32K146_128_flash.ld）：**
```
MEMORY
{
    m_interrupts          (RX)  : ORIGIN = 0x00000000, LENGTH = 0x00000400  /* 1KB 中断向量表 */
    m_flash_config        (RX)  : ORIGIN = 0x00000400, LENGTH = 0x00000010  /* 16字节 Flash 配置 */
    m_text                (RX)  : ORIGIN = 0x00000410, LENGTH = 0x0007FBF0  /* 程序代码 */
    m_data                (RW)  : ORIGIN = 0x1FFF8000, LENGTH = 0x00008000  /* 32KB SRAM */
}

SECTIONS
{
    .interrupts   : { *.o(.isr_vector) } > m_interrupts     /* 中断向量表必须位置 0x0 */
    .flash_config : { *.o(.FlashConfig) } > m_flash_config   /* Flash 时钟/保护配置 */
    .text         : { *(.text) *(.rodata) } > m_text         /* 代码 + 只读数据 */
    .data         : { *(.data) } > m_data AT > m_text        /* 初始化全局变量（RAM 运行，Flash 存储） */
    .bss          : { *(.bss) } > m_data                     /* 未初始化全局变量 */
    .heap         : { ... } > m_data                         /* 堆 */
    .stack        : { ... } > m_data                         /* 栈 */
}
```

**3.8.5 Bootloader + Application 双工程设计**

S32DS Project Explorer 中的 `bootstraploader_S32K` + `freertos_S32K146` 是典型的**双工程结构**：

| 工程 | 功能 | 起始地址 | 链接脚本 |
|------|------|---------|---------|
| bootstraploader_S32K | Bootloader（IAP 升级引导） | 0x0000 （Flash 首地址） | 专用 .ld（较小 Flash 区域） |
| freertos_S32K146 | Application（用户应用） | 0x8000 之后（APP 起始地址） | 带偏移地址的 .ld |

**Bootloader 的职责：**
1. 上电检测更新标志（如 GPIO 电平或 Flash 标记）
2. 如果没有更新请求 → 跳转到 Application 起始地址
3. 如果有更新请求 → 通过 CAN/UART 接收固件 → 写入 APP Flash 区域 → 校验 CRC → 跳转

**Application 端的配合：**
- 中断向量表偏移：在 startup.s / main 中调用 `SCB->VTOR = APP_BASE_ADDR`
- 链接脚本起始地址设置为 bootloader 结束后的位置

**3.8.6 NXP MCAL 包结构详解**

NXP 为 S32K1xx/S32G 提供的官方 MCAL 包以目录方式组织，每个外设对应一个独立模块：

```
SDK/platform/drivers/
├── src/clock/
│   ├── clock_S32K1xx.c          ← 时钟 MCAL（包含 SOSC/PIRC/FIRC/PLL 配置）
│   ├── clock_S32K1xx.h
│   └── S32K1xx/
│       └── clock_ip.c           ← MCU 特定时钟配置实现
├── src/interrupt/
│   ├── interrupt_S32K1xx.c       ← 中断 MCAL（向量优先级设置、使能/禁用）
│   └── interrupt_S32K1xx.h
├── S32K146/startup/
│   ├── startup.c                 ← C 环境初始化（.data/.bss 段操作）
│   ├── device_registers.h        ← S32K146 寄存器定义（struct + bitfield）
│   ├── system_S32K146.c          ← SystemInit() 函数
│   └── system_S32K146.h
├── src/pins/                     ← Pin 配置（Port MCAL）
├── src/edma/                     ← eDMA MCAL
├── src/lpspi/                    ← LPSPI MCAL  
├── src/lpi2c/                    ← LPI2C MCAL
├── src/lpuart/                   ← LPUART MCAL
├── src/can/                      ← CAN/FlexCAN MCAL
└── ...                            ← 其他外设
```

**MCAL 包版本命名规则：**
- V1.0.5 三位版本号：主版本.次版本.补丁版本
- AS4.2.2 绑定 AUTOSAR 4.2.2 标准
- 厂商（V1.0.5）+ 标准（AS4.2.2）双编码

**3.8.7 集成编译完整流程**

从 EB tresos Studio 配置到 S32DS 生成 .elf 的完整步骤：

```
[1] EB tresos Studio 中配置 BSW 参数（MCU/时钟、Can、PduR、NvM 等）
    ↓ 生成 MCAL cfg 配置代码

[2] 将 cfg 代码导入 S32DS 工程
    ├── 复制到 SDK/platform/drivers/ 中对应模块的 cfg/ 目录
    ├── 修改 sources.mk 添加新 cfg 文件的编译路径
    └── 修改 objects.mk 更新 .o 目标文件映射

[3] 配置链接脚本（S32K146_128_flash.ld）
    ├── 确认 MEMORY 区域的起始地址和长度
    ├── 确认 NvM/Flash 模拟 EEPROM 需要的独立 Flash 扇区
    └── 确认中断向量表地址（bootloader + app 双工程需要做 VTOR 偏移）

[4] 配置编译器选项
    ├── Debug：-g -O0 -DDEBUG（调试信息 + 无优化 + DEBUG 宏）
    ├── Release：-Os -DNDEBUG（尺寸优化 + 无调试宏）
    └── CFG 宏：通过 -D$(MODULE)_CFG="${workspace_loc:/${ProjName}/SDK/...}" 传递配置路径

[5] 构建（Build All）
    └── arm-none-eabi-gcc 遍历每个 .c → 生成 .o → 链接 → 输出 .elf + .map

[6] 烧录
    ├── S32 Flash Tool（NXP 官方烧录工具）
    ├── PEMicro / J-Link Debug Probe
    └── UART Bootloader（通过 bootstraploader_S32K 工程）

[7] 调试
    └── S32DS Debug 窗口 → launch configuration → 单步 / 断点 / 内存查看
```

**实际工程中的常见问题：**

| 问题 | 症状 | 排查方向 |
|------|------|---------|
| 链接脚本溢出 | .text 超过 m_text LENGTH | 检查代码量、优化级别，或扩大 Flash 分区 |
| 中断不响应 | 中断函数不触发 | 检查 startup_S32K146.s 中的向量表是否包含该中断名 |
| MCAL 配置不生效 | 时钟频率不对 | 对比 EB tresos 生成的 cfg 代码与实际 .ld 中 MEMORY 对齐 |
| FreeRTOS 任务不调度 | 任务卡在 prvStartFirstTask | 检查 SysTick 中断是否配置、FreeRTOSConfig.h 中的时钟频率 |
| Bootloader 跳转失败 | 跳转到 APP 地址后死机 | 确认 APP 工程的中断向量偏移（SCB->VTOR）设置正确 |
| 工具链版本不匹配 | 编译报链接器错误 | 检查 arm-none-eabi-gcc 版本与 NXP SDK 要求的版本是否一致 |

**3.8.8 Hex Editor 与二进制文件查看**

S32DS 内置 Hex Editor（十六进制编辑器），用于查看编译后的 .elf 文件的二进制内容，常用于调试和固件验证。

**Hex Editor 适用场景：**
- 检查链接后的地址分配是否正确（代码段/数据段/向量表位置）
- 验证中断向量表内容（确认 ISR 跳转地址正确）
- 检查常量和固件的校验和
- 逆向分析编译后的二进制指令（Thumb/Thumb-2 指令集）

**打开 Hex Editor：**
1. 在 Project Explorer 中展开 `[Project]/Debug_FLASH/` 目录
2. 双击 `freertos_s32k146.elf` 文件（或右键 → Open With → Hex Editor）
3. 编辑器以 Offset（偏移地址）+ 十六进制 ASCII 视图展示

**Hex View 各列含义：**
```
Offset        0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  ASCII
───────      ───────────────────────────────────────────────  ───────
00001680:    FF FF FF EA FD 35 48 18 6B 80 42 18 00 24 34 88  .N5DH.k.B...$4.
│             ├── 16 字节十六进制数据 ──┤                     ├── ASCII ─┤
│            每个地址对应 Flash 中的一个字节                  │可读字符
← 文件偏移地址（十六进制）                                     │（不可读用 . 代替）
```

**Hex View 中的 ARM Cortex-M 指令识别：**

以地址 0x1680 处的数据为例（对应 Flash 地址 0x1680-0x168F）：
```
FF FF FF EA  ← 这是一条 B 指令（无条件跳转）
                  EA = 32 位 B 指令的高 8 位
                  FF FF FF = 向前跳转约 3MB
                  常见于 Flash 重新映射后的跳转逻辑

FD 35 48 18  ← 这可能是 LDR（加载寄存器）指令
                  48 开头的 Thumb 指令通常为 LDR/LDRB
                  18 = 立即数偏移

18 6B 80 42  ← CMP（比较）+ STR（存储）指令序列
                  42 80 = CMP R0, #0x80
                  18 6B = STR R3，[R3，R0]
```

**查看文件属性：**
- 底部状态栏显示：`File size: 896,504 bytes`（约 876KB）
- Project Explorer 中 .elf 文件标记为 `[arm/le]`（ARM Little Endian，小端序）

**多工程结构的 Hex 对比：**
同一 workspace 中并存多个 MCU 工程时（如 S32K146 + S32K118），可以分别打开各自的 .elf 文件对比：
- bootloader_s32k：Bootloader 固件（较小，~几十 KB）
- freertos_s32k146：主应用固件（S32K146，约 876KB）
- freertos_s32k118：从机/附属板固件（S32K118，Cortex-M0+）
- 不同 MCU 工程的 Hex 数据不能互换（指令集和地址映射不同）

**3.8.9 S32DS Debug Configurations（调试配置）**

S32DS 支持多款调试探针（Debug Probe），通过 Debug Configurations 对话框配置调试会话。

**打开 Debug Configurations：**
- 菜单 Run → Debug Configurations
- 或快捷键（Eclipse 标准 Alt+R, D / Debug 按钮下拉）

**支持的调试探针类型：**

| 类型 | 说明 | 配置数（示例） |
|------|------|---------------|
| GDB PEMicro Interface Debugging | PEMicro 调试器（默认随 S32DS 开发板附带） | 4 个配置 |
| **GDB SEGGER J-Link Debugging** | SEGGER J-Link（第三方，支持 S32K/S32G） | **4 个配置** |
| Launch Group | 启动组（同时调试多个工程/boot+app） | 多选 |
| S32 Debugger | NXP 原生调试器接口 | 1 个配置 |

**J-Link 调试配置详解（以 freertos_s32k146_debug_flash_jlink 为例）：**

**Main（主标签页）：**
| 参数 | 值 | 说明 |
|------|-----|------|
| Project | freertos_s32k146 | 目标工程 |
| C/C++ Application | Debug_FLASH/freertos_s32k146.elf | 调试用的可执行文件 |
| Enable auto build | ✓ | 调试前自动重新编译 |
| Build configuration | Debug_FLASH | 编译配置（Debug/Release） |

**Debugger（调试器标签页）：**
配置调试探针接口参数（GDB 端口、SWD/JTAG 速度、目标芯片选型）

**Startup（启动标签页）：
配置下载到 Flash 后的起始动作（复位类型、PC 初始位置、Halt 或 Run）

**Source（源码标签页）：
源码搜索路径映射（确保调试时能找到对应的 .c 源文件）

**Common（通用标签页）：
保存配置的范围（本地文件 / 共享工作区 / 单次运行）

**OS Awareness（OS 感知标签页）：
- 用于调试带 RTOS 的工程（FreeRTOS 感知）
- 可查看任务列表、堆栈使用量
- 需添加 FreeRTOS 插件路径

**J-Link 调试与其他探针的配置数对比：**

Filter matched 21 of 33 items（33 个配置中过滤到 21 个）

| 配置名称 | 调试场景 |
|---------|---------|
| freertos_s32k146_debug_flash_jlink | Flash 模式调试（代码下载到 Flash，在 Flash 中运行） |
| freertos_s32k146_debug_ram_jlink | RAM 模式调试（代码下载到 RAM，速度更快，掉电丢失） |
| freertos_s32k146_debug_flash_ram_jlink | 混合模式（Flash 固件 + RAM 断点） |
| bootLoader_S32K Debug | Bootloader 独立调试（PEMicro 接口） |
| freertos_s32k146_debug_flash_pemicro | 同工程 PEMicro 接口 Flash 调试 |

**Flash 调试 vs RAM 调试的选择：**

| 模式 | 代码存于 | 下载速度 | 断点数量 | 掉电保持 | 适用场景 |
|------|---------|---------|---------|---------|---------|
| Flash 调试 | Flash 存储器 | 较慢 | 硬件断点有限 | ✓ | 最终验证、量产测试 |
| RAM 调试 | SRAM | 很快 | 几乎无限 | ✗ | 单步调试、逻辑调优 |

**多配置管理功能：**
- 底部工具栏：Revert（恢复）、Apply（应用）、Debug（开始调试）、Close（关闭）
- 可通过 Launch Group 同时启动多个配置（如 bootLoader + Application 双工程联合调试）
- 实时切换到 S32 Debugger 视图（在调试过程中查看外设寄存器、内存窗口）

**状态栏中的调试信息：**
调试会话启动后，状态栏显示当前调试的源文件和行号，如：
`freertos_s32k146 SDK/.../port.c - [sPortEnableVFP]`
表示当前停在 FreeRTOS 的移植层代码中，正在使能 FPU（浮点单元）。

---

## 第二篇：各阶段工作成果详解

### 第 4 章 系统定义（System Definition）

**4.1 系统定义的目标**
在项目初期完成整车级/系统级的通信架构设计，独立于具体 ECU 实现。输出文件以 ARXML（AUTOSAR XML）为核心格式。

**4.2 输出物清单**

| 文件类型 | 内容说明 | 文件名示例 |
|---------|---------|-----------|
| 系统定义 ARXML | 整车级系统信号、ECU 实例、拓扑 | `System.arxml` |
| ECU 相关 ARXML | 每个 ECU 的通信矩阵抽象 | `ECU_VCU.arxml` |
| 通信网络 ARXML | CAN/LIN/FlexRay/Ethernet 帧与PDU | `ComNetwork.arxml` |
| PDU 描述 ARXML | 应用 PDU ↔ I-PDU ↔ N-PDU 映射 | `PDURouting.arxml` |
| 诊断相关 ARXML | UDS 诊断服务配置（DID/DTC/RID） | `Diagnostics.arxml` |
| 外部导入文件 | DBC（CAN）、LDF（LIN）、ODX（诊断）、CDD（CANdela） | `CAN_Matrix.dbc` |

**4.3 关键配置项**
- **System Signal**：信号的最小原子单元，定义长度、初始值、精度
- **Signal Group**：（可选）信号在 PDU 内的逻辑分组
- **PDU（Protocol Data Unit）**：I-PDU 用于内部路由，N-PDU 用于网络传输
- **ECU Instance**：整车中各 ECU 的角色及连接拓扑

**4.4 ISOLAR System Editor 实操：J1939 PDU 配置**

以下基于 ISOLAR-A/B 7.0.1 的 System Editor 视图，展示如何配置一个 NmPdu（以 J1939 的 AddressClaim_Rx 为例）。

**System Editor 视图定位：**
- 在 ISOLAR 中菜单 Run → 选择 System Editor 透视图
- 或通过顶部工具栏标签页切换（AR Ex / ECU / AUTO / Flssy / System Editor）
- System Editor 是系统定义阶段的核心编辑器，用于配置信号→PDU→帧→网络的完整映射

**打开系统定义 ARXML 文件：**
- 在 AR Explorer 中找到 `DBC_SysDesc.arxml` 文件
- 双击打开，系统进入 System Editor 视图

**编辑器界面布局：**
```
ISOLAR-A/B 7.0.1 - System Editor
┌─────────────────────────────┬──────────────────────┬──────────────┐
│  左侧 System Elements 树   │  中间属性编辑面板    │  右侧信号列表 │
├─────────────────────────────┼──────────────────────┼──────────────┤
│ S32G_0206                  │ Properties:          │ Available    │
│ ├── Pdus                   │  ShortName   :       │ Signals:     │
│ │   ├── NmPdus             │  AddressClaim_Rx     │              │
│ │   │   └─ AddressClaim_Rx │  Length      : 8     │ NMTester_    │
│ │   │   （Len: 8Byte）     │  Pdu Type    : NmPdu │  WakeSource  │
│ │   ├── NPdus (15)         │                      │ NMTester_    │
│ │   ├── ISignalPdus (105)  │ Signals Mapped:      │  SourceID    │
│ │   ├── DcmIPdus (11)      │   (表格: Signal Name │ Sig_CAN0_    │
│ │   └── GeneralPurposePdus │    Length/StartPos)  │  0x305      │
│ ├── Signals (129)          │                      │ Sig_CAN0_    │
│ ├── Signal Groups (0)      │                      │  0x306      │
│ ├── Frames (131)           │                      │ TPSig_CAN0_ │
│ ├── EcuS (1)               │                      │  CAN_0x400  │
│ ├── Networks (21)          │                      │ ...         │
│ └── ...                    ├──────────────────────┴──────────────┤
│                             │  Description View: "This is an    │
│                             │  abstraction folder which contains│
│                             │  frames."                         │
└─────────────────────────────┴───────────────────────────────────┘
```

**System Elements 树的结构（按 AUTOSAR 标准分层）：**

| 节点 | 功能 | 子节点数示例 |
|------|------|-------------|
| Signals | 信号定义（最小原子单元） | 129 个 |
| Signal Groups | 信号在 PDU 内的逻辑分组 | 0 个 |
| Pdus | PDU 定义（应用层数据容器） | 140 个 |
│ ├── NmPdus | 网络管理 PDU | 3 个 |
│ ├── DcmIPdus | 诊断 PDU | 11 个 |
│ ├── ISignalPdus | 应用信号 PDU | 105 个 |
│ ├── GeneralPurposePdus | 通用 PDU | 6 个 |
│ ├── NPdus | 网络传输 PDU | 15 个 |
│ └── Unmapped PDUs | 未映射的 PDU | 11 个 |
| Frames | CAN/LIN/Ethernet 帧定义 | 131 个 |
| EcuS | ECU 实例 | 1 个 |
| Networks | 网络定义 | 21 个 |

**配置 NmPdu 的完整步骤：**
```
1. 在 System Elements 树中展开 Pdus → NmPdus
2. 右键 NmPdus → New NmPdu（或者下移某节点）
3. 在 Properties 面板中设置：
   - ShortName: AddressClaim_Rx（PDU 名称，注意命名规范）
   - Length: 8（PDU 长度，8 字节）
   - HasDynamicLength: 不勾选（固定长度）
   - Pdu Type: NmPdu（网络管理 PDU）
   - NmDataInformation: （可选）NM 数据信息
   - NmVoteInformation: （可选）选举信息
4. 从右侧 Available Signals 列表中拖拽信号到中间 Mapping 区域：
   - NMTester_WakeSource
   - NMTester_SourceID
   - NMTester_RepeatReq
   - Sig_CAN0_0x305 等 …
5. 在 Mapping 表格中设置每个信号在 PDU 中的：
   - Start Position（起始位）
   - Length（位长度）
   - Update Indication Bit（更新指示位）
6. 检查：确认所有信号的总位数不超过 PDU Length × 8
7. 验证：右键项目 → Run Checks → 在 Problems 查看
```

**PDU 映射的常见注意事项：**
| 注意事项 | 说明 |
|---------|------|
| 命名规范 | PDU 名要可追溯含义，如 AddressClaim_Rx（地址声明接收）、NM_Tester（网络管理测试） |
| PDU 长度 | 8 字节 CAN 标准帧上限，CAN FD 可更长（最高 64 字节） |
| 信号起始位 | 注意 endianness（大端/小端），ISOLAR 默认按 CAN 标准（Motorola 字节序） |
| 未映射检查 | Unmapped PDUs 节点下列出了未完成映射的 PDU，配置完成前该节点应为空 |
| PDU 类型 | 避免混淆：应用数据用 ISignalPdu，诊断用 DcmIPdu，网络管理用 NmPdu |

**4.5 ISOLAR Import DBC 实操：导入 CAN 矩阵**

DBC 文件是 CAN 通信网络的标准化描述文件。在 ISOLAR 中通过 Import DBC 对话框将 DBC 转换为 AUTOSAR ARXML。

**打开方式：**
- 菜单 File → Import → CAN Matrix
- 或在 Workflow 面板中选择 Dbc Can Configuration 工作流

**Select Frames 对话框说明：**

表格各列：ECU ID（复选框）| Frame Name | Direction | Type | Protocol | Controller

Type 列下拉选项含义（可点击修改）：
- COM = 应用通信帧（普通 CAN 信号）
- NM = 网络管理帧（唤醒/休眠）
- NPDU = 网络层 PDU 帧（传输层分段）
- Gateway = 网关转发帧
- XCP = 标定/测量帧
- DCM = 诊断通信帧（UDS）

复选框选项：
- Select All：全选所有帧（首次导入推荐）
- Append Frame Names to Signals：帧名作为信号名前缀

操作步骤：
1. File → Import → CAN Matrix
2. 选择目标 DBC 文件
3. 在 Select Frames 对话框中全选（或按需勾选）
4. 检查 Type 列正确分类
5. 检查 Direction：Receive（本 ECU 收）/ Transmit（本 ECU 发）
6. 点击 Finish
7. 导入后验证：Signals(129)、Frames(131)、Pdus(140) 与 DBC 一致

**4.6 ISOLAR System Editor 实操：ISignalIPdu 信号映射（诊断场景）**

ISignalIPdu（应用信号 PDU）是 AUTOSAR COM 模块处理的 PDU，由一条或多条信号组成，经 PduR 路由到通信接口层。

**ISignalIPdu 的作用：**
- 将应用层信号（如 UDS 诊断信号）打包/解包成 PDU
- 通过 PduR 路由到 CanIf → CAN 控制器 → 总线
- 支持单个 ISignalIPdu 包含多条信号（最多允许一条动态长度信号）

**ISignalIPdu 属性面板关键参数：**

| 属性 | 值示例 | 说明 |
|------|--------|------|
| ShortName | ISignalIPdu_1 | PDU 名称（自动生成后可重命名） |
| Length (Bytes) | 1 | PDU 总长度（字节），所有信号长度之和不能超过此值 |
| Pdu Type | ISignalIPdu | 固定值（由 PDU 容器类型决定） |

**Signals 标签页的表格列详解：**

选中 ISignalIPdu_1 后，在 Signals 标签页中可查看和编辑信号映射：

| 列 | 说明 | 示例值 |
|------|------|-------|
| Signal Name | 信号名（来自 DBC 或手动添加） | UDS_RX_SIGN... |
| Length | 信号位长度 | 32（位） |
| Start Position | 信号在 PDU 内的起始位偏移 | 0 |
| Updated Indication Bit | 更新指示位（COM 模块用于信号变化通知）| NOT_SET |
| Base Type | 基础类型 | signed / unsigned |
| Data Type | LEGACY 或 AUTOSAR 标准类型 | LEGACY |
| Min / Max | 信号值范围约束 |（空） |
| Mask | 位掩码（信号跨字节处理时）|（空） |
| Offset | 偏移量（物理值 = raw × factor + offset）|（空） |
| Period | 信号发送周期（ms） |（空） |

**Available Signals 列表中的 NMTester 信号：**

在右侧 Available Signals 中可以看到 CP_K 项目中定义的所有信号（44 个），包括后续 PDU 配置使用的 NMTester 信号和 CAN0 信号。这些信号从 DBC 文件导入，也可在 ISystem Editor 中手动创建。

**操作步骤：将信号映射到 ISignalIPdu：**
```
1. 在 System Elements 树中展开 Pdus → ISignalIPdus → 选中目标 PDU
2. 在右侧 Available Signals 中找到目标信号（如 UDS_RX_SIGN...）
3. 拖拽信号到中间的 Signals 表格区域
4. 在表格中配置：
   - Start Position：信号在 PDU 内的起始位（0 = 从最低位开始）
   - Length：信号位宽（如 32 位 = 4 字节）
   - Data Type：LEGACY（保持默认）
5. 检查总信号长度不超出 PDU Length
6. 确认后，通过 ISOLAR 的 Packages 视图查看生成的 ARXML：
   - 面包屑：CP_K > Pdus > ISignalIPdus > ISignalIPdu_1
   - 文件路径：System_description_cfg.arxml
   - 包路径：/Pkg_System_Cfg/Pkg_Pdus/ISignalIPdu_1
7. Latest Binding Time = SystemDesignTime（系统设计阶段绑定的配置）
```

**不同项目信号/PDU 数量对比（参考）：**

| 项目 | Signals | Pdus | Frames | 说明 |
|------|---------|------|--------|------|
| CP_K | 44 | 24 | 24 | 小型工程，含 UDS 诊断 |
| S32G_0206 | 129 | 140 | 131 | 中型工程，含 J1939 NM |

---

**🛠️ ISOLAR 操作参考：系统定义阶段**
1. 打开 ISOLAR → 在 AUTOSAR Explorer 视图中右键 → New → ARPackage
2. 创建 System.arxml → 定义 ECU 实例和系统信号
3. 导入 DBC 文件：File → Import → CAN Matrix（或在 Workflow 中选择 Dbc Can Configuration 工作流）
4. 在 AR Explorer 中检查导入后的 ARXML 包结构
5. 验证：导航到 Software/System/ 确认所有 ECU 实例和信号正确

---

### 第 5 章 BSW 设计（Basic Software Design）

**5.1 BSW 的设计范围**
AUTOSAR 基础软件模块的配置，覆盖 OS、存储、通信、诊断、模式管理、看门狗等。**BSW 设计是 AUTOSAR 开发中最复杂的阶段**。

**5.2 输出物清单**

| 文件类型 | 内容说明 | 来源 |
|---------|---------|------|
| 各模块定义 ARXML | 每个 BSW 模块的 ECUC 配置参数 | EB tresos / DaVinci Configurator |
| 动态代码（.c .h） | 由工具生成的各模块源码 | 代码生成器 |
| 静态代码（.c .h） | 厂家提供的固定 SDK 代码（如 MCAL 驱动） | 芯片厂商 |
| 集成代码（.c .h） | 模块间集成胶水代码（如用户回调函数） | 开发人员手写 |

**5.3 主要 BSW 模块清单**

各模块按分层整理，对应 BSW Overview 视图中的色块区域：

**Service Layer（BSW Overview 浅色/紫色区域）**
| 模块 | 全称 | 功能 |
|------|------|------|
| OS | Operating System | 任务调度、中断管理、资源访问 |
| EcuM | ECU Manager | ECU 启动/关闭状态机 |
| BswM | Basic Software Mode Manager | BSW 模式管理（通信栈、唤醒等） |
| Com | Communication | 面向信号的通信（I-PDU 收发） |
| SoAd | Socket Adapter | 基于 Socket 的 IP 通信适配 |
| PduR | PDU Router | PDU 路由（Com → Can → CanIf） |
| IpduM | I-PDU Multiplexer | I-PDU 信号多路复用 |
| CanTp | CAN Transport Layer | CAN 传输层（分段传输） |
| CanSM | CAN State Manager | CAN 网络状态管理 |
| CanNm | CAN Network Management | CAN 网络管理（NM 报文） |
| Dcm | Diagnostic Communication Manager | UDS 诊断协议栈 |
| Dem | Diagnostic Event Manager | 诊断事件管理与 DTC 存储 |
| NvM | Non-Volatile Memory | EEPROM / Flash 数据存储 |
| Nm | Network Management | 通用网络管理 |
| J1939Tp | J1939 Transport Layer | J1939 传输层协议 |
| DoIP | Diagnostic over IP | 基于以太网的诊断 |
| TcpIp | TCP/IP Stack | TCP/IP 协议栈 |
| UdpNm | UDP Network Management | UDP 网络管理 |
| EthSM | Ethernet State Manager | 以太网状态管理 |

**Hardware Abstraction Layer（BSW Overview 绿色区域）**
| 模块 | 全称 | 功能 |
|------|------|------|
| Spi | Serial Peripheral Interface | SPI 总线抽象 |
| Adc | Analog/Digital Converter | ADC 驱动抽象 |
| Pwm | Pulse Width Modulation | PWM 输出抽象 |
| Icu | Input Capture Unit | 输入捕获抽象 |
| Dio | Digital I/O | 数字 IO 抽象 |
| Port | Port Driver | 引脚功能配置抽象 |
| Mcu | Microcontroller Unit | MCU 基础配置抽象 |
| Wdg | Watchdog | 看门狗硬件抽象 |
| MemIf | Memory Abstraction Interface | 存储抽象接口（统一 Fee/Ea/Eep） |
| Fee | Flash EEPROM Emulation | Flash 模拟 EEPROM |
| Ea | EEPROM Abstraction | EEPROM 抽象层 |
| Eep | EEPROM Driver | EEPROM 驱动 |
| CanIf | CAN Interface | CAN 控制器接口抽象 |
| CanTrcv | CAN Transceiver | CAN 收发器驱动 |
| FrIf | FlexRay Interface | FlexRay 接口抽象 |
| EthIf | Ethernet Interface | 以太网接口抽象 |

**MCAL / Microcontroller Driver Layer（BSW Overview 红色区域）**
| 模块 | 全称 | 功能 |
|------|------|------|
| WdgDrv | Watchdog Driver | 看门狗底层驱动 |
| Can | CAN Driver | CAN 控制器底层驱动 |
| Spi | SPI Driver | SPI 底层驱动 |
| Eth | Ethernet Driver | 以太网控制器底层驱动 |

**BSW Overview 色块布局解读：**

在 ISOLAR 等工具的 BSW Overview 视图中：
- **上/中层（浅色/紫色）** = Service Layer：Com/ComM/PduR/Dcm/NvM/SoAd/TcpIp 等

**🛠️ ISOLAR 操作参考：BSW 配置阶段**
1. 打开 ECU Configurator → Bsw Modules/ → 选择目标模块（如 Can）
2. 双击模块 → 打开 ECUC 参数编辑页
3. 查看模块依赖：右键模块 → Show Dependencies
4. 配置检查：右键项目 → Run Checks → 查看 Problems 标签页
5. 参考 BSW Overview 视图确认模块间连接关系（紫色=Service Layer 已配置）
6. 代码生成：菜单 RTA BSW → Generate Code（或在 Workflow 中选择 Ecu Extract Bsw Generation）

---

### 第 6 章 ASW 设计（Application Software Design）

**6.1 ASW 设计目标**
将整车功能分解为可独立运行的 Software Component（SWC），每个 SWC 包含若干 Runnables（可执行实体）。ASW 可以在系统设计阶段独立开发，不依赖底层硬件。

**6.2 输出物清单**

| 文件类型 | 内容说明 |
|---------|---------|
| SWC 定义 ARXML | 每个 SWC 的端口接口、数据类型、内部行为 |
| SWC C 代码（.c .h） | 由 ARXML 生成的 SWC 骨架 + 手写应用逻辑 |

**6.3 SWC 类型**

| 类型 | 说明 | 典型用途 |
|------|------|---------|
| AtomSWC | 原子 SWC，基本单元，部署在一个 ECU 上 | 控制算法、传感器处理 |
| CompositionSWC | SWC 的组合封装 | 系统级功能聚合 |
| ServiceSWC | 提供系统级服务 | 标定、Bootloader |
| EcuAbstractionSWC | 抽象 ECU 特定行为 | IO 抽象 |
| SensorActuatorSWC | 传感器/执行器 SWC | 物理信号处理 |

**6.4 Runnables 与调度**
- **Runnable**：SWC 的最小执行单元，类似函数
- **调度方式**：
  - 定时触发（TimingEvent）
  - 数据触发（DataReceivedEvent）
  - 操作调用触发（OperationInvokedEvent）
  - 模式切换触发（ModeSwitchEvent）

**🛠️ ISOLAR 操作参考：ASW 设计阶段**
1. 在 SystemDesk（ISOLAR-A）中创建 SWC：右键 → New → Atomic SWC
2. 定义 SWC 端口（P-Port / R-Port）和接口数据类型
3. 编写 Runnables：在 SWC 的 InternalBehavior 中创建 RunnableEntity
4. 分配触发事件：选择 SWC → InternalBehavior → Events → 选择 TimingEvent/DataReceivedEvent
5. 生成 SWC 骨架代码：Save → 自动在 RTE 生成代码路径下产生 SWC_*.h
6. 手写应用逻辑：打开 ASW/SWC*/ASW_SWC.c 实现 Runnable 函数体
7. 所有 ASW 代码在 ASW/ 分支下维护，不与 RTE 生成代码混放

---

### 第 7 章 RTE 设计（Runtime Environment）

**7.1 RTE 的作用**
RTE 是 AUTOSAR 的"通信总线"抽象层。在 VFB 层面 SWC 间的通信是虚拟的，RTE 负责将其映射到 ECU 内（函数调用）和 ECU 间（CAN/LIN 信号）。

**7.2 输出物清单**

| 文件类型 | 内容说明 |
|---------|---------|
| RTE 定义 ARXML | RTE 配置，包含 SWC ↔ BSW 的映射规则 |
| SCHM 代码（.c .h） | Schedule Manager 调度模块源码 |
| RTE 代码（.c .h） | RTE 生成的通信与调度引擎 |

**7.3 RTE 通信模式**

| 模式 | 方向 | 适用场景 |
|------|------|---------|
| Sender-Receiver | 单向 | 传感器数据、周期性信号 |
| Client-Server | 双向（请求-响应） | 诊断请求、标定 |
| Mode Switch | 广播 | 系统模式切换通知 |

**🛠️ ISOLAR 操作参考：RTE 生成阶段**
1. 在 ISOLAR 中打开 RTE 透视图：Window → Perspective → Open → RTE
2. RTE 配置：确认所有 SWC 端口已映射到系统信号或 BSW 模块
3. RTE 代码生成：菜单 RTE → Generate RTE（或在 Workflow 中运行 Extend SWC Composition to RTE Generation）
4. 验证：检查 RTE/Gen/ 路径下已生成 Rte.c、Rte_ASW_*.h、SchM_*.h、OsTask*.c
5. 注意事项：
   - RTE 生成的代码是只读的，不要手动编辑
   - 如果后期修改了 SWC 接口，必须重新生成 RTE
   - 编译前确认所有 RTE 文件已包含在编译路径中

---

### 第 8 章 OS 设计（Operating System）

**8.1 AUTOSAR OS 特征**
基于 OSEK/VDX 标准扩展，支持：
- 任务调度（BCC1/2、ECC1/2）
- 中断管理（ISR1/ISR2）
- 资源与锁
- 计时器（Counter → Alarm → Schedule Table）
- 多核扩展（OS-Application）

**8.2 输出物清单**

| 文件类型 | 内容说明 |
|---------|---------|
| OS 定义 ARXML | OS 配置参数（任务表、计数器、闹钟） |
| OS 代码（.c .h .a） | 代码生成器输出的 OS 源码 |
| ORTI 文件 | OSEK Runtime Interface，调试工具使用 |

**8.3 关键配置参数**

**Task（任务）配置：**
```
Task: CtrlTask
  - 优先级: 10
  - 调度类型: BCC2（基本任务，允许多个激活）
  - 栈大小: 1024 bytes
  - 自动启动: true

Task: DiagTask
  - 优先级: 5
  - 调度类型: BCC1（基本任务，单次激活）
  - 栈大小: 2048 bytes
  - 自动启动: false
```

**Counter、Alarm、Schedule Table 关系：**
```
HardwareTick（硬件定时器中断）
    ↓
Counter（计数器）
    ↓
Alarm A（单次闹钟） → 激活 TaskA
Alarm B（周期闹钟，周期=100） → 激活 TaskB
ScheduleTable（调度表） → 管理多个任务的时间槽
```

---

### 第 9 章 MCAL 设计（Microcontroller Abstraction Layer）

**9.1 MCAL 定位**
MCAL 是 AUTOSAR 分层中最接近硬件的层，封装了 MCU 外设寄存器操作，提供标准化的 API 给上层 BSW 模块调用。

**9.2 输出物清单**

| 文件类型 | 内容说明 |
|---------|---------|
| XDM 文件及导出的 ARXML | MCAL 模块配置（各工具厂商自定义格式+标准ARXML） |
| MCAL 配置代码（.c .h） | 按寄存器配置生成的底层驱动 |
| MCAL 静态代码（.c .h） | 芯片厂商提供的不可修改的驱动 SDK |

**9.3 常见 MCAL 模块**

| MCAL 模块 | 功能 | 对应外设 |
|-----------|------|---------|
| Mcu | MCU 基础配置（时钟、复位、电源模式） | 系统时钟、PLL、PLL 分频 |
| Port | GPIO/AF 引脚配置 | 通用 IO、复用功能 |
| Dio | 数字 IO 读写 | 简单 GPIO 读写 |
| Adc | ADC 转换 | ADC 模块 |
| Pwm | PWM 输出 | 定时器 PWM 通道 |
| Icu | 输入捕捉 | 定时器输入捕获（PWM 测量、脉冲计数） |
| Lin | LIN 通信 | LIN 控制器 |
| Spi | SPI 通信 | SPI 外设 |
| Can | CAN 通信 | CAN 控制器 |

**9.4 MCAL 配置流程**
```
1. 芯片选型 → 导入芯片厂家 MCAL 包
2. MCU 配置（时钟树、PLL 频率、外设使能）
3. Port 配置（引脚功能映射、上下拉、输出驱动）
4. 各外设模块配置（Dio/Adc/Pwm/Can/...）
5. 代码生成 + 手动集成（与 BSW/ASW 对接）
```

**🛠️ EB tresos Studio 操作参考：MCU 模块配置（MCAL 阶段）**

以下基于 EB tresos Studio 27.1.0 对 S32K300 MCU 模块的配置界面：

**打开 MCU 配置：**
1. Project Explorer -> S32K -> ARM -> Mcu -> 双击 McuGeneralConfiguration
2. 或直接双击 S32K 项目树下的 Mcu 节点
3. 主编辑区打开 Mcu 标签页（含 10 个子标签）

**MCU 配置导航树（EB tresos 中的 S32K300 结构）：**

S32K/
 ARM (CORTEXM, S32K300)
   Base (V1.0.5, AS4.2.2)
   Can (V1.0.5, AS4.2.2)
   Fee (V1.0.5, AS4.2.2)
   Fls (V1.0.5, AS4.2.2)
   Mcu (V1.0.5, AS4.2.2)           <- MCU 模块
     McuGeneralConfiguration        <- 通用参数（最常用）
     McuDebugConfiguration          <- 调试参数
     McuPublishedInformation        <- 发布信息
     McuModuleConfiguration         <- 模块参数
   Pwm (V1.0.5, AS4.2.2)
   Resource (V7.0.3, AS4.2.2)
   Spi (V1.0.5, AS4.2.2)

**MCU 编辑区 10 个子标签页：**

General         MCU 通用参数（错误检测 / PLL / 时钟 API / 低功耗 API）
McuResetReasonConf     复位原因检测配置
McuInitMcuConfig       初始化时钟配置（PLL 源、分频比）
McuClockSettingConfig  时钟树各分支（Core/Periph/Bus）频率设定
McuDemEventParameterRef 诊断事件绑定（关联 Dem 模块 DTC）
McuModeSettingConfig   运行模式设置（Normal / Sleep / Stop）
McuRamSectorSettingConfig  RAM 扇区保护配置（ECC）
McuResetConfig   复位源使能 / 滤波 / 时间配置
McuPowerControlInit   上电时序初始化（各外设上下电顺序）
Published Information  模块厂商 / 版本 / 日期

**McuGeneralConfiguration 关键参数：**

Default Error Detect (bool) = 勾选     开发期打开，量产可关
Mcu Get Ram State API (bool) = 勾选   生成读取 RAM 状态的 API
Mcu No PLL (bool) = 不勾              使用内部振荡器（不填 = 用 PLL）
Mcu Loops TimeOut (uint32) = 50000     PLL 锁相等待循环数
McuCalloutBeforePreInitReset (string) = NULL_PTR  预初始化复位前的回调
McuPerformResetCallout (string) = NULL_PTR       复位执行回调
McuOsNotification (string) = NULL_PTR             OS 通知回调
McuPreInitNotification (string) = NULL_PTR        预初始化通知回调
Version Info API (bool) = 勾选         生成版本读 API
Mcu Init Clock API (bool) = 勾选      生成时钟初始化 API
Mcu Enter Low-Power Mode (bool) = 勾选 生成低功耗模式 API
Mcu Perform Reset API (bool) = 勾选   生成复位 API

**McuDebugConfiguration 关键参数：**

Disable Production Error Reporting    量产版关闭错误报告
Get MIDR API                          生成读芯片 ID API
Enable Peripheral CMU                 使能外设时钟监控单元
Get Peripheral State API              生成读外设状态 API
SRAM Retention Config API             生成 SRAM 保持配置 API

**McuModuleConfiguration 关键参数：**
Mcu Number of Mode Settings = 1        最少 1 个（Normal 模式）
Mcu Number of RAM Sectors = 0          不分区保护

**常见 MCU 配置检查项：**
1. McuLoopsTimeOut 值不能太小（晶振起振时间长），典型 50000-100000
2. 时钟配置必须与 MCAL 的 McuInitMcuConfig 对齐
3. Disable Production Error Reporting Debug 阶段不勾，量产再勾
4. Published Information 自动生成，不需要手动修改

---

### 第 10 章 启动引导与编译链接

**10.1 启动引导文件**

| 文件 | 说明 |
|------|------|
| `.s` 启动文件 | 汇编启动代码，设置 SP、初始化 .data/.bss、跳转到 main |
| 系统初始化代码 | MCU 基础初始化（时钟、Cache、MPU） |
| C 环境初始化代码 | 全局变量、静态对象、__libc_init_array |

**10.2 编译与链接**

| 文件 | 说明 |
|------|------|
| 链接脚本（.ld / .lsl） | 定义 Flash/RAM 地址映射、Section 布局 |
| Makefile / CMakeLists.txt | 编译控制文件和构建规则 |

**10.3 AUTOSAR 工程的典型 Section 布局（Linker Script 示例）**

```
MEMORY
{
    Flash   (rx)  : ORIGIN = 0x8000000, LENGTH = 1M
    RAM     (rw)  : ORIGIN = 0x1FFF0000, LENGTH = 128K
}

SECTIONS
{
    .text          : > Flash    /* 代码段 */
    .rodata        : > Flash    /* 常量数据 */
    .data          : > RAM AT> Flash  /* 初始化全局变量 */
    .bss           : > RAM      /* 未初始化全局变量 */
    .stack         : > RAM      /* 栈 */
    .heap          : > RAM      /* 堆 */
    .nvram         : > Flash    /* NVRAM 区域（用于 NvM/Fee） */
    /* AUTOSAR 特有 Section */
    .os_appl       : > RAM      /* OS-Application 数据 */
    .calib_data    : > Flash    /* 标定数据 */
}
```

**🛠️ ISOLAR 操作参考：编译与链接阶段**
1. 启动文件生成：芯片厂家提供 startup.s 或从参考工程拷贝，不需要在 ISOLAR 中配置
2. 编译预处理：确保 RTE、BSW、MCAL 的代码生成已完成
3. 配置 Build Control View 中的编译选项：
   - Debug 模式：-g -O0（带调试信息，无优化）
   - Release 模式：-Os -DNDEBUG（优化尺寸，关调试）
4. 构建项目：菜单 Project → Build All（或右键项目 → Build）
5. 查看编译进度：Progress 标签页
6. 修复编译错误：双击 Problems 标签页中的错误条目，自动跳转到源码位置
7. 验证链接脚本（.ld/.lsl）：确认 .text/.data/.bss 地址段不溢出
8. 输出产物位于 Output/Debug/ 和 Output/Release/

---

## 第三篇：通信与诊断协议模块

### 第 11 章 J1939 基础通信

**11.1 J1939 概述**
J1939 是基于 CAN 2.0B（29 位扩展 ID）的商用车/工程机械通信协议，定义在 SAE J1939 系列标准中。

**11.2 关键概念**

| 概念 | 说明 |
|------|------|
| PGN（Parameter Group Number） | 消息类型标识，编码在 29 位 CAN ID 中 |
| SA（Source Address） | 源地址，每个 ECU 唯一 |
| DA（Destination Address） | 目标地址（0xFF = 广播） |
| PF（PDU Format） | PDU 格式字段，决定是 PDU1（点对点）还是 PDU2（广播） |
| PS（PDU Specific） | PDU 特定字段，与 PF 共同确定 PGN |

**11.3 J1939 在 AUTOSAR 中的集成**
- AUTOSAR 通过 CanTp（ISO 15765-2）和 Com 模块支持 J1939 传输层
- BAM（Broadcast Announce Message）和 CMDT（Connection Mode Data Transfer）两种传输模式

---

### 第 12 章 ECU 的启动与休眠

**12.1 EcuM（ECU Manager）**
AUTOSAR 中管理 ECU 电源状态的核心模块。定义以下状态：

```
STARTUP（启动）
 └→ RUN（正常运行）
      ├→ GO_SLEEP（进入休眠）
      ├→ WAKEUP_RESET（唤醒复位）
      └→ SHUTDOWN（关机）
          └→ POST_RUN（关闭后处理）
              └→ OFF（断电）
```

**12.2 唤醒源**
- CAN/LIN 总线活动唤醒
- PWM/Ignition 电平变化
- 定时器定时唤醒
- GPIO 中断唤醒

**12.3 休眠策略**
- 根据 BswM 模式状态机判定条件
- 关键条件：无诊断请求、无通信活动、无定周期任务挂起
- 关闭非必要外设 → 进入低功耗模式（Stop/Sleep）

---

### 第 13 章 存储栈（Memory Stack）

**13.1 AUTOSAR 存储层次架构**

```
┌──────────────────────────────────────────────┐
│                 NvM（RAM 缓存层）              │
├──────────────────────────────────────────────┤
│                 Fee / EA                      │
│   Flash Emulation / EEPROM Abstraction       │
├──────────────────────────────────────────────┤
│               Fls（Flash 驱动）               │
│                Eep（EEPROM 驱动）              │
├──────────────────────────────────────────────┤
│               Flash / EEPROM                  │
└──────────────────────────────────────────────┘
```

**13.2 NvM 关键概念**
- **NvM Block**：单个存储对象，用于保存配置、诊断信息、故障码
- **Block 管理**：write once、write many、redundant、dataset
- **CRC 校验**：每个 Block 可附带 CRC 检测数据完整性
- **RAM Mirror**：在 RAM 中缓存 Block 内容，减少 Flash 写入次数

---

### 第 14 章 XCP 服务

**14.1 XCP 概述**
XCP（Universal Calibration Protocol）是 ASAM 标准定义的标定/测量协议。支持：
- 在线标定参数
- 实时测量变量
- Flash 编程

**14.2 XCP 传输层**
- XCP on CAN（XCP-on-CAN）
- XCP on Ethernet（XCP-on-IP）

**14.3 典型 XCP 命令**
| 命令 | 功能 |
|------|------|
| CONNECT | 建立连接 |
| DISCONNECT | 断开连接 |
| SET_MTA | 设置存储器地址 |
| DOWNLOAD | 下载数据（在线标定） |
| UPLOAD | 上传数据 |
| SHORT_UPLOAD | 短数据上传 |
| SET_DAQ_LIST | 配置 DAQ 列表（周期性数据上传） |
| START_STOP_DAQ | 启动/停止 DAQ |

---

### 第 15 章 基于 CAN 的 UDS 诊断服务

**15.1 UDS 概述**
UDS（Unified Diagnostic Services，ISO 14229）定义了一组标准的诊断服务，用于 ECU 的故障诊断、维护、标定和编程。

**15.2 常用诊断服务**

| SID | 服务名 | 功能 |
|-----|--------|------|
| 0x10 | DiagnosticSessionControl | 切换诊断会话（Default/Programming/Extended） |
| 0x11 | ECUReset | 复位 ECU |
| 0x14 | ClearDiagnosticInformation | 清除 DTC |
| 0x19 | ReadDTCInformation | 读取故障码 |
| 0x22 | ReadDataByIdentifier | 读 DID（版本/序列号/系统状态） |
| 0x2E | WriteDataByIdentifier | 写 DID（标定/配置） |
| 0x27 | SecurityAccess | 安全访问（种子-密钥） |
| 0x28 | CommunicationControl | 控制通信（静音、禁止 Tx） |
| 0x2F | InputOutputControlByIdentifier | IO 控制 |
| 0x31 | RoutineControl | 例程控制（擦/写 Flash、自检） |
| 0x34 | RequestDownload | 请求下载（固件升级） |
| 0x36 | TransferData | 传输数据 |
| 0x37 | RequestTransferExit | 结束传输 |
| 0x3D | WriteMemoryByAddress | 直接写地址 |
| 0x85 | ControlDTCSetting | 控制 DTC 记录启用/禁用 |

**15.3 Dcm 模块结构**
Dcm 内部的三个子模块：
- **DcmSL**（Session Layer）：会话管理、安全访问、SID 解析
- **DcmDSL**（Data Session Layer）：数据流控制、分段传输
- **DcmDSP**（Diagnostic Service Processing）：具体服务处理逻辑

**15.4 诊断配置产物**
- CDD（CANdela Diagnostic Description）：Vector 工具诊断描述文件
- ODX（Open Diagnostic Data Exchange）：标准诊断交换格式
- DTC 配置：每个故障码（0x0000-0xFFFF）绑定到 DEM 事件

---

### 第 16 章 XCP on IP

XCP on IP 将 XCP 的传输层改为 TCP/UDP 协议，在 Ethernet 环境下保持与 XCP on CAN 相同的标定功能。关键差异：
- 传输层改用 TCP（可靠传输）或 UDP（实时流）
- 速率可达 100M/1Gbps，远超 CAN 的 500kbps
- 用于基于 Ethernet 的高性能 ECU 标定

---

### 第 17 章 UDS on IP（DoIP）

**17.1 DoIP 概述**
DoIP（Diagnostic over Internet Protocol，ISO 13400）将 UDS 诊断服务封装在 TCP/IP 协议栈之上，用于 Ethernet 架构的诊断。

**17.2 与 CAN UDS 的关键区别**

| 项目 | CAN UDS | DoIP |
|------|---------|------|
| 传输层 | CAN（ISO 15765-2） | TCP（ISO 13400） |
| 速率 | 最高 1Mbps | 100M/1Gbps |
| 物理连接 | CAN 总线 | Ethernet |
| 路由 | 网关 PduR | 路由器 |

**17.3 典型 DoIP 报文流**
```
物理连接 → 车辆声明/识别 → 路由激活 → 诊断连接 → UDS 服务 → 断开
```

---

### 第 18 章 AUTOSAR 关于模式的配置

**18.1 模式管理架构**

```
            ┌────────────────────────────┐
            │         BswM               │
            │  Basic Software Mode Mgr  │
            └────┬──────────┬───────────┘
                 │          │
          ┌──────┴──┐  ┌───┴────────┐
          │  EcuM   │  │  ComM      │
          │ ECU Mgr │  │ COM Mgr    │
          └─────────┘  └────────────┘
          ┌─────────┐  ┌────────────┐
          │  NvM    │  │  CanSM     │
          │ NVM Mgr │  │ CAN Stack  │
          └─────────┘  └────────────┘
```

**18.2 BswM 模式流转规则（规则引擎）**
条件式判定逻辑：
```
IF (EcuM.StartupComplete == TRUE) AND (ComM.FullComMode == TRUE)
THEN BswM.Mode = RUN
→ Enable CanSM, Enable NvM, Enable Com
```

---

## 第四篇：配置集成与总结

### 第 19 章 辅助模块

涉及的辅助模块：
- **Det（Development Error Tracer）**：开发阶段错误追踪，记录参数错误/开发错误
- **SchM（Schedule Manager）**：Runnable 调度表管理
- **Bfx（Base Function）**：基础函数库（CRC、MemCpy、Bit Manipulation）

---

### 第 20 章 零起点的 ASW 配置

**20.1 从零开始配置 ASW 的步骤**

```
1. 系统信号分析 → 确定 SWC 接口
2. SWC 定义 ARXML → 端口、数据类型、接口
3. Runnables 划分 → 哪个 Runnable 做什么
4. Runnable 逻辑实现 → 写 C 代码
5. RTE 配置 → 映射 SWC 通信到 RTE 信道
6. 集成验证 → 编配置、编译、测试
```

**20.2 SWC 数据流示例**

```
SensorSWC（采集原始信号）
    ↓ 周期触发 Runnable: ReadADC()
    ↓ Port: P_ADCValue（Sender）
CompositionSWC（滤波+转换）
    ↓ 信号收到触发 Runnable: Filter()
    ↓ Port: P_FilteredValue（Sender）
ControlSWC（控制决策）
    ↓ 信号收到触发 Runnable: CalculateOutput()
    ↓ Port: P_ControlOutput（Client/Server）
ActuatorSWC（执行输出）
    ↓ 操作调用 Runnable: SetOutput()
    ↓ 映射到 DIO/MCU 寄存器
```

---

### 第 21 章 完善系统描述

系统描述 ARXML 的最终完善包括：
- 所有信号的数据类型、精度、有效范围对齐
- SWC 端口与系统信号映射确认
- 帧/PDU 调度周期（Cycle Time）定义完成
- 诊断 DID/DTC 索引完整

---

### 第 22 章 RTE（深入详解）

**22.1 RTE 生成的内容**

```
- Rte.c：SWC 调用入口 + 调度安排
- Rte_Hook.c：用户回调接口
- Rte_SWC_Name.c/h：每个 SWC 的 RTE API
- SchM.c：Schedule Manager 调度表
```

**22.2 RTE 的调度引擎**

```
每个任务执行时的调度流：

Task_T10ms()  // OS 任务，10ms 周期执行
{
    SchM_Enter_SWC_1();        // RTE 调度的 SWC1
    Runnable_SensorRead();
    SchM_Exit_SWC_1();

    SchM_Enter_SWC_2();        // RTE 调度的 SWC2
    Runnable_ControlCalc();
    SchM_Exit_SWC_2();
}
```

**22.3 RTE 检查清单**
- [ ] SWC 的 Runnables 全部映射到正确的 OS Task
- [ ] Sender-Receiver 端口时序匹配（先写后读）
- [ ] Client-Server 操作的超时机制
- [ ] 模式切换通知的初始状态正确
- [ ] RTE 生成的.h文件被正确的.c文件引用

---

### 第 23 章 OS（深入详解）

**23.1 任务配置策略**

| 策略 | 说明 | 适用场景 |
|------|------|---------|
| 周期 Task + 定时事件 | 固定周期执行 Runnable | 采样控制、状态轮询 |
| 事件触发 Task | 信号/中断到达时激活 | 通信接收、紧急处理 |
| 混合策略 | 基础任务周期执行，高优先级事件抢占 | 复杂 ECU |

**23.2 中断管理**

| ISR 类型 | 可否调用 OS API | 使用场景 |
|---------|--------------|---------|
| ISR1 | 不可以（仅处理硬件） | 简单外设中断（TIM、GPIO） |
| ISR2 | 可以（调用 SetEvent、ActivateTask） | 通信接收、TICK 定时 |

**23.3 OS 调试产物 — ORTI 文件**
ORTI（OSEK Runtime Interface）文件是调试工具（如 Lauterbach、iSYSTEM）读取 OS 内部状态的接口描述。包含：
- 任务/栈地址
- 资源列表
- 计时器配置

**🛠️ ISOLAR 操作参考：OS 配置阶段**
1. 导航：ECU Configurator → Bsw Modules → Services → OS
2. 创建 OS 配置容器：右键 → New OsConfig
3. 配置任务（Task）：
   - 任务名、优先级（1-255）、调度策略（BCC1/BCC2/ECC1/ECC2）
   - 栈大小（通常 512/1024/2048 bytes）、自动启动选项
4. 配置 Counter → Alarm：
   - Counter：从定时器中断驱动（如 OsCounter_10ms）
   - Alarm：绑定到 OS 任务或调度表
5. 配置 Schedule Table：
   - 为需要严格时序的 Runnable 配置调度表
6. 代码生成：OS 配置由 RTA-OS 自动生成 → 输出在 OS/Gen/ 路径下
7. ORTI 文件：在 OS/ORTI/ 路径下导出，供 Lauterbach 调试使用

**23.4 RTA-OS Configuration Tool 界面导航**

RTA-OS Configuration Tool 是独立的 OS 配置工具（不同于 ISOLAR），专门用于 AUTOSAR OS 参数的可视化配置。以下基于 S32K146 项目的实际界面。

**23.4.1 界面布局**

```
┌──────────────────────────────────────────────────────┐
│ 标题: S32K146_OS.rtaos - RTA-OS Configuration Tool  │
│ 菜单: File | View | Assistants | Project | Reports  │
│       | Help                                         │
├──────────────────┬───────────────────────────────────┤
│  左侧导航树      │  右侧配置面板                     │
│  OS Config.      │  标签页: General | Hooks | Error  │
│  ├─ General      │  Hook | Timing                    │
│  ├─ Hooks        │                                   │
│  ├─ Error Hook   │  General 参数配置区:               │
│  ├─ Timing       │  - Scalability Class: SC4         │
│  ├─ Applications │  - Status: EXTENDED               │
│  ├─ App. modes   │  - Enable Stack Monitoring: FALSE │
│  ├─ Counters     │  - Number of OS Cores: 1          │
│  ├─ Events       │                                   │
│  ├─ ISRs         │  底部: Check Now | Clear 按钮     │
│  ├─ Peripherals  │  结果表格: Source | Description    │
│  ├─ Resources    │  - OS Config: Target S32K146CPU   │
│  ├─ Schedule     │       selected                    │
│  │  Tables       │                                   │
│  ├─ Spinlocks    │                                   │
│  └─ Tasks        │                                   │
├─ RTA-TRACE Config│                                   │
├─ Builder         │                                   │
└─ Project files   ├───────────────────────────────────┤
                    │  状态栏: Working File | Build     │
                    │  Status: Idle | 时间: 0:56       │
                    │  日期: 2022/6/27                 │
                    └───────────────────────────────────┘
```

**23.4.2 导航树节点功能说明**

| 节点 | 配置内容 |
|------|---------|
| General | OS 全局参数（Scalability Class、Status、核数、栈监控） |
| Hooks / Error Hook | 系统钩子函数回调（StartupHook、ShutdownHook、ErrorHook） |
| Timing | 系统时钟节拍（主节拍周期、最短任务周期） |
| Applications | OS-Application 定义（信任/非信任分区） |
| Application Modes | 应用模式定义（OS 从 AppMode 0/1/2 启动） |
| Counters | 硬件/软件计数器（驱动 OS 系统时钟） |
| Events | 事件定义（事件触发型任务调度的标志位） |
| ISRs | 中断服务例程（ISR1/ISR2，需要对应 MCAL 中断号） |
| Peripherals | 外设中断映射（将 MCAL 中的外设中断号绑定到 OS ISR） |
| **Resources** | 资源锁（控制关键段访问，防止任务间抢占） |
| **Schedule Tables** | 调度表（精确控制多任务的执行序列和时间槽） |
| Spinlocks | 自旋锁（多核 CPU 间同步） |
| Tasks | 任务配置（创建/删除/修改任务的优先级、栈大小、自动启动） |

**23.4.3 General 属性配置详解**

| 参数 | 选项 | 说明 |
|------|------|------|
| Scalability Class | SC1 / SC2 / SC3 / SC4 | SC4 = 全部特性（多核+资源+调度表+计数器+事件+ISR） |
| Status | STANDARD / EXTENDED | EXTENDED = 支持扩展错误（开发调试阶段建议打开） |
| Enable Stack Monitoring | TRUE / FALSE | 运行时栈溢出检测（调试时开 TRUE，Release 关 FALSE） |
| Number of OS Cores | 1 / 2 / 3 / ... | 目标 MCU 内核数（单核=1，多核如 TC397=3） |

**23.4.4 Schedule Table 与 Resources（红圈标注重点）**

**Schedule Table（调度表）** = 预测性任务调度机制：
- 调度表精确控制每个时间槽（Expiry Point）上激活哪个 Runnables
- 典型应用：电机控制中以固定角度触发位置采样和电流环计算
- 配置步骤：
  1. Nav: OS Configuration → Schedule Tables → 右键 → New Schedule Table
  2. 设置同步计数器（参考一个已经配置好的 Counter）
  3. 创建 Expiry Points：每个 Expiry Point 绑定 Task/SetEvent
  4. 调整 Duration：每个 Expiry Point 之间的时间间隔

**Resource（资源锁）** = 任务间互斥锁（OSEK 资源协议）：
- 优先级天花板协议（Priority Ceiling Protocol）：防止优先级反转
- 配置步骤：
  1. Nav: OS Configuration → Resources → 右键 → New Resource
  2. 设置 Resource 名
  3. 在各 Task 的访问区域中用 GetResource/ReleaseResource API 保护
- 注：AUTOSAR Resource 不是信号量，没有 Wait/Post 语义

**23.4.5 工具操作流程**

```
创建新 OS 配置 → 用工具生成的步骤：
  1. File → New → OS Configuration
  2. 选择目标 MCU（如 S32K146CPU）
  3. 配置 General 属性（SC4 + EXTENDED）
  4. 创建 Counters（至少一个硬件计数器驱动系统时钟）
  5. 创建 Tasks（至少一个初始任务）
  6. 创建 ISRs（对应 MCAL 中的中断号分配）
  7. 可选：创建 Schedule Tables（精确定时需求）
  8. 可选：创建 Resources（临界区保护）
  9. Check Now → 验证配置正确性（结果在底部表格显示）
  10. 保存 .rtaos 文件 → 生成 OS/Gen/ 路径下的 OS 代码
```

**配置验证（Check Now）：**
每次修改参数后点击 Check Now，底部表格会显示配置检查结果。
- Source = "OS Config" 表示通用检查
- Description 列出每个通过/失败的检查项
- 示例："Target S32K146CPU has been selected" = 通过
- 红色条目 = 错误，需修正后才能生成代码

**与 ISOLAR 的关系：**
- RTA-OS Configuration Tool 的 .rtaos 配置可被 ISOLAR 的 OS 模块导入
- 如果项目使用 ISOLAR 完整工具链，OS 配置也可以在 ISOLAR 的 ECU Configurator 中完成
- RTA-OS 工具适合 OS 专项深度配置场景（调试期、调优期）

---

### 第 24 章 MCAL（深入详解）

**24.1 MCAL 配置生命周期**

```
1. 芯片导入 → 加载芯片厂家 MCAL 包
2. 基础配置 → Mcu（时钟+PLL+引脚）
3. 外设配置 → Adc/Can/Pwm/Spi/Lin/...
4. 代码生成 → 生成各模块配置代码
5. 编译验证 → 编译检查配置正确性
6. 集成测试 → 外设功能验证
```

**24.2 MCAL 配置与裸机寄存器的对应关系**

以 CAN 控制器为例：

| MCAL 参数 | 对应寄存器 | 说明 |
|-----------|---------|------|
| CanControllerBaudRate | CAN_BTR (TSEG1/TSEG2/SJW) | 波特率（500k/250k） |
| CanHwFilter | CAN_FIFO/FILTER | 硬件过滤配置 |
| CanControllerId | CAN_CTRL | 控制器索引（CAN0/CAN1） |
| CanControllerWakeUpCapability | CAN_CTRL.WKU | 唤醒能力 |

**24.3 Port 引脚配置示例**

| 引脚 | 功能 | PortPinDirection | PortPinMode | 上下拉 |
|------|------|-----------------|------------|-------|
| P5.0 | CAN0_TX | OUT | ALT1 | PULL_UP |
| P5.1 | CAN0_RX | IN | ALT1 | PULL_UP |
| P7.3 | ADC_IN0 | IN | ANALOG | NO_PULL |
| P2.4 | PWM_CH0 | OUT | ALT2 | NO_PULL |

**🛠️ ISOLAR 操作参考：MCAL 配置阶段**
1. 安装芯片厂家 MCAL 包（如 Infineon MCAL for TC397）
2. 打开 ISOLAR → ECU Configurator → Parameter Definitions/ → 确认厂家模块定义已导入
3. 配置 MCU：Bsw Modules/ → Mcu → 配置时钟树（PLL、分频、外设时钟使能）
4. 配置 Port：Bsw Modules/ → Port → 按上表示例配置每个引脚的复用功能
5. 配置 CAN：Bsw Modules/ → Can → CanController → 配置波特率、过滤器
6. 代码生成：菜单 RTA BSW → Generate MCAL Code（或在 Workflow 中执行 Ecu Extract Bsw Generation）
7. 验证配置有效性：右键项目 → Run Configuration Check → 检查 Problems 标签页
8. 注意：MCAL 静态代码（芯片厂家 SDK）不要修改；动态代码（Gen/路径下）每次修改配置后重新生成

---

## 第五篇：总结与验证

### 第 25 章 配置的总结与工作输出物梳理（Chapter 25）

**25.1 各阶段输出物回顾**

```
┌──────────────┬───────────────────────────────────────────────┐
│   阶段       │    产出物（ARXML + 代码 + 配置文件）           │
├──────────────┼───────────────────────────────────────────────┤
│ 系统定义     │ System.arxml, ECU.arxml, Com.arxml, DBC, LDF │
│ BSW 设计     │ BSW_Mod.arxml, BSW_Dynamic/*.c.h, 静态/*.c.h │
│ ASW 设计     │ SWC_ARXML, SWC_Code/*.c.h                    │
│ RTE 设计     │ RTE_Arxml, Rte.c.h, SchM.c.h                 │
│ OS 设计      │ OS_Arxml, OS_Code.c.h.a, ORTI                │
│ MCAL 设计    │ MCAL_XDM, MCAL_Arxml, MCAL_Code.c.h          │
│ 启动引导     │ startup.s, sys_init.c, crt0.c                │
│ 编译与链接   │ LinkerScript.ld, Makefile/BuildScript         │
└──────────────┴───────────────────────────────────────────────┘
```

**25.2 验证检查清单**

- [ ] 系统定义 ARXML 导入 BSW 工具无错误
- [ ] BSW 模块配置参数互不冲突（时间、优先级、中断通道）
- [ ] ASW 中每个 SWC 的端口与系统信号类型一致
- [ ] RTE 生成无警告（所有端口映射完成）
- [ ] OS 调度表符合时序要求（最差情况响应时间 < Deadline）
- [ ] MCAL 调试模式下各外设寄存器读写正常
- [ ] 编译输出与预期内存映射一致
- [ ] 编译零错误（Wall -Werror 级别）

**25.3 常见配置错误与排查**

| 错误类型 | 典型表现 | 排查方向 |
|---------|---------|---------|
| ARXML 版本不一致 | 导入报 Schema Error | 检查各工具版本与 AUTOSAR 版本 |
| Port 映射遗漏 | RTE 生成空接口 | 检查 SWC Port 与信号映射 |
| Task 配置冲突 | 调度超时/死锁 | 增加 Task 优先级审查 |
| 中断号冲突 | 某 ISR 不响应 | MCAL 配置 + OS 中断配置对齐 |
| 链接地址溢出 | .text 超过 Flash 大小 | 检查 Section 布局、优化代码 |

**25.4 工程文件集成树结构（实际项目案例）**

以下是一个实际 AUTOSAR CP 项目在文件目录层面的完整集成树结构，展示了各阶段输出物之间在代码文件层面的真实集成关系。图中以颜色标注文件角色：
- 紫色框：RTE 相关
- 蓝色框：MCAL/ASW/OS 说明
- 红色框：重要文件说明
- 橙色框：BSW 自动生成说明
- 绿色框：模块函数实体说明
- 黄色框：动态代码说明
- 粉色框：模块集成连接部分

```
Project
├── 1️⃣ RTE 分支
│   ├── RTE 根据用户定义生成的 OsTask
│   │   ├── OsTask0.c
│   │   ├── ...
│   │   └── OsTaskn.c
│   ├── RTE 根据用户定义自动生成的软件
│   │   ├── Rte_ASW_APP0.h
│   │   ├── Rte_ASW_APPn.h
│   │   ├── Rte_ASW_DCM.h
│   │   └── ...
│   ├── ASW 软件的函数或其它定义在 RTE 的声明
│   └── RTE 运行以及状态管理所必须的文件
│       ├── Rte.c
│       ├── SchM_BswM.h
│       └── SchM_Dcm.h
│
├── 2️⃣ ASW 分支（用户自行定义的应用软件）
│   ├── ASW_SWC0/
│   │   ├── ASW_SWC.c
│   │   └── ASW_SWC.h
│   ├── ...
│   ├── ASW_SWCn/
│   │   ├── ASW_SWC.c
│   │   └── ASW_SWC.h
│   ├── IoHwAb_xxx/
│   │   ├── IoHwAb_xxx.c
│   │   └── IoHwAb_xxx.h
│   └── ...
│
├── 3️⃣ Mcal Target 分支
│   ├── Mcal 根据工程需要配置生成的软件
│   │   ├── 【动态代码】配置生成的 cfg 文件
│   │   │   ├── Can_cfg.h
│   │   │   ├── Can_cfg.c
│   │   │   └── Can_PBcfg.c
│   │   └── 【静态代码】芯片厂商提供的 SDK
│   │       ├── Can.h
│   │       ├── Can.c
│   │       ├── xxx_TS_T40D2M1015R0/
│   │       └── StaticCode/
│   └── 集成连接各个模块（Intergation）
│       ├── ASW_xxx_MemMap.h
│       ├── ASW/
│       ├── BSW/
│       ├── OS/
│       ├── RTE/
│       ├── Mcal/
│       ├── ECU/
│       └── Main.c
│
├── 4️⃣ BSW 分支（BSW 根据配置自动生成的软件）
│   ├── BswM/
│   ├── DCM/
│   └── EcuM/
│       ├── api/
│       │   ├── EcuM.h
│       │   └── EcuM_Callout.h
│       ├── src/
│       │   ├── EcuM_Startup.c          ← 【绿色】模块函数运行的实体（静态代码）
│       │   └── EcuM_CurrentState.c
│       └── integration/
│           ├── EcuM_PBcfg.c            ← 【黄色】根据用户定义生成的动态代码
│           ├── EcuM_Cfg.c
│           ├── EcuM_cfg_MemMap.h       ← 【粉色】与其它模块集成连接的部分
│           └── EcuM_cfg_SchM.h
│
└── 5️⃣ OS 分支（根据 OsNeed 由 RTA-OS 软件生成的 OS 层代码）
    ├── StartOS.c
    ├── Os.h
    ├── Os_cfg.h
    └── Os_cfg.c
```

**集成树的关键解读**

| 分支 | 自动生成 | 手写代码 | 集成组件 |
|------|---------|---------|---------|
| RTE | Rte.c、SchM_*.h、Rte_ASW_*.h、OsTask | — | 连接 ASW 与 BSW 的调度 |
| ASW | — | SWC 逻辑 + IoHwAb | 通过 RTE 调用 BSW 服务 |
| MCAL | cfg 动态代码 | 厂家静态 SDK | MemMap 链接到 ASW/BSW/OS/RTE |
| BSW | PBcfg/Cfg 动态代码 | 模块静态代码 | integration/目录连接各模块 |
| OS | RTA-OS 全部生成 | — | StartOS + 配置头文件 |

**颜色标注对照：**
- 紫色：RTE 核心生成产物，作为 ASW 与 BSW 之间的通信桥梁
- 蓝色：MCAL/ASW 应用相关代码，用户可参与修改
- 红色：重要入口文件（如 Main.c、EcuM_Startup.c）
- 橙色：BSW 由配置工具自动生成的代码，不应手改
- 绿色：模块函数运行的实体（静态代码 = 厂家提供的成熟实现）
- 黄色：根据用户配置动态生成的代码（配置变更后重新生成）
- 粉色：模块间集成的连接部分（MemMap 定义各模块的 Section 映射）

这个集成树反映了一个关键设计原则：**配置驱动 > 手写代码**。动态代码（黄色/橙色）完全由配置工具根据 ARXML 生成，开发人员只负责编写 ASW 逻辑和少量集成胶水代码。

---

### 第 26 章 工程的组织集成编译与链接

**26.1 AUTOSAR 工程的目录组织（推荐结构，对应实际项目集成树）**

以下目录结构映射了 25.4 节集成树中的各个分支，开发团队只需按此模板组织源码目录，即可自动满足集成编译链对文件路径和依赖关系的要求。

```
project_root/
├── System/                          # 【系统定义】ARXML + DBC/LDF/CDD
│   ├── System.arxml                 # 系统级信号/ECU 拓扑
│   ├── ECU/                         # 各 ECU 定义
│   │   └── ECU_*.arxml
│   ├── Communication/               # 通信矩阵
│   │   └── ComNetwork.arxml
│   ├── PDU/                         # PDU 路由
│   │   └── PDURouting.arxml
│   ├── Diagnostic/                  # 诊断配置
│   │   └── Diagnostics.arxml
│   └── Matrix/                      # 外部导入
│       ├── CAN_Matrix.dbc
│       ├── LIN_Matrix.ldf
│       └── Diagnostic.odx
│
├── ASW/                            # 【应用层】对应集成树 2️⃣
│   ├── SWC0/
│   │   ├── ASW_SWC0.c               # 用户手写应用逻辑
│   │   └── ASW_SWC0.h
│   ├── SWC1/
│   │   ├── ASW_SWC1.c
│   │   └── ASW_SWC1.h
│   ├── IoHwAb/                      # IO 硬件抽象
│   │   ├── IoHwAb_xxx.c
│   │   └── IoHwAb_xxx.h
│   └── ARXML/
│       └── SWC*.arxml               # SWC 描述文件
│
├── RTE/                            # 【运行时环境】对应集成树 1️⃣
│   ├── Gen/
│   │   ├── Rte.c                    # RTE 核心引擎
│   │   ├── Rte_ASW_APP0.h           # SWC 通信头文件
│   │   ├── Rte_ASW_APPn.h
│   │   ├── Rte_ASW_DCM.h
│   │   ├── SchM_BswM.h             # 调度管理器
│   │   ├── SchM_Dcm.h
│   │   ├── OsTask0.c                # RTE 定义的 OS 任务
│   │   └── OsTaskn.c
│   └── Cfg/
│       └── RTE*.arxml
│
├── BSW/                            # 【基础软件】对应集成树 4️⃣
│   ├── EcuM/
│   │   ├── api/
│   │   │   ├── EcuM.h
│   │   │   └── EcuM_Callout.h       # 用户回调接口
│   │   ├── src/
│   │   │   ├── EcuM_Startup.c       # 【静态】ECU 启动流程
│   │   │   └── EcuM_CurrentState.c  # 【静态】状态机执行
│   │   └── integration/
│   │       ├── EcuM_PBcfg.c         # 【动态】后编译配置
│   │       ├── EcuM_Cfg.c           # 【动态】配置代码
│   │       ├── EcuM_cfg_MemMap.h    # 【集成】Section 映射
│   │       └── EcuM_cfg_SchM.h     # 【集成】调度接口
│   ├── BswM/
│   ├── DCM/
│   └── ...                          # 其他 BSW 模块（Com/PduR/Can/etc.）
│
├── MCAL/                           # 【微控制器抽象层】对应集成树 3️⃣
│   ├── Gen/
│   │   ├── Can_cfg.h                # 【动态】CAN 配置头
│   │   ├── Can_cfg.c                # 【动态】CAN 配置源码
│   │   ├── Can_PBcfg.c              # 【动态】后编译配置
│   │   └── output/
│   ├── Static/
│   │   ├── Can.h                    # 【静态】厂家 SDK 头
│   │   ├── Can.c                    # 【静态】厂家驱动
│   │   └── xxx_TS_T40D2M1015R0/     # 特定芯片变体
│   ├── Integration/                 # 模块集成连接
│   │   ├── ASW_xxx_MemMap.h
│   │   ├── Main.c                   # 主入口
│   │   ├── ASW/
│   │   ├── BSW/
│   │   ├── OS/
│   │   ├── RTE/
│   │   ├── Mcal/
│   │   └── ECU/
│   └── XDM/                         # MCAL 配置项目文件
│
├── OS/                             # 【操作系统】对应集成树 5️⃣
│   ├── Gen/
│   │   ├── StartOS.c                # RTA-OS 生成入口
│   │   ├── Os.h
│   │   ├── Os_cfg.h                 # OS 配置头文件
│   │   └── Os_cfg.c                 # OS 配置源码
│   └── ORTI/                        # ORTI 调试文件
│
├── Startup/                         # 启动引导
│   ├── startup_TC27x.s             # 汇编启动文件
│   ├── sys_init.c                   # 系统初始化
│   └── crt0.c                       # C 环境初始化
│
├── Linker/                          # 链接脚本
│   ├── flash.ld                     # Flash/RAM 地址映射
│   └── nvm.ld                       # NvM 区域划分
│
├── Build/                           # 构建系统
│   ├── Makefile / CMakeLists.txt
│   └── Rules.mk
│
└── Output/                          # 编译产物
    ├── Debug/
    │   ├── project.elf
    │   └── project.hex
    └── Release/
        ├── project.elf
        └── project.srec
```

**目录集成对照表：**

| 集成树分支 | 对应目录 | 生成方式 | 用户可修改 |
|-----------|---------|---------|-----------|
| 1️⃣ RTE | RTE/Gen/ | 工具自动生成 | 否（修改后变则重新生成） |
| 2️⃣ ASW | ASW/SWC*/ | 用户手写 | 是 |
| 3️⃣ MCAL | MCAL/Gen/（动态）+ MCAL/Static/（静态） | 工具+厂家 | 静态代码不可改，动态代码由配置驱动 |
| 4️⃣ BSW | BSW/*/integration（动态）+ BSW/*/src（静态） | 工具+厂家 | 用户只写 Callout 回调 |
| 5️⃣ OS | OS/Gen/ | RTA-OS 生成 | 否 |

**26.2 集成编译链**

```
[1] MCAL 代码生成（EB tresos / 厂家工具）
    ↓ *.c/*.h
[2] BSW 代码生成（DaVinci Configurator / EB tresos）
    ↓ *.c/*.h
[3] RTE 代码生成（DaVinci Developer / SystemDesk）
    ↓ Rte.c, Rte.h, SchM.c
[4] SWC 代码编写 / 生成
    ↓ SWC_*.c, SWC_*.h
[5] 编译器编译（Tasking / GCC / Green Hills）
    ↓ *.o
[6] 链接（Linker Script）
    ↓ *.elf, *.hex, *.srec
[7] 调试 / 刷写
    ↓ 下载到目标板
```

**26.3 集成编译链各阶段的文件流向**

以下流程标注了每个环节输出的文件对应集成树的哪个分支：

```
[1] 系统定义  →  System/*.arxml, DBC/LDF/ODX
    ↕ 导入 ECU 配置工具
[2] MCAL 配置（EB tresos / 厂家工具）
    ↓                                                 → MCAL/Gen/*.c.h 【3️⃣动态代码】
    ↓ MCAL_static/*.c.h                               → MCAL/Static/*.c.h 【3️⃣静态代码】
[3] BSW 配置（DaVinci Configurator Pro）
    ↓                                                 → BSW/*/integration/*.c.h 【4️⃣动态代码】
    ↓ 集成接口文件                                    → BSW/*/integration/MemMap.h 【4️⃣集成连接】
[4] RTE 生成（DaVinci Developer / SystemDesk）
    ↓                                                 → RTE/Gen/Rte.c/SchM*.h/OsTask*.c 【1️⃣RTE】
[5] SWC 代码（手写）
    ↓                                                 → ASW/SWC*/*.c.h 【2️⃣ASW】
[6] Integration（集成连接）
    ↓                                                 → MCAL/Integration/Main.c/MemMap【3️⃣集成】
[7] OS 代码生成（RTA-OS）
    ↓                                                 → OS/Gen/Os*.c.h/StartOS.c 【5️⃣OS】
[8] 编译器编译（Tasking / GCC / Green Hills）
    ↓ *.o
[9] 链接（链接脚本）
    ↓ StartUp/ + Linker/ 指定 Flash/RAM 布局
[10] 输出
    ↓ project.elf / .hex / .srec                      → Output/Debug/Release/
```

**26.4 自动化集成要点**
- 所有代码生成步骤应在 Makefile / CI Pipeline 中集成，一键执行
- ARXML 作为"唯一事实来源"（Single Source of Truth）
- BSW/ASW/MCAL/RTE 的版本号与 Git tag 对齐
- ASW 代码每次提交触发：生成 RTE → 编译 → MISRA 检查 → 静态分析（SonarQube）
- 配置变更后**必须**重新生成动态代码并重新集成，禁止手动修改 cfg/.c/.h

---

## 附录

### 附录 A：AUTOSAR CP 核心参考标准

| 标准编号 | 名称 |
|---------|------|
| ISO 14229 | UDS 诊断服务 |
| ISO 15765-2 | CAN 传输层 |
| ISO 13400 | DoIP（诊断 over IP） |
| SAE J1939 | 商用车 CAN 通信协议 |
| ASAM MCD-1 XCP | 标定与测量协议 |
| AUTOSAR 4.2.2 / 4.4.0 | Classic Platform 标准版本 |

### 附录 B：常用工具对照表

| 功能 | Vector | EB (Elektrobit) | ETAS |
|------|--------|-----------------|------|
| 系统设计 | DaVinci Developer | EB tresos Studio | SystemDesk |
| ECU 配置 | DaVinci Configurator | EB tresos Studio | ISOLAR-A |
| BSW 配置 | DaVinci Configurator Pro | EB tresos Studio | ISOLAR-B |
| 标定/测量 | CANape | — | INCA |
| 诊断工具 | CANdela Studio | — | — |
| 网络仿真 | CANoe | — | — |
| 调试 | Lauterbach | iSYSTEM | iSYSTEM |

### 附录 C：ARXML 版本兼容性

| AUTOSAR 版本 | ARXML Schema | 主要变化 |
|-------------|-------------|---------|
| 4.0.3 | 4.0 | 初始 CP 4.x 发布 |
| 4.2.2 | 4.2 | 广域网内容、多核扩展 |
| 4.4.0 | 4.4 | 信号网关、定时增强 |
| 4.6.0 | 4.6 | 安全性、功能安全扩展 |
| R21-11 | 4.7 | IP 模块增强、统一索引 |

---

> 本文档基于 AUTOSAR CP 培训材料 Chapter 25 整理，覆盖了从系统定义到编译集成的完整开发流程，可作为 AUTOSAR 工程师的日常工作参考。
> 编写日期：2026-06-27
