# AURIX S19 文件生成脚本 — 技术文档

## 1. 概述

本文档记录了 AURIX TC234/TC334/TC36X 项目中 S19 文件生成脚本的技术细节、版本差异和使用方法。

**脚本用途**：在 AURIX Development Studio (ADS) 编译完成后，自动调用 Vector HexView 工具将 Intel HEX 文件转换为 Motorola S19 格式，包含以下功能：
- Flash 驱动文件合并
- 地址范围填充（0xFF）
- RAM Flash Driver 区域 CRC 校验计算
- PFLASH 区域 CRC 校验计算
- DFlash Sector 0 CRC 校验计算（V2/V4版本）

---

## 2. 版本体系说明

### 2.1 版本功能对比

| 版本 | 脚本文件 | 命令方式 | 支持区域 | 特殊功能 |
|------|---------|---------|---------|---------|
| V1 | CreateS19.bat | 多步hexview调用 | PFlash + RAM | 基础版本 |
| V2 | CreateS19_V2.bat | 多步hexview调用 | PFlash + RAM + DFlash | 增加DFlash Sector 0 (0xAF000000-0xAF000FFF) |
| V3 | CreateS19_V3.bat | 单行hexview命令 | PFlash + RAM | V1的单行优化版，性能更快 |
| V4 | CreateS19_V4.bat | 单行hexview命令 | PFlash + RAM + DFlash | V2的单行优化版 + 0xA0→0x80 PFlash地址重映射兼容 |
| SrecCat | CreateS19_SrecCat.bat | srec_cat 统一脚本 | PFlash + DFlash(多Sector) | 芯片自动检测、0xA0→0x80映射、DFlash连续块CRC、S0 Header自定义 |
| SrecCat V2 | CreateS19_SrecCat_V2.bat | srec_cat 统一脚本 | PFlash + DFlash(多Sector) | 同上，但输出 0xA0 Non-cached 地址（0x80→0xA0映射） |

### 2.2 版本选择建议

- **V1**：基础功能，适合仅需要PFlash和RAM CRC校验的项目
- **V2**：需要DFlash数据存储功能的项目（多步调用，便于调试）
- **V3**：V1的性能优化版，单命令执行速度更快
- **V4**（推荐）：功能最全面，支持DFlash、单行命令、0xA0地址兼容
- **SrecCat**（推荐）：基于 srec_cat 的统一脚本，自动检测芯片类型，DFlash 多 Sector 支持，输出 0x80 缓存地址
- **SrecCat V2**：同 SrecCat，但输出 0xA0 非缓存地址（用于烧写工具需要 Non-cached 地址的场景）

### 2.3 DFlash Sector 0 说明

V2和V4版本新增对DFlash Sector 0的支持：

| 项目 | 值 |
|------|------|
| DFlash Sector 0 范围 | 0xAF000000-0xAF000FFF（4KB） |
| DFlash CRC 计算范围 | 0xAF000000-0xAF000FFB |
| DFlash CRC 存放地址 | 0xAF000FFC |

### 2.4 V4 PFlash 地址重映射说明

AURIX芯片的PFlash有两种地址映射方式：
- **Cached地址**：0x80xxxxxx（缓存访问，速度快，推荐）
- **Non-cached地址**：0xA0xxxxxx（直接访问）

两者映射到相同的物理内存，某些工具链生成的HEX文件使用0xA0地址。

**V4重映射机制**：
- PFlash双次合并：offset=0x00 捕获0x80地址数据 + offset=0xE0000000 捕获0xA0地址数据
- 偏移计算：0xE0000000 = -0x20000000（32位无符号溢出）
- 效果：0xA0010000 + 0xE0000000 = 0x80010000

**注意**：DFlash（0xAFxxxxxx）不需要重映射，V4脚本仅对PFlash进行地址转换。

---

## 3. 文件结构

```
S19_gen\
├── CreateS19_Document.md         (本文档)
├── CreateS19_SrecCat.bat         (SrecCat版 - 输出0x80地址)
├── CreateS19_SrecCat_V2.bat      (SrecCat V2版 - 输出0xA0地址)
├── CreateS19_Unified.bat         (统一版hexview脚本)
├── CreateS19_Unified_V2.ps1      (PowerShell统一版)
├── CreateFlashDriverCRC.bat      (FlashDriver预CRC生成)
├── CreateFlashDriverCRC.ps1      (FlashDriver预CRC - PowerShell版)
├── compare_hex_s19.py            (HEX vs S19 地址级对比工具)
├── srecord\
│   ├── srec_cat.exe              (srecord 文件转换工具)
│   ├── srec_info.exe             (srecord 文件信息查看)
│   ├── srec_cmp.exe              (srecord 文件比较)
│   └── *.dll                     (运行时依赖库)
├── FlashDriver\
│   ├── Tc234_Project_FLS_CRC.hex (TC234 预CRC Flash驱动)
│   ├── Tc334_Project_FLS_CRC.hex (TC334 预CRC Flash驱动)
│   └── Tc364_Project_FLS_CRC.hex (TC36X 预CRC Flash驱动)
├── Hexview\
│   ├── hexview.exe               (Vector HexView 工具)
│   └── ...                       (依赖库和文档)
├── TC234\                        (TC234 芯片专用 HexView 脚本)
├── TC334\                        (TC334 芯片专用 HexView 脚本)
└── TC36X\                        (TC36X 芯片专用 HexView 脚本)
```

---

## 4. 脚本用法

### 4.1 命令格式

```
CreateS19.bat <ProjDirPath> <BuildArtifactFileBaseName> <WorkspaceLoc> [ConfigName]
```

| 参数 | 说明 | ADS变量 |
|------|------|---------|
| %1 - ProjDirPath | 项目目录路径 | `${ProjDirPath}` |
| %2 - BuildArtifactFileBaseName | 构建产物基名（无扩展名） | `${BuildArtifactFileBaseName}` |
| %3 - WorkspaceLoc | 工作空间根目录 | `${workspace_loc}` |
| %4 - ConfigName | 构建配置目录名（可选，默认Debug） | `${ConfigName}` |

### 4.2 ADS Post-build 配置命令

#### TC234 项目
```
cmd /c "${workspace_loc}\S19_gen\TC234\CreateS19.bat" "${ProjDirPath}" "${BuildArtifactFileBaseName}" "${workspace_loc}" "${ConfigName}"
```

#### TC334 项目
```
cmd /c "${workspace_loc}\S19_gen\TC334\CreateS19.bat" "${ProjDirPath}" "${BuildArtifactFileBaseName}" "${workspace_loc}" "${ConfigName}"
```

#### TC36X 项目
```
cmd /c "${workspace_loc}\S19_gen\TC36X\CreateS19.bat" "${ProjDirPath}" "${BuildArtifactFileBaseName}" "${workspace_loc}" "${ConfigName}"
```

> **注意**：将 `CreateS19.bat` 替换为所需版本（V2/V3/V4）的脚本文件名。

### 4.3 手动执行示例

```cmd
cd D:\workspace\AURIX-v1.10.24-workspace\S19_gen\TC234
CreateS19.bat "D:\workspace\AURIX-v1.10.24-workspace\TC234_Project" "TC234_App" "D:\workspace\AURIX-v1.10.24-workspace" "Debug"
```

---

## 5. AURIX 内存地址映射

### 5.1 内存区域概览

| 区域 | 地址范围 | 说明 |
|------|---------|------|
| RAM | 0x70000000 起始 | 随机存取存储器，Flash Driver加载区域 |
| PFlash (Cached) | 0x80000000 起始 | 程序闪存（缓存访问） |
| PFlash (Non-cached) | 0xA0000000 起始 | 程序闪存（直接访问，与0x80映射相同物理地址） |
| DFlash | 0xAF000000 起始 | 数据闪存 |

### 5.2 各芯片详细地址映射

#### TC234 地址映射

| 区域 | 地址范围 | CRC地址 | 大小 | 版本支持 |
|------|---------|---------|------|---------|
| RAM Flash Driver | 0x70026000-0x700287fb | 0x700287fc | ~10KB | V1-V4 |
| PFlash | 0x80010000-0x801fffff | 0x801ffffc | ~2MB | V1-V4 |
| DFlash Sector 0 | 0xAF000000-0xAF000FFF | 0xAF000FFC | 4KB | V2, V4 |

#### TC334 地址映射

| 区域 | 地址范围 | CRC地址 | 大小 | 版本支持 |
|------|---------|---------|------|---------|
| RAM Flash Driver | 0x70024000-0x700287fb | 0x700287fc | ~18KB | V1-V4 |
| PFlash | 0x80010000-0x801fffff | 0x801ffffc | ~2MB | V1-V4 |
| DFlash Sector 0 | 0xAF000000-0xAF000FFF | 0xAF000FFC | 4KB | V2, V4 |

#### TC36X 地址映射

| 区域 | 地址范围 | CRC地址 | 大小 | 版本支持 |
|------|---------|---------|------|---------|
| RAM Flash Driver | 0x70024000-0x700287fb | 0x700287fc | ~18KB | V1-V4 |
| PFlash0 | 0x80010000-0x801fffff | 0x801ffffc | ~2MB | V1-V4 |
| PFlash1 (MO合并范围) | 0x80030000-0x804fffff | - | - | V1-V4 |
| PFlash1 (FR/CS9范围) | 0x80300000-0x804fffff | 0x804ffffc | ~2MB | V1-V4 |
| DFlash Sector 0 | 0xAF000000-0xAF000FFF | 0xAF000FFC | 4KB | V2, V4 |

### 5.3 TC234 内存布局图

```
RAM (Random Access Memory)
┌────────────────────────────────────┐ 0x70028800
│           CRC (4 bytes)            │ 0x700287fc
├────────────────────────────────────┤
│                                    │
│     Flash Driver Storage Area      │
│           (~10KB)                  │
│                                    │
└────────────────────────────────────┘ 0x70026000

PFLASH (Program Flash)
┌────────────────────────────────────┐ 0x80200000
│           CRC (4 bytes)            │ 0x801ffffc
├────────────────────────────────────┤
│                                    │
│      Application Code Area         │
│           (~2MB)                   │
│                                    │
├────────────────────────────────────┤ 0x80010000
│      Reserved / Bootloader         │
└────────────────────────────────────┘ 0x80000000

DFLASH (Data Flash) - V2/V4 only
┌────────────────────────────────────┐ 0xAF001000
│           CRC (4 bytes)            │ 0xAF000FFC
├────────────────────────────────────┤
│                                    │
│       Data Storage Sector 0        │
│             (4KB)                  │
│                                    │
└────────────────────────────────────┘ 0xAF000000
```

### 5.4 TC36X 内存布局图

```
PFLASH1 (Program Flash Bank 1)
┌────────────────────────────────────┐ 0x80500000
│           CRC (4 bytes)            │ 0x804ffffc
├────────────────────────────────────┤
│      Application Code Area 2       │
│           (~2MB)                   │
├────────────────────────────────────┤ 0x80300000
│           (gap)                    │
├────────────────────────────────────┤ 0x80200000

PFLASH0 (Program Flash Bank 0)
┌────────────────────────────────────┐ 0x80200000
│           CRC (4 bytes)            │ 0x801ffffc
├────────────────────────────────────┤
│      Application Code Area 1       │
│           (~2MB)                   │
├────────────────────────────────────┤ 0x80010000
│      Reserved / Bootloader         │
└────────────────────────────────────┘ 0x80000000
```

---

## 6. HexView 命令参数详解

### 6.1 参数说明表

| 参数 | 语法 | 含义 |
|------|------|------|
| `/MO:` | `/MO:file1;offset1+file2;offset2:startaddr-endaddr` | 合并多个文件，指定各文件偏移量和最终地址映射范围 |
| `/FP:` | `/FP:XX` | 填充模式，指定填充字节值（如 FF） |
| `/FR:` | `/FR:startaddr-endaddr` | 填充范围，与 /FP: 配合使用，多范围用冒号分隔 |
| `/CS9:` | `/CS9:@addr;startaddr-endaddr` | 计算指定范围的 CRC32 校验值并写入 @addr 地址 |
| `/s` | `/s` | 静默模式，无 GUI 弹窗 |
| `/XS:` | `/XS:32` | 输出格式为 S32（32位地址的 Motorola S-Record） |
| `-o` | `-ofile` | 指定输出文件路径 |

### 6.2 /MO: 参数详细说明

```
/MO:file1;offset1+file2;offset2:startaddr-endaddr
    │      │       │      │      │
    │      │       │      │      └── 地址映射范围（冒号分隔）
    │      │       │      └── 第二个文件的偏移量
    │      │       └── 第二个文件（加号连接）
    │      └── 第一个文件的偏移量（分号分隔）
    └── 第一个文件
```

**示例**：`/MO:FLS.hex;0x00+APP.hex;0x00:0x80010000-0x801fffff`
- 合并 FLS.hex 和 APP.hex
- 两个文件偏移量都为 0
- 映射到地址范围 0x80010000-0x801fffff

### 6.3 /CS9: 参数详细说明

```
/CS9:@addr;startaddr-endaddr
      │     │
      │     └── CRC 计算范围
      └── CRC 值写入地址（@符号前缀）
```

**示例**：`/CS9:@0x801ffffc;0x80010000-0x801ffffb`
- 计算范围：0x80010000 到 0x801ffffb
- CRC 值写入地址：0x801ffffc（紧接计算范围之后）

### 6.4 多范围语法

`/FR:` 和 `/CS9:` 支持多范围，使用冒号分隔：
```
/FR:range1:range2:range3
/CS9:@addr1;range1:@addr2;range2:@addr3;range3
```

---

## 7. 各版本脚本操作步骤对比

### 7.1 V1 版本步骤（4步）

| 步骤 | 操作 | 说明 |
|------|------|------|
| Step 1 | 文件合并 | 将 Flash 驱动和应用程序 HEX 合并，映射到 PFLASH 地址范围 |
| Step 2 | 地址填充 | 用 0xFF 填充 PFLASH 区域未使用的空间 |
| Step 3 | RAM CRC | 计算 RAM Flash Driver 区域的 CRC 校验值并写入 |
| Step 4 | PFLASH CRC | 计算 PFLASH 程序区域的 CRC 校验值并写入 |

### 7.2 V2 版本步骤（6步）

| 步骤 | 操作 | 说明 |
|------|------|------|
| Step 1 | 文件合并 | 合并 HEX 文件，包含 PFLASH 和 DFlash Sector 0 |
| Step 2 | PFLASH 填充 | 用 0xFF 填充 PFLASH 区域 |
| Step 3 | DFlash 填充 | 用 0xFF 填充 DFlash Sector 0 区域 |
| Step 4 | RAM CRC | 计算 RAM Flash Driver 区域的 CRC |
| Step 5 | PFLASH CRC | 计算 PFLASH 程序区域的 CRC |
| Step 6 | DFlash CRC | 计算 DFlash Sector 0 的 CRC |

### 7.3 V3 版本步骤（1步）

| 步骤 | 操作 | 说明 |
|------|------|------|
| Step 1 | 单命令生成 | 一条hexview命令完成合并、填充、CRC计算（等同V1功能） |

### 7.4 V4 版本步骤（1步）

| 步骤 | 操作 | 说明 |
|------|------|------|
| Step 1 | 单命令生成 | 一条hexview命令完成：合并（含0xA0重映射）、填充、3/4个CRC计算 |

### 7.5 TC36X 特殊说明

TC36X 使用双 PFLASH Bank 架构：
- V1/V3 版本：5步操作（含PFLASH0和PFLASH1两个CRC）
- V2/V4 版本：增加DFlash CRC，共4个CRC计算

---

## 8. srec_cat 版本脚本详解

### 8.1 与 HexView 版本的差异

| 对比项 | HexView 版本 (V1-V4) | SrecCat 版本 |
|--------|---------------------|--------------|
| 工具链 | hexview.exe (Vector) | srec_cat.exe (开源 srecord) |
| 脚本结构 | 每芯片独立脚本 (TC234/TC334/TC36X 各一套) | 统一脚本，自动检测芯片 |
| FlashDriver | 原始 HEX（脚本内计算 RAM CRC） | 预 CRC 版本（*_CRC.hex，CRC 预先计算） |
| DFlash 支持 | 仅 Sector 0 (4KB) | 连续块模式（首末 Sector 间全部处理） |
| PFlash 地址 | V4 支持 0xA0→0x80 映射 | SrecCat: 0xA0→0x80 / SrecCat V2: 0x80→0xA0 |
| S19 Header | 默认（srecord 官网 URL） | 自定义：YYYY/MM/DD 用户名 |
| 输出验证 | 无 | srec_info 自动打印地址范围 |

### 8.2 命令格式

```
CreateS19_SrecCat.bat <ProjDirPath> <BuildArtifactFileBaseName> <WorkspaceLoc> [ConfigName] [ChipType]
```

| 参数 | 说明 | 必填 |
|------|------|------|
| %1 | 项目目录路径 | 是 |
| %2 | 构建产物基名（无扩展名） | 是 |
| %3 | 工作空间根目录 | 是 |
| %4 | 构建配置目录名（默认 Debug） | 否 |
| %5 | 芯片类型（TC23X/TC33X/TC36X） | 否（可自动检测） |

ADS Post-build 配置：
```
cmd /c "${workspace_loc}\S19_gen\CreateS19_SrecCat.bat" "${ProjDirPath}" "${BuildArtifactFileBaseName}" "${workspace_loc}" "${ConfigName}" "TC23X"
```

### 8.3 芯片自动检测机制

优先级：
1. 第5参数显式指定 → 直接使用
2. 读取项目 .cproject 文件中的 `com.tasking.ctc.cpu` 字段 → 自动匹配

### 8.4 DFlash 连续块 CRC 模式

与旧版仅处理固定 Sector 0 不同，SrecCat 版本：
1. 扫描所有 DFlash Sector，找到首个和末个有数据的 Sector
2. 将首→末之间的整个范围视为一个连续块
3. 空隙填充 0x00
4. 对整块计算 CRC32 Big Endian，CRC 放在末尾 4 字节

DFlash Sector 配置：

| 芯片 | Sector 数量 | Sector 大小 | 总范围 |
|------|------------|------------|--------|
| TC23X | 16 | 8KB (0x2000) | 0xAF000000 - 0xAF020000 |
| TC33X | 32 | 4KB (0x1000) | 0xAF000000 - 0xAF020000 |
| TC36X | 32 | 4KB (0x1000) | 0xAF000000 - 0xAF020000 |

### 8.5 PFlash 地址处理

**SrecCat (原版) — 输出 0x80 Cached 地址：**
- 检测 HEX 中 0x80 和 0xA0 两种 PFlash 数据
- 将 0xA0 数据通过 offset -0x20000000 映射到 0x80
- 合并后在 0x80 地址空间计算 CRC、生成 S19

**SrecCat V2 — 输出 0xA0 Non-cached 地址：**
- 将 0x80 数据通过 offset +0x20000000 映射到 0xA0
- 合并后在 0xA0 地址空间计算 CRC、生成 S19
- 适用于烧写工具需要 Non-cached 地址的场景

TC36X 双 PFlash 地址表：

| 区域 | SrecCat (0x80) | SrecCat V2 (0xA0) |
|------|----------------|-------------------|
| PFlash0 | 0x80010000 ~ 0x801FFFFF | 0xA0010000 ~ 0xA01FFFFF |
| PFlash0 CRC | 0x801FFFFC | 0xA01FFFFC |
| PFlash1 | 0x80300000 ~ 0x804FFFFF | 0xA0300000 ~ 0xA04FFFFF |
| PFlash1 CRC | 0x804FFFFC | 0xA04FFFFC |

### 8.6 S19 Header 自定义

S0 记录内容自动设为 `YYYY/MM/DD 用户名`，通过 wmic 获取日期（区域设置无关），`%USERNAME%` 获取用户名。

### 8.7 srec_cat 关键参数说明

| 参数 | 含义 |
|------|------|
| `-crop start end` | 裁剪到指定半开区间 [start, end) |
| `-fill value start end` | 用指定值填充区间空隙 |
| `-offset value` | 地址偏移 |
| `-CRC32_Big_Endian addr` | 在 addr 处写入前续数据的 CRC32 (Big Endian) |
| `-exclude start end` | 从输出中排除指定区间 |
| `-redundant-bytes=ignore` | 忽略重复地址的相同数据 |
| `-contradictory-bytes=ignore` | 忽略重复地址的冲突数据 |
| `-address-length=4` | S19 输出使用 4 字节地址 (S3 记录) |
| `-obs=32` | 每条 S-record 输出最大 32 数据字节 |
| `-header="string"` | 自定义 S0 Header 内容 |
| `-o file` | 指定输出文件 |

---

## 9. 辅助工具

### 9.1 compare_hex_s19.py — HEX vs S19 对比工具

用途：按 ROM 地址逐字节对比 Intel HEX 和 Motorola S19 文件（非按行对比）。

```
python compare_hex_s19.py <file.hex> <file.s19> [--verbose]
```

功能：
- 解析 Intel HEX (Type 00/01/02/04) 和 S-record (S0~S9)
- 构建地址→字节映射，逐字节比较
- 输出：地址范围摘要、匹配/不匹配统计、差异详情、独占区域
- `--verbose`：显示所有差异区域（默认前10个）

### 9.2 CreateFlashDriverCRC.bat — FlashDriver 预 CRC 工具

用途：为 FlashDriver HEX 文件预计算 RAM 区域 CRC32，生成 *_CRC.hex 文件。SrecCat 脚本使用预 CRC 版本，避免运行时重复计算。

---

## 10. 多平台差异对比

### 10.1 三平台配置差异总表

| 配置项 | TC234 | TC334 | TC36X |
|--------|-------|-------|-------|
| Flash 驱动文件 | `Tc234_Project_FLS.hex` | `TC334_FlashDriver.hex` | `Tc364_Project_FLS.hex` |
| PFLASH 映射 | 单范围 | 单范围 | **双范围**（PFLASH0 + PFLASH1） |
| PFLASH0 范围 | `0x80010000-0x801fffff` | `0x80010000-0x801fffff` | `0x80010000-0x801fffff` |
| PFLASH1 范围 | — | — | `0x80300000-0x804fffff` |
| 填充范围数 | 1 个（V1/V3）或 2 个（V2/V4） | 1 个（V1/V3）或 2 个（V2/V4） | **2 个**（V1/V3）或 **3 个**（V2/V4） |
| RAM CRC 范围 | `0x70026000-0x700287fb` | `0x70024000-0x700287fb` | `0x70024000-0x700287fb` |
| RAM CRC 地址 | `0x700287fc` | `0x700287fc` | `0x700287fc` |
| PFLASH0 CRC 地址 | `0x801ffffc` | `0x801ffffc` | `0x801ffffc` |
| PFLASH1 CRC 地址 | — | — | `0x804ffffc` |
| DFlash CRC 地址 | `0xAF000FFC`（V2/V4） | `0xAF000FFC`（V2/V4） | `0xAF000FFC`（V2/V4） |
| CRC 计算次数 | 2次（V1/V3）或 3次（V2/V4） | 2次（V1/V3）或 3次（V2/V4） | **3次**（V1/V3）或 **4次**（V2/V4） |

---

## 11. ADS 配置步骤

### 11.1 配置流程

1. 右键点击项目 → **Properties**
2. 展开 **C/C++ Build** → **Settings**
3. 切换到 **Build Steps** 选项卡
4. 在 **Post-build steps** 区域的 **Command** 输入框中填入对应平台的命令（见 4.2）
5. 在 **Description** 中填写：`Generate S19 file`
6. 点击 **Apply and Close**

### 11.2 配置说明

| 字段 | 值 | 说明 |
|------|------|------|
| Command | `cmd /c "..."` | 使用 cmd 执行批处理脚本 |
| `${workspace_loc}` | 工作空间路径 | 用于定位脚本和 HexView |
| `${ProjDirPath}` | 项目路径 | 用于定位输入输出文件 |
| `${BuildArtifactFileBaseName}` | 构建产物基名 | 用于确定文件名 |
| `${ConfigName}` | 构建配置目录名 | 构建输出所在目录（第4参数，可选，默认 Debug） |

> **注意**：`${ConfigName}` 会自动匹配项目的构建配置目录名（如 TC234 为 `Debug`，TC334 可能为 `TriCore Debug (TASKING)` 等）。

---

## 12. ADS 常用 Eclipse 变量参考

### 12.1 构建产物相关变量

| 变量 | 含义 | 示例值 |
|------|------|--------|
| `${BuildArtifactFileName}` | 构建产物完整文件名（含前缀和扩展名） | `TC234_App.elf` |
| `${BuildArtifactFileBaseName}` | 构建产物基名称（无前缀、无扩展名） | `TC234_App` |
| `${BuildArtifactFilePrefix}` | 构建产物文件名前缀 | （通常为空） |
| `${BuildArtifactFileExtension}` | 构建产物文件扩展名 | `elf` |

### 12.2 路径相关变量

| 变量 | 含义 | 示例值 |
|------|------|--------|
| `${ProjDirPath}` | 项目根目录的绝对路径 | `D:/workspace/AURIX-v1.10.24-workspace/TC234_Project` |
| `${workspace_loc}` | 工作空间根目录的绝对路径 | `D:/workspace/AURIX-v1.10.24-workspace` |
| `${ProjName}` | 项目名称 | `TC234_Project` |
| `${ConfigName}` | 当前活动的构建配置名称 | `Debug` |

### 12.3 注意事项

1. **路径斜杠方向**：Eclipse 变量输出的路径使用正斜杠 `/`（如 `D:/workspace/...`），Windows 批处理需要反斜杠 `\`，脚本中会自动转换。
2. **空格和特殊字符**：`${ConfigName}` 可能包含空格和括号（如 `TriCore Debug (TASKING)`），使用时必须用引号包裹。
3. **大小写敏感**：Eclipse 变量名区分大小写。

---

## 13. 故障排查指南

### 13.1 常见错误及解决方法

| 错误信息 | 可能原因 | 解决方法 |
|----------|----------|----------|
| `HexView.exe not found` | HexView 路径不正确 | 检查 `${workspace_loc}` 是否正确指向工作空间根目录 |
| `Flash driver file not found` | Flash 驱动文件缺失 | 确认对应平台目录下存在 Flash 驱动 HEX 文件 |
| `Application HEX file not found` | 应用 HEX 文件缺失 | 确认项目已成功编译，配置目录下存在 `.hex` 文件 |
| `Failed to merge files` | 文件合并失败 | 检查地址范围、HEX 文件格式是否正确 |
| `Failed to fill range` | 地址填充失败 | 检查 S19 文件是否已正确生成 |
| `Failed to create CRC` | CRC 计算失败 | 检查地址范围是否超出文件内容 |
| 中文乱码 | 编码不匹配 | 脚本中仅使用英文输出 |
| 路径错误 | 斜杠方向不对 | 确认脚本中已进行正斜杠到反斜杠的转换 |

### 13.2 调试方法

1. **手动执行脚本**：在命令行中逐步执行，观察每步输出
2. **检查中间输出**：观察每个步骤的 `[OK]` 或 `[ERROR]` 输出
3. **验证文件存在性**：逐一确认脚本中涉及的所有文件路径

### 13.3 已知限制

| 限制 | 说明 |
|------|------|
| 路径不支持空格 | 由于 `/MO:` 参数的解析方式，项目路径和工作空间路径中不应包含空格 |
| HexView 版本兼容性 | 请使用提供的 HexView 版本，其他版本可能参数格式不同 |

---

## 14. 技术实现细节

### 14.1 HexView /MO: 参数盘符冒号冲突问题

**问题**：`/MO:` 参数语法使用 `:` 作为地址范围分隔符，而 Windows 完整文件路径中盘符也包含 `:`，HexView 无法正确区分。

**解决方案**：
1. 使用 `pushd` 切换到目标目录
2. 将 Flash 驱动文件临时复制到该目录
3. 在 `/MO:` 参数中仅使用纯文件名（不含路径）
4. 合并完成后清理临时文件

```batch
@REM 复制 Flash 驱动到构建目录
copy "%FLS_DRV_FILE%" "%PROJ_DIR%\%CONFIG_NAME%\FlashDriver.hex" >nul

@REM 切换到构建目录，使用纯文件名调用
pushd "%PROJ_DIR%\%CONFIG_NAME%"
"%HEXVIEW_EXE%" /MO:FlashDriver.hex;0x00+%BUILD_NAME%.hex;0x00:0x80010000-0x801fffff /s /XS:32 -o%BUILD_NAME%.s19
popd

@REM 清理临时文件
del /f /q "%PROJ_DIR%\%CONFIG_NAME%\FlashDriver.hex" >nul 2>&1
```

### 14.2 V4 PFlash 双次合并实现

V4脚本通过两次合并同一HEX文件来兼容0x80和0xA0两种地址格式：

```batch
/MO:FlashDriver.hex;0x00+%BUILD_NAME%.hex;0x00:0x80010000-0x801fffff+%BUILD_NAME%.hex;0xE0000000:0x80010000-0x801fffff
```

- 第一次合并：`offset=0x00`，捕获HEX中已有的0x80地址数据
- 第二次合并：`offset=0xE0000000`，将0xA0地址数据转换为0x80地址

**偏移量计算原理**：
- 目标：将0xA0xxxxxx转换为0x80xxxxxx
- 偏移量 = 0x80000000 - 0xA0000000 = -0x20000000
- 在32位无符号表示中：-0x20000000 = 0xE0000000（利用整数溢出）

---

## 15. 版本记录

| 版本 | 日期 | 修改内容 |
|------|------|----------|
| V1.0 | 原始版本 | 初始版本，硬编码文件名，无参数化，无错误处理 |
| V2.0 | 2026-03-23 | 参数化改造，支持 ADS Post-build steps 集成调用 |
| V2.1 | 2026-03-23 | 修复中文乱码问题（改用英文输出），修复路径斜杠方向问题 |
| V2.2 | 2026-03-23 | 修复 HexView `/MO:` 参数盘符冒号冲突问题（使用 pushd + 纯文件名方案） |
| V2.3 | 2026-03-24 | 新增 V2 版本脚本，支持 DFlash Sector 0 |
| V2.4 | 2026-03-24 | 新增 V3 版本脚本，单行命令优化 |
| V2.5 | 2026-03-24 | 新增 V4 版本脚本，支持 0xA0→0x80 地址重映射 |
| V3.0 | 2026-03-25 | 文档全面更新：修正 RAM/DFlash 命名错误，补充版本体系说明，更新地址映射表 |
| V4.0 | 2026-05-11 | 新增 srec_cat 版本统一脚本（CreateS19_SrecCat.bat），支持芯片自动检测、DFlash 连续块 CRC、S0 Header 自定义 |
| V4.1 | 2026-05-27 | 新增 SrecCat V2（输出 0xA0 Non-cached 地址）；新增 compare_hex_s19.py 对比工具 |

---

## 16. 参考资料

- Vector HexView Reference Manual (`S19_gen\Hexview\ReferenceManual_HexView.pdf`)
- AURIX TC23x User Manual
- AURIX TC33x User Manual
- AURIX TC36x User Manual
- Infineon AURIX Development Studio Documentation
- SRecord Reference Manual (`S19_gen\srecord-1.65.0-win64\share\doc\srecord\reference-1.65.pdf`)

---

*文档版本：V4.1*  
*创建日期：2026-03-23*  
*最后更新：2026-05-27*  
*适用项目：TC234 / TC334 / TC36X 系列*
