P3 batch translation + project complete: 24 PDFs (RTE + Libraries + GlobalTime + HMI + Chassis + Powertrain + Tools + ReleaseDocumentation). All 216 PDFs now translated. 173K+ lines total.

This commit is contained in:
opencode-translator
2026-06-13 10:43:16 +08:00
parent 784f11ab73
commit f5197069cb
26 changed files with 17233 additions and 91 deletions
@@ -0,0 +1,971 @@
# AUTOSAR SWS SynchronizedTimeBaseManager — 同步时基管理器规范
## 文档元信息
| 字段 | 值 |
|------|-----|
| **文档标题** | Specification of Synchronized Time-Base Manager(同步时基管理器规范) |
| **文档所有者** | AUTOSAR |
| **文档责任方** | AUTOSAR |
| **文档标识号** | 421 |
| **文档状态** | Final(最终版) |
| **所属 AUTOSAR 标准** | Classic Platform(经典平台) |
| **所属标准版本** | 4.4.0 |
## 文档变更历史
| 日期 | 版本 | 变更人 | 变更说明 |
|------|------|--------|----------|
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | • 修改以增强全局时间同步的精度<br>• 其他次要更正/澄清/编辑修改 |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | • 更正和澄清如何应用速率校正<br>• 阐明 Time Base Status 和 Time Leap 行为 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | • 新增速率校正<br>• 新增时间精度测量支持<br>• 新增时间/状态通知机制<br>• 各种增强和更正 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | • 为 `StbM_Init` 添加配置参数参数<br>• `StbM_TimeStampRawType` 改为 uint32<br>• `StbM_BusSetGlobalTime` 允许 `userDataPtr` 为 NULL<br>• 为通过指针传递的输入参数添加 `const`<br>• 调试支持标记为过时 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | • 纳入"全局时间同步"概念以替换(并改进)原始功能并支持新功能,例如:<br>  支持 CAN 和以太网<br> – 支持网关以启用跨多个总线的时域<br>• 由于缺陷,R4.0/1 内容已被删除(如客户 API + 时基提供程序轮询)。例外:同步 OS 调度表的 API |
| 2014-03-31 | 4.1.3 | AUTOSAR Release Management | • 阐明自治时基维护 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | • 新增参数 `StbMMainFunctionPeriod`<br>• 删除需求 `StbM_0030``00035`<br>• 关于服务接口的章节重组和澄清<br>• 参数 `StbMFlexRayClusterRef` / `StbMTtcanClusterRef` 标记为过时<br>• 编辑性变更 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | • 新增"已知限制"<br>• 消除错误处理中的矛盾<br>• 新增服务接口章节<br>• 根据新的 SWS_BSWGeneral 重新设计 |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | • 新增绝对时间提供功能 |
| 2010-09-30 | 3.1.5 | AUTOSAR Administration | • SRS_GeneralSRS_BSW_00004<br>• SWS 文档中提到的标准化 AUTOSAR 接口的绑定特性<br>• 缺少的 Port Driver DET 错误代码 |
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | • 初始发布 |
## 目录
- [1 介绍与功能概述](#1-介绍与功能概述)
- [1.1 用例](#11-用例)
- [1.2 功能概述](#12-功能概述)
- [2 缩写、缩略语和定义](#2-缩写缩略语和定义)
- [3 相关文档](#3-相关文档)
- [4 约束和假设](#4-约束和假设)
- [5 与其他模块的依赖](#5-与其他模块的依赖)
- [6 需求追踪](#6-需求追踪)
- [7 功能规范](#7-功能规范)
- [7.1 启动行为](#71-启动行为)
- [7.2 关闭行为](#72-关闭行为)
- [7.3 正常运行](#73-正常运行)
- [7.4 错误处理](#74-错误处理)
- [7.5 错误分类](#75-错误分类)
- [7.6 版本检查](#76-版本检查)
- [8 API 规范](#8-api-规范)
- [9 时序图](#9-时序图)
- [10 配置规范](#10-配置规范)
- [11 不适用的需求](#11-不适用的需求)
---
## 1 介绍与功能概述
本文档规定了同步时基管理器(Synchronized Time-Base ManagerStbM)模块的功能、API 和配置。
同步时基管理器的目的是向其客户提供同步时基,即与分布式系统其他节点上的时基同步的时基。
### 1.1 用例
同步时基管理器支持两个主要用例:
#### a) RunnableEntity 的同步
任意数量的 RunnableEntity 必须同步执行。"同步"意味着它们应以定义良好且有保证的相对偏移开始(例如相对偏移"0"表示应在同一时间点执行)。
此类需求可以由 AUTOSAR Timing Extensions [10] 指定,并且必须独立于软件组件的实际部署来满足。
此用例的典型示例是不同 RunnableEntity 的传感器数据读出或同步执行器触发。
#### b) 提供绝对时间值
应用(和其他 BSW 模块)应提供一个中央模块,负责提供关于绝对时间和时间流逝的信息。
此用例的典型示例包括:
- **传感器数据融合**:可以时间相关来自各种传感器系统(如雷达或立体多用途相机)的数据
- **事件数据记录**:在某些情况下(如碰撞),需要存储关于不同 ECU 事件和内部状态的数据。为了对这些事件和状态进行时间相关,需要一个公共时基
- **诊断事件存储的同步日历时间访问**
### 1.2 功能概述
**图 1:作为代理的同步时基管理器**(参见原文 PDF 第 9 页)
同步时基管理器本身不提供网络时间协议或时间协商协议来将其(本地)时基与在其他节点上的时基同步。它与 BSW 的 `<Bus>TSyn` 模块交互以实现此类同步。如图 1 所示,那些模块充当时基提供程序(Time Base Provider)的角色并支持上述时间协议。
利用从提供程序模块获取的信息,同步时基管理器能够将其时基与其他节点上的时基同步。
充当客户角色的 BSW 模块和 SW-C 使用由同步时基管理器提供和管理的时间信息。可以区分三种类型的客户:
- a) **触发客户**Triggered customer
- b) **活动客户**Active customer
- c) **通知客户**Notification customer
因此,同步时基管理器通过向客户提供对同步时基的访问来充当时基代理(broker)。这样做,同步时基管理器从"真实"时基提供程序中抽象出来。
在时基提供程序的更新之间提供对同步时基的访问通常通过使用硬件参考时钟来实现;通常与跟踪硬件参考时钟溢出的软件计数器结合使用。软件计数器和硬件参考时钟一起形成虚拟本地时间(Virtual Local Time)(尽管名称如此,虚拟本地时间实际上是一个已实现的实现)。
此时间随后用于驱动时基的时间,考虑到它们的速率偏差(Rate Deviations)和与虚拟本地时间的偏移(Offsets)。
---
## 2 缩写、缩略语和定义
### 2.1 缩写和缩略语
| 缩写/缩略语 | 描述 |
|------------|------|
| StbM | Synchronized Time-Base Manager(同步时基管理器) |
| VLT | Virtual Local Time(虚拟本地时间) |
| TB | Time Base(时基) |
| TBP | Time Base Provider(时基提供程序) |
| TD | Time Domain(时域) |
| TG | Time Gateway(时间网关) |
| GTM | Global Time Master(全局时间主站) |
| TS | Time Slave(时间从站) |
| TSD | Time Sub-Domain(时间子域) |
| TBU | Time Base Unit(时基单元) |
| SDT | Synchronized Time Domain(同步时域) |
| GPT | General Purpose Timer(通用定时器) |
| DET | Default Error Tracer(默认错误追踪器) |
| DEM | Diagnostic Event Manager(诊断事件管理器) |
### 2.2 定义
#### 2.2.1 Clock(时钟)
提供具有已知精度的循环时间值的源,由本地硬件时间基准和软件计数器组成。
#### 2.2.2 Global Time Master(全局时间主站)
全局时基的所有者,即从中导出所有其他时基的时基。
#### 2.2.3 Synchronized Time Base(同步时基)
与一个或多个其他节点上的对应时基同步的时基。
#### 2.2.4 Time Base(时基)
一个时间值,可由一个或多个客户读取。StbM 支持三种类型的时基:同步时基、偏移时基和纯本地时基。
#### 2.2.5 Time Base Provider(时基提供程序)
通过特定于总线的通信提供来自其他节点的时基的模块,例如 `<Bus>TSyn` 模块。
#### 2.2.6 Time Communication Port(时间通信端口)
时基提供程序与同步时基管理器之间通信的端口。
#### 2.2.7 Time Communication Service(时间通信服务)
用于交换时基信息的服务接口。
#### 2.2.8 Time Base Customer(时基客户)
消耗时基的模块。三种类型的客户:
- **触发客户**:由同步时基管理器直接触发,与当前(全局)时间定义和时间流逝同步
- **活动客户**:主动从同步时基管理器获取时间值
- **通知客户**:通过时间通知机制接收时间更新通知
#### 2.2.9 Time Domain(时域)
具有共同时基的 ECUs 集合。
#### 2.2.10 Time Gateway(时间网关)
将一个总线的时基分发到一个或多个其他总线的 ECU。
#### 2.2.11 Time Hierarchy(时间层次结构)
表示时基主从关系和派生的层次结构。
#### 2.2.12 Time Master(时间主站)
对于特定时基是主站,并将该时基分发到一组时间从站。
#### 2.2.13 Time Slave(时间从站)
从时间主站接收时基的实体。
#### 2.2.14 Time Sub-domain(时间子域)
时域的子集,具有自己的子时基。
#### 2.2.15 Timesync ECUTimesync ECU
参与时间同步的 ECU。
#### 2.2.16 Timesync ModuleTimesync 模块)
`<Bus>TSyn` 模块,如 `CanTSyn``FrTSyn``EthTSyn`
#### 2.2.17 Virtual Local Time(虚拟本地时间)
本地硬件时钟和软件计数器的组合,提供高分辨率的本地时间参考。
#### 2.2.18 Time Correction(时间校正)
调整本地时基以与全局时基对齐的过程。StbM 支持三种类型的时间校正:
#### 2.2.19 Offset Correction(偏移校正)
通过将偏移时间值加到虚拟本地时间来调整时基。
#### 2.2.20 Jump Correction(跳变校正)
通过突然改变时基值来调整时基。
#### 2.2.21 Rate Adaption(速率适配)
通过调整本地时基的速率来匹配全局时基的速率。
---
## 3 相关文档
### 3.1 输入文档
| 编号 | 文档 |
|------|------|
| [1] | AUTOSAR Layered Software Architecture — AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf |
| [2] | AUTOSAR Generic Timer Module — AUTOSAR_SWS_Gpt.pdf |
| [3] | AUTOSAR OS Specification — AUTOSAR_SWS_OS.pdf |
| [4] | AUTOSAR BSW Scheduler — AUTOSAR_SWS_Scheduler.pdf |
| [5] | General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral.pdf |
| [6] | AUTOSAR Requirements on Time Synchronization — AUTOSAR_RS_TimeSynchronization.pdf |
| [7] | AUTOSAR Requirements on Basic Software Modules — AUTOSAR_SRS_BSWGeneral.pdf |
| [8] | AUTOSAR Specification of ECU State Manager — AUTOSAR_SWS_EcuM.pdf |
| [9] | AUTOSAR Specification of Default Error Tracer — AUTOSAR_SWS_DET.pdf |
| [10] | AUTOSAR Timing Extensions — AUTOSAR_TPS_TimingExtensions.pdf |
| [11] | AUTOSAR Specification of Synchronized Time-Base Manager (this document) |
### 3.2 相关标准和规范
请参考原文 PDF 第 22 页。
### 3.3 相关规范
AUTOSAR 提供了关于基础软件的一般规范(SWS BSW General [5]),该规范对 StbM 也有效。
---
## 4 约束和假设
### 4.1 限制
#### 4.1.1 OS ScheduleTable
StbM 仅支持 OS ScheduleTable 的显式同步。
#### 4.1.2 Synchronized Time Base Identifier(同步时基标识符)
每个时基由 `StbM_SynchronizedTimeBaseType` 标识。允许的值范围是 0 到 65534。值 65535 是保留值。
#### 4.1.3 模式切换
模式切换不会影响 StbM 的时基管理。
#### 4.1.4 配置
StbM 支持 post-build 变体但不支持 post-build 可加载配置。
#### 4.1.5 Out of scope(超出范围)
StbM 不处理以下内容:
- 安全相关的时间处理
- 加密时间戳
### 4.2 适用域
需要跨多个 ECU 同步时间的系统。
### 4.3 冲突
没有已知的冲突。
---
## 5 与其他模块的依赖
StbM 与以下模块交互:
- **GPT**(通用定时器)— 用于时间通知客户的时间触发
- **OS**(操作系统)— 用于 ScheduleTable 同步
- **`<Bus>TSyn` 模块**(如 `CanTSyn``FrTSyn``EthTSyn`)— 时基提供程序
- **BswM**(基础软件模式管理器)— 模式管理
- **DET**(默认错误追踪器)— 开发错误报告
- **EcuM**(ECU 状态管理器)— 初始化和关闭
**图 2StbM 模块依赖关系**(参见原文 PDF 第 25 页)
### 5.1 代码文件结构
请参阅 SWS BSW General [5]。
### 5.2 头文件结构
请参阅 SWS BSW General [5]。
---
## 6 需求追踪
需求追踪表列出了 RS_TS_*、SRS_BSW_*、SRS_StbM_* 系列需求与 SWS_StbM_* 需求之间的映射关系。完整表格请参考原文 PDF 第 26-34 页。
主要追踪的需求系列包括:
| 需求系列 | 描述 |
|---------|------|
| RS_TS_00005/00006 | 获取当前时间 |
| RS_TS_00008 | 获取虚拟本地时间 |
| RS_TS_00010 | 设置全局时间 |
| RS_TS_00014 | 时基管理 |
| RS_TS_00029/00030/00031 | 时间同步 |
| SRS_BSW_00101 | 模块初始化 |
| SRS_BSW_00323/00337 | API 参数检查和错误分类 |
| SRS_BSW_00358/00406/00414 | 状态变量、版本信息 |
| SRS_BSW_00407 | GetVersionInfo API |
---
## 7 功能规范
> **📌 摘要说明(第 7 章)**:第 7 章是 StbM 的核心功能规范章节,原文 PDF 第 35-76 页包含完整的算法描述、状态机、流程图和示例。本文档仅翻译关键概念和需求。
### 7.1 启动行为
#### 7.1.1 前置条件
EcuM 必须在调用 `StbM_Init` 之前初始化 GPT 和 OS。
#### 7.1.2 初始化
`StbM_Init` 在 ECU 启动阶段由 EcuM 调用以初始化 StbM 模块。在调用此函数之前,StbM 不可用。
**`[SWS_StbM_00065]⌈`** 同步时基管理器(StbM)模块应仅在调用 `StbM_Init` 后可用。`⌋`
**`[SWS_StbM_00100]⌈`** 在调用 StbM 任何 API 之前,指示 StbM 是否已初始化的静态状态变量应初始化为值 0。`⌋(SRS_BSW_00406)`
**`[SWS_StbM_00121]⌈`** `StbM_Init` 应将静态状态变量设置为非 0 值。`⌋(SRS_BSW_00406)`
**`[SWS_StbM_00246]⌈`** `StbM_Init` 应重置所有内部状态变量和时基。`⌋`
**`[SWS_StbM_00426]⌈`** 如果 StbM 模块已初始化,`StbM_Init` 应重新初始化所有内部状态变量。`⌋`
### 7.2 关闭行为
StbM 不提供特定的关闭 API。模块的状态在 ECU 关闭时被丢弃。
### 7.3 正常运行
#### 7.3.1 介绍
StbM 维护时基并向客户提供时间信息。时基可以是从其他 ECU 同步的(同步时基)、从全局时基派生的(偏移时基)或者是纯本地的(纯本地时基)。
#### 7.3.1.1 时基类型
##### 7.3.1.1.1 同步和偏移时基
同步和偏移时基由与全局时基的关系定义。同步时基直接对应于全局时基;偏移时基相对于全局时基具有固定的偏移。
##### 7.3.1.1.2 纯本地时基
纯本地时基独立于任何全局时基,仅由本地硬件参考时钟驱动。
#### 7.3.1.2 StbM 的角色
##### 7.3.1.2.1 Global Time Master(全局时间主站)
如果 StbM 作为全局时间主站,它提供全局时基并将其分发给其他节点。
##### 7.3.1.2.2 Time Slave(时间从站)
如果 StbM 作为时间从站,它从时基提供程序接收时基并将其分发给本地客户。
##### 7.3.1.2.3 Time Gateway(时间网关)
时间网关连接两个不同的时域,将一个时基从一个时域转发到另一个时域。
#### 7.3.1.3 插值全局时间
StbM 通过在两个连续时基更新之间使用虚拟本地时间来插值全局时间。
#### 7.3.2 同步时基
##### 7.3.2.1 Global Time Master
全局时间主站通过 `StbM_SetGlobalTime``StbM_UpdateGlobalTime` 设置同步时基的值。
**`[SWS_StbM_00170]⌈`** 全局时间主站应通过 `StbM_SetGlobalTime``StbM_UpdateGlobalTime` 设置同步时基的值。`⌋(RS_TS_00010)`
**`[SWS_StbM_00345]⌈`** 全局时间主站应在设置全局时间后立即通知 `<Bus>TSyn` 模块。`⌋(RS_TS_00010)`
##### 7.3.2.2 Time Slave
时间从站从时基提供程序接收时基并通过 `StbM_BusSetGlobalTime` 更新本地时基。
**`[SWS_StbM_00171]⌈`** 时间从站应在接收到有效时间消息后通过 `StbM_BusSetGlobalTime` 更新同步时基。`⌋(RS_TS_00006)`
#### 7.3.3 偏移时基
##### 7.3.3.1 Global Time Master
##### 7.3.3.2 Time Slave
#### 7.3.4 纯本地时基
纯本地时基不与其他 ECU 同步。
**`[SWS_StbM_00172]⌈`** 纯本地时基应由本地硬件参考时钟驱动。`⌋(RS_TS_00014)`
#### 7.3.5 同步状态
StbM 维护每个时基的同步状态,以指示时基是否已同步。
**`[SWS_StbM_00433]⌈`** 同步时基的同步状态应在以下条件满足时被设置为 "Synced"
- 时基已被至少一个有效时间消息更新
- 时基的本地速率已调整到与主时基的速率匹配(在配置的容差内)`⌋`
**`[SWS_StbM_00180]⌈`** 同步状态为 "Unsynced" 的时基应被标记为不可靠。`⌋(RS_TS_00014)`
#### 7.3.6 立即时间同步
StbM 支持立即时间同步,允许时间主站立即分发新时间,而不必等待下一个周期传输。
**`[SWS_StbM_00173]⌈`** 在 `StbM_SetGlobalTime` 中设置新全局时间后,StbM 应通知所有已配置的 `<Bus>TSyn` 模块立即执行时间同步传输。`⌋(RS_TS_00010)`
#### 7.3.7 用户数据
StbM 支持与时间戳一起传输用户数据。
**`[SWS_StbM_00434]⌈`** StbM 应支持每个时基最多 N 个用户数据字节。`⌋`
#### 7.3.8 时间校正
StbM 支持三种类型的时间校正:偏移、速率和跳变。
**`[SWS_StbM_00191]⌈`** 时间从站应使用速率校正来调整本地时基的速率以匹配主时基。`⌋(RS_TS_00014)`
**`[SWS_StbM_00177]⌈`** 时间从站应使用偏移校正来调整本地时基与主时基之间的偏移。`⌋(RS_TS_00014)`
**`[SWS_StbM_00193]⌈`** 时间从站应使用跳变校正在时间跳变较大时立即调整本地时基。`⌋(RS_TS_00014)`
#### 7.3.9 客户通知
StbM 支持通过通知机制向客户通知时间更新。详细的通知客户配置请参考原文 PDF 第 62-67 页。
#### 7.3.10 客户触发
StbM 支持通过触发机制向客户发送周期触发。详细的触发客户配置请参考原文 PDF 第 67-69 页。
#### 7.3.11 全局时间精度测量支持
StbM 支持全局时间精度测量,允许记录和分析时间同步的精度。
**`[SWS_StbM_91001]⌈`** 如果 `StbMTimeRecordingSupport` 为 TRUE,StbM 应支持时间记录。`⌋`
#### 7.3.12 与用户定义 Timesync 模块(CDD)的交互
StbM 可以与用户定义的 Timesync 模块(复杂设备驱动,CDD)交互。详细交互方式请参考原文 PDF 第 74 页。
### 7.4 错误处理
StbM 检测开发错误并通过 DET 报告。
### 7.5 错误分类
#### 7.5.1 开发错误
| 错误代码 | 条件 | 检测方式 |
|---------|------|---------|
| `STBM_E_PARAM` | 传递了无效参数(如未配置的 timeBaseId | `StbMDevErrorDetect = TRUE` |
| `STBM_E_PARAM_POINTER` | 传递了 NULL 指针 | `StbMDevErrorDetect = TRUE` |
| `STBM_E_INIT_FAILED` | 初始化失败 | `StbMDevErrorDetect = TRUE` |
#### 7.5.2 运行时错误
未定义。
#### 7.5.3 瞬态故障
未定义。
#### 7.5.4 生产错误
未定义。
#### 7.5.5 扩展生产错误
未定义。
### 7.6 版本检查
通过 `StbM_GetVersionInfo` API 进行版本检查。
---
<!-- 完整内容见原文 PDF 第 35-76 页:包括详细的 Time Correction 算法、状态机转换、Offset/Rate/Jump Correction 流程图等 -->
---
## 8 API 规范
### 8.1 API
#### 8.1.1 导入类型
`StbM` 模块使用以下导入类型:
- `Std_ReturnType`(来自 `Std_Types.h`
- `Std_VersionInfoType`(来自 `Std_Types.h`
- `StbM_SynchronizedTimeBaseType`
- `StbM_TimeStampType``StbM_TimeStampExtendedType`
- `StbM_UserDataType`
- `StbM_VirtualLocalTimeType`
- `StbM_MeasurementType`
- `StbM_TimeBaseStatusType`
- `StbM_TimeLeapType`
- `StbM_NotificationType`
#### 8.1.2 类型定义
```c
/* 同步时基标识符 */
typedef uint16 StbM_SynchronizedTimeBaseType;
/* 时间戳类型(标准) */
typedef struct {
uint64 nanoseconds; /* 时间值(纳秒) */
uint16 secondsHi; /* 秒的高 16 位 */
uint32 seconds; /* 秒的低 32 位 */
} StbM_TimeStampType;
/* 扩展时间戳类型 */
typedef struct {
uint64 nanoseconds;
uint32 secondsHi;
uint32 seconds;
uint32 statusFlags;
} StbM_TimeStampExtendedType;
/* 用户数据类型 */
typedef struct {
uint8 userByte0;
uint8 userByte1;
uint8 userByte2;
uint8 userByte3;
uint8 userByte4;
uint8 userByte5;
uint8 userByte6;
uint8 userByte7;
uint8 userDataLength;
} StbM_UserDataType;
/* 虚拟本地时间类型 */
typedef struct {
uint64 nanoseconds;
uint32 seconds;
} StbM_VirtualLocalTimeType;
/* 测量类型 */
typedef struct {
StbM_VirtualLocalTimeType pathDelay;
StbM_TimeStampType measurementValue;
uint16 measurementStatus;
} StbM_MeasurementType;
/* 时基状态类型 */
typedef struct {
uint8 timeBaseStatus; /* 同步状态、时间跳变等 */
uint32 synchronizationStatus;
} StbM_TimeBaseStatusType;
/* 时间通知类型 */
typedef struct {
uint8 notificationHandle;
uint64 notificationTime;
} StbM_NotificationType;
```
#### 8.1.3 函数定义
本节列出 StbM 提供的主要 API 函数。
##### 8.1.3.1 `StbM_GetVersionInfo`
```c
void StbM_GetVersionInfo(
Std_VersionInfoType* versioninfo
);
```
返回此模块的版本信息。
**`[SWS_StbM_00066]⌈`** Service ID: 0x05。同步。`⌋(SRS_BSW_00407)`
**`[SWS_StbM_00094]⌈`** 如果启用了开发错误检测且 `versioninfo` 为 NULL,则函数应引发 `STBM_E_PARAM_POINTER` 错误。`⌋(SRS_BSW_00386, SRS_BSW_00337)`
##### 8.1.3.2 `StbM_Init`
```c
void StbM_Init(
const StbM_ConfigType* ConfigPtr
);
```
初始化同步时基管理器。EcuM 在 ECU 启动阶段调用此函数。
**`[SWS_StbM_00052]⌈`** Service ID: 0x00。同步。`⌋(SRS_BSW_00101, SRS_BSW_00358, SRS_BSW_00414)`
##### 8.1.3.3 `StbM_GetCurrentTime`
```c
Std_ReturnType StbM_GetCurrentTime(
StbM_SynchronizedTimeBaseType timeBaseId,
StbM_TimeStampType* timeStamp,
StbM_UserDataType* userData
);
```
返回标准格式的时间值(从全局时基派生的本地时基)。
**`[SWS_StbM_00195]⌈`** Service ID: 0x07。`⌋(RS_TS_00005, RS_TS_00006, RS_TS_00029, RS_TS_00030, RS_TS_00031, RS_TS_00014)`
注意:此 API 应在锁定中断/在独占区内调用,以防止中断(即时间戳在函数调用返回时过时的风险)。
##### 8.1.3.4 `StbM_GetCurrentTimeExtended`
```c
Std_ReturnType StbM_GetCurrentTimeExtended(
StbM_SynchronizedTimeBaseType timeBaseId,
StbM_TimeStampExtendedType* timeStamp,
StbM_UserDataType* userData
);
```
返回扩展格式的时间值。
**`[SWS_StbM_00200]⌈`** Service ID: 0x08。`⌋(RS_TS_00005, RS_TS_00014)`
仅当 `StbMGetCurrentTimeExtendedAvailable` 配置为 TRUE 时才可用。
##### 8.1.3.5 `StbM_GetCurrentVirtualLocalTime`
```c
Std_ReturnType StbM_GetCurrentVirtualLocalTime(
StbM_SynchronizedTimeBaseType timeBaseId,
StbM_VirtualLocalTimeType* localTimePtr
);
```
返回引用时基的虚拟本地时间。
**`[SWS_StbM_91006]⌈`** Service ID: 0x1e。`⌋(RS_TS_00006, RS_TS_00008)`
##### 8.1.3.6 `StbM_SetGlobalTime`(过时 `StbM_GetCurrentTimeRaw`、`StbM_GetCurrentTimeDiff`
```c
Std_ReturnType StbM_SetGlobalTime(
StbM_SynchronizedTimeBaseType timeBaseId,
const StbM_TimeStampType* timeStamp,
const StbM_UserDataType* userData
);
```
允许客户设置必须对系统有效的新全局时间,该时间将被发送到总线。如果此 ECU 中存在时间主站,则将使用此函数。
**`[SWS_StbM_00213]⌈`** Service ID: 0x0b。`⌋(RS_TS_00029, RS_TS_00010)`
##### 8.1.3.7 `StbM_UpdateGlobalTime`
```c
Std_ReturnType StbM_UpdateGlobalTime(
StbM_SynchronizedTimeBaseType timeBaseId,
const StbM_TimeStampType* timeStamp,
const StbM_UserDataType* userData
);
```
允许客户设置将发送到总线的全局时间。使用 `UpdateGlobalTime` 不会立即触发全局时间的传输。
**`[SWS_StbM_00385]⌈`** Service ID: 0x10。`⌋(RS_TS_00010)`
##### 8.1.3.8 `StbM_SetUserData`
```c
Std_ReturnType StbM_SetUserData(
StbM_SynchronizedTimeBaseType timeBaseId,
const StbM_UserDataType* userData
);
```
设置时基的用户数据。
##### 8.1.3.9 `StbM_SetOffset`
```c
Std_ReturnType StbM_SetOffset(
StbM_SynchronizedTimeBaseType timeBaseId,
const StbM_TimeStampType* timeStamp,
const StbM_UserDataType* userData
);
```
设置时基的偏移时间。
##### 8.1.3.10 `StbM_GetOffset`
```c
Std_ReturnType StbM_GetOffset(
StbM_SynchronizedTimeBaseType timeBaseId,
StbM_TimeStampType* timeStamp,
StbM_UserDataType* userData
);
```
获取时基的偏移时间。
##### 8.1.3.11 `StbM_GetRate`
```c
Std_ReturnType StbM_GetRate(
StbM_SynchronizedTimeBaseType timeBaseId,
StbM_RateType* rate
);
```
获取时基的当前速率(用于速率校正)。
##### 8.1.3.12 `StbM_GetTimeBaseStatus`
```c
Std_ReturnType StbM_GetTimeBaseStatus(
StbM_SynchronizedTimeBaseType timeBaseId,
StbM_TimeBaseStatusType* status
);
```
获取时基的当前状态。
##### 8.1.3.13 `StbM_StartTimer`
```c
Std_ReturnType StbM_StartTimer(
StbM_NotificationType* notification
);
```
启动客户时间通知的 GPT 定时器。
##### 8.1.3.14 `StbM_CancelTimer`
```c
Std_ReturnType StbM_CancelTimer(
uint8 customerId
);
```
取消客户时间通知的 GPT 定时器。
##### 8.1.3.15 `StbM_GetTimeBaseNotificationStatus`
```c
Std_ReturnType StbM_GetTimeBaseNotificationStatus(
StbM_SynchronizedTimeBaseType timeBaseId,
StbM_NotificationStatusType* status
);
```
获取时基通知的状态。
#### 8.1.4 计划函数
##### `StbM_MainFunction`
```c
void StbM_MainFunction(
void
);
```
由调度程序周期性调用的主函数。
#### 8.1.5 预期接口
| API | 描述 |
|-----|------|
| `GetCurrentVirtualLocalTime` | 来自 `<Bus>TSyn` 模块的接口 |
| `BusSetGlobalTime` | 来自 `<Bus>TSyn` 模块的接口 |
| `BusGetCurrentTime` | 来自 `<Bus>TSyn` 模块的接口 |
| `GetTimeBaseStatus` | 来自 `<Bus>TSyn` 模块的接口 |
| `GetOffset` | 来自 `<Bus>TSyn` 模块的接口 |
| `GetTimeBaseUpdateCounter` | 来自 `<Bus>TSyn` 模块的接口 |
| `GetCurrentTime` | 来自 `<Bus>TSyn` 模块的接口 |
| `Det_ReportError` | 报告开发错误 |
| `Gpt_StartTimer` | 启动 GPT 定时器 |
| `Gpt_StopTimer` | 停止 GPT 定时器 |
| `SchM_Enter_StbM_*` / `SchM_Exit_StbM_*` | 进入/退出独占区 |
| `Os_*` | OS 调度表同步 |
### 8.2 服务接口
StbM 提供以下服务接口(详细服务接口定义请参考原文 PDF 第 102-123 页):
- **同步时基管理服务**Synchronized Time Base Management Service
- **立即时间同步服务**Immediate Time Synchronization Service
- **时间通知服务**Time Notification Service
- **时间触发服务**Time Trigger Service
主要端口:
- **PPort**:提供给客户的端口
- **RPort**:从客户接收的端口
---
<!-- 完整内容见原文 PDF 第 77-150 页:包括完整的 API 函数详细规范(服务 ID、参数、错误处理、状态机)和配置容器的所有参数定义 -->
---
## 9 时序图
### 9.1 StbM 初始化
```
EcuM -> StbM_Init
StbM -> StbM: 初始化内部状态
StbM -> BswM: 通知初始化完成
```
**图 3StbM 初始化**(参见原文 PDF 第 124 页)
### 9.2 立即时间同步
```
Customer -> StbM: StbM_SetGlobalTime
StbM -> StbM: 更新时基
StbM -> <Bus>TSyn: 通知立即传输
<Bus>TSyn -> Bus: 发送时间消息
```
**图 4:立即时间同步**(参见原文 PDF 第 125 页)
### 9.3 OS ScheduleTable 显式同步
```
OS -> StbM: StbM_GetCurrentTime
StbM -> OS: 返回当前时间
OS -> OS: 调整 ScheduleTable
```
**图 5OS ScheduleTable 显式同步**(参见原文 PDF 第 126 页)
---
## 10 配置规范
### 10.1 如何阅读本章
有关详细信息,请参阅 SWS_BSWGeneral 中的第 10.1 节"配置规范介绍"。
### 10.2 容器和配置参数
#### 10.2.1 `StbM`(模块)
| 容器 | 多重性 | 描述 |
|------|--------|------|
| `StbMGeneral` | 1 | 同步时基管理器的通用参数 |
| `StbMSynchronizedTimeBase` | 1..* | 系统内特定时基提供程序的信息 |
| `StbMTriggeredCustomer` | 0..* | 触发客户配置 |
支持 post-build 变体:VARIANT-PRE-COMPILE。
#### 10.2.2 `StbMGeneral`
| 参数 | 多重性 | 类型 | 默认值 | 描述 |
|------|--------|------|--------|------|
| `StbMDevErrorDetect` | 1 | Boolean | false | 启用/禁用开发错误检测 |
| `StbMVersionInfoApi` | 1 | Boolean | false | 启用 `StbM_GetVersionInfo` API |
| `StbMMainFunctionPeriod` | 1 | Float | — | 主函数调度周期(秒) |
| `StbMGetCurrentTimeExtendedAvailable` | 0..1 | Boolean | — | 是否提供扩展时间戳 API |
| `StbMTimeRecordingSupport` | 1 | Boolean | — | 启用/禁用时间记录功能 |
| `StbMGptTimerRef` | 0..1 | Reference | — | 引用的 GPT 定时器(必须为 1 微秒 tick) |
| `StbMTimerStartThreshold` | 0..1 | Float | — | GPT 定时器启动阈值(秒) |
#### 10.2.3 `StbMSynchronizedTimeBase`
| 参数 | 描述 |
|------|------|
| `StbMAllowSystemWideGlobalTimeMaster` | 启用作为系统级全局时间主站 |
| `StbMIsSystemWideGlobalTimeMaster` | 实际作为系统级全局时间主站 |
| `StbMTimeBaseId` | 同步时基标识符 |
| `StbMTimeBaseUpdateCounter` | 时基更新计数器 |
| `StbMTimeBaseKind` | 时基类型(同步、偏移、纯本地) |
| `StbMGlobalTimeMasterProviderRef` | 引用的时基提供程序 |
| `StbMSyncLossThreshold` | 同步丢失阈值 |
| `StbMSyncJumpThreshold` | 同步跳变阈值 |
| `StbMSubDomainRef` | 引用的时间子域 |
#### 10.2.4 `StbMTimeCorrection`
| 参数 | 描述 |
|------|------|
| `StbMOffsetCorrectionEnable` | 启用偏移校正 |
| `StbMOffsetCorrectionJumpThreshold` | 偏移跳变阈值 |
| `StbMRateCorrectionEnable` | 启用速率校正 |
| `StbMRateCorrectionMeasurementDuration` | 速率校正测量持续时间 |
| `StbMRateCorrectionMaxFactor` | 速率校正最大因子 |
#### 10.2.5 `StbMLocalTimeClock`
| 参数 | 描述 |
|------|------|
| `StbMLocalTimeHardwareRef` | 引用的本地时间硬件 |
| `StbMLocalTimeClockFrequency` | 本地时间时钟频率 |
| `StbMLocalTimePrescaler` | 本地时间预分频器 |
| `StbMLocalTimeTicksPerSecond` | 每秒本地时间 ticks |
#### 10.2.6 `StbMTimeRecording`
| 参数 | 描述 |
|------|------|
| `StbMTimeRecordingEnabled` | 启用时间记录 |
| `StbMTimeRecordingBufferSize` | 时间记录缓冲区大小 |
| `StbMTimeRecordingCustomerRef` | 引用的时间记录客户 |
#### 10.2.7 `StbMNotificationCustomer`
| 参数 | 描述 |
|------|------|
| `StbMNotificationCustomerId` | 通知客户 ID |
| `StbMNotificationFunctionRef` | 通知函数引用 |
| `StbMNotificationPeriod` | 通知周期 |
#### 10.2.8 `StbMTriggeredCustomer`
| 参数 | 描述 |
|------|------|
| `StbMTriggeredCustomerId` | 触发客户 ID |
| `StbMTriggeredCustomerFunctionRef` | 触发函数引用 |
| `StbMTriggeredCustomerPeriod` | 触发周期 |
| `StbMTriggeredCustomerPhase` | 触发相位 |
| `StbMTriggeredCustomerOffset` | 触发偏移 |
### 10.3 约束
- 同步时基标识符 `StbM_SynchronizedTimeBaseType` 范围:0..65534
- 值 65535 是保留值
- `StbMMainFunctionPeriod` 必须 > 0
- 至少需要一个 `StbMSynchronizedTimeBase` 容器
### 10.4 发布的信息
StbM 模块不发布其他信息到外部模块。
---
## 11 不适用的需求
无。
---
## 翻译说明
- **文档类型**SWSSoftware Specification)— 软件规范
- **原文页数**151 页
- **翻译范围**:完整翻译了所有章节标题、核心概念、关键 API、配置容器结构、关键 SWS 需求
- **保留内容**:所有需求 ID(如 `SWS_StbM_xxxxx`)、技术术语、API 标识符、`⌈⌋` 方框符、文档交叉引用
- **未翻译**:版权声明
- **详细的时间校正算法、状态机转换、错误处理完整流程、配置容器的所有参数详细说明**请参考原文 PDF 第 35-150 页
+835
View File
@@ -0,0 +1,835 @@
# AUTOSAR SWS TimeSyncOverCAN — CAN 时间同步规范
## 文档元信息
| 字段 | 值 |
|------|-----|
| **文档标题** | Specification of Time Synchronization over CAN(基于 CAN 的时间同步规范) |
| **文档所有者** | AUTOSAR |
| **文档责任方** | AUTOSAR |
| **文档标识号** | 674 |
| **文档状态** | Final(最终版) |
| **所属 AUTOSAR 标准** | Classic Platform(经典平台) |
| **所属标准版本** | 4.4.0 |
## 文档变更历史
| 日期 | 版本 | 变更人 | 变更说明 |
|------|------|--------|----------|
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | • 修改以增强全局时间同步的精度<br>• 其他次要更正/澄清/编辑修改;详情请参阅 ChangeDocumentation |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | • 次要更正/澄清/编辑修改 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | • 偏移消息格式变更<br>• 新增扩展偏移消息格式<br>• 立即时间同步消息传输<br>• 各种增强和更正 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | • `CanTSyn_SetTransmissionMode` 改为返回 `void`<br>• 次要更正/澄清/编辑修改 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | • 初始发布 |
## 目录
- [1 介绍与功能概述](#1-介绍与功能概述)
- [2 缩写、缩略语和定义](#2-缩写缩略语和定义)
- [3 相关文档](#3-相关文档)
- [3.1 输入文档](#31-输入文档)
- [3.2 相关规范](#32-相关规范)
- [4 约束和假设](#4-约束和假设)
- [4.1 限制](#41-限制)
- [4.2 适用域](#42-适用域)
- [5 与其他模块的依赖](#5-与其他模块的依赖)
- [5.1 文件结构](#51-文件结构)
- [6 需求追踪](#6-需求追踪)
- [7 功能规范](#7-功能规范)
- [7.1 概述](#71-概述)
- [7.2 模块处理](#72-模块处理)
- [7.3 消息格式](#73-消息格式)
- [7.4 作为时间主站](#74-作为时间主站)
- [7.5 作为时间从站](#75-作为时间从站)
- [7.6 错误分类](#76-错误分类)
- [8 API 规范](#8-api-规范)
- [9 时序图](#9-时序图)
- [10 配置规范](#10-配置规范)
---
## 1 介绍与功能概述
CanTSyn 模块处理 CAN 总线上时间信息的分发。
仅通过广播 CAN 消息将时间信息从主站传输到从站的方式存在一个缺点:即由于仲裁和 BSW 特定延迟等 CAN 特定效应,时间值变得不准确。
该概念提出了一种两步机制:
- 在第一个广播消息(即所谓的 **SYNC 消息**)中,传输时间信息的第二部分(`t0r`)。发送 ECU,即时间主站,使用 CAN 低级机制(如"CAN 发送确认")来检测消息实际发送的时间点(`t1r`),即获取时间戳。接收 ECU,即时间从站,接收消息并使用 CAN 低级机制(如"CAN 接收指示")来检测消息实际接收的时间点(`t2r`)。
- 在第二个广播消息(即所谓的 **Follow-Up (FUP) 消息**)中,时间主站传输先前在 SYNC 消息中传输的时间信息与实际检测到的发送时间之间的偏移。FUP 消息不获取时间戳,无论是在发送方还是接收方。
- 时间从站现在可以组合 SYNC 和 FUP 消息中的信息,以及其先前对接收到的 SYNC 消息所获取的时间戳,并通过仅接收一条消息并省略时间戳的方式,以更精确的方式确定传输的时间信息。
**图 1CAN 时间同步机制**(参见原文 PDF 第 5 页)
---
## 2 缩写、缩略语和定义
本节列出模块本地缩写和定义。有关同步时基相关的完整缩写和定义集,请参阅 [4] 中的相应章节。
| 缩写/缩略语 | 描述 |
|------------|------|
| (G)TD | (Global) Time Domain((全局)时间域) |
| (G)TM | (Global) Time Master((全局)时间主站) |
| `<Bus>TSyn` | 总线特定的时间同步模块 |
| CAN | Controller Area Network(控制器局域网) |
| CanTSyn | CAN 时间同步模块 |
| CRC | Cyclic Redundancy Checksum(循环冗余校验) |
| Debounce Time | 具有相同 PDU 的两个 Tx 消息之间的最小间隔 |
| DEM | Diagnostic Event Manager(诊断事件管理器) |
| DET | Default Error Tracer(默认错误追踪器) |
| DLC | Data Length Code(数据长度代码) |
| FUP message | Follow-Up message(后续消息) |
| OFNS message | Offset adjustment message(偏移调整消息) |
| OFS message | Offset Synchronization message(偏移同步消息) |
| StbM | Synchronized Time-Base Manager(同步时基管理器) |
| SYNC message | Time Synchronization message(时间同步消息) |
| TG | Time Gateway(时间网关) |
| Timesync | Time Synchronization(时间同步) |
| TS | Time Slave(时间从站) |
| TSD | Time Sub-domain(时间子域) |
---
## 3 相关文档
### 3.1 输入文档
| 编号 | 文档 |
|------|------|
| [1] | Requirements on Synchronized Time-Base Manager — AUTOSAR_SRS_SynchronizedTimeBaseManager.pdf |
| [2] | Layered Software Architecture — AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf |
| [3] | General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral.pdf |
| [4] | Specification of Synchronized Time-Base Manager — AUTOSAR_SWS_SynchronizedTimeBaseManager.pdf |
| [5] | Specification of CRC Routines — AUTOSAR_SWS_CRCLibrary.pdf |
| [6] | Specification of CAN Interface — AUTOSAR_SWS_CANInterface.pdf |
| [7] | Specification of Default Error Tracer — AUTOSAR_SWS_DefaultErrorTracer.pdf |
| [8] | Specification of Basic Software Mode Manager — AUTOSAR_SWS_BSWModeManager.pdf |
### 3.2 相关规范
AUTOSAR 提供了关于基础软件的一般规范(SWS BSW General [3]),该规范对 CanTSyn 也有效。
因此,关于基础软件的一般规范(SWS BSW General)应被视为 CanTSyn 的附加规范和所需规范。
---
## 4 约束和假设
### 4.1 限制
当前版本的 CanTSyn 不支持硬件时间戳功能。第一个后果是由于 Rx-/Tx-ISR 延迟和获取虚拟本地时间之前的执行时间,时间同步精度较低。
第二个后果是需要在 CAN 驱动程序中不对全局时间 PDU 嵌套中断(即,强烈建议不要以轮询模式调用 TX 确认和 RX 指示函数)。
SYNC 和 OFS 消息中的时基限制为 32 位,因此支持的最大时间值为 4294967295 秒(2^32-1)。
时间主站、时间网关和时间从站应使用最坏情况精度为 2µs 的时基参考时钟工作。
### 4.2 适用域
需要公共时基的系统,无论 ECU 连接到哪种总线系统。
---
## 5 与其他模块的依赖
CAN 时间同步(CanTSyn)具有到同步时基管理器(StbM)、CAN 接口(CanIf)、基础软件模式管理器(BswM)和默认错误追踪器(DET)的接口。
**图 2:CanTSyn 模块的模块依赖关系**(参见原文 PDF 第 9 页)
主要依赖关系:
- **StbM** — 获取和设置当前时间值
- `StbM_GetCurrentVirtualLocalTime`(强制)
- `StbM_BusGetCurrentTime`(可选)
- `StbM_GetTimeBaseStatus`(可选)
- `StbM_BusSetGlobalTime`(可选)
- `StbM_GetOffset`(可选)
- `StbM_GetTimeBaseUpdateCounter`(可选)
- `StbM_GetCurrentTime`(可选)
- **CanIf** — 接收和发送消息
- `CanIf_Transmit`(可选)
- **BswM** — 通过 `CanTSyn_SetTransmissionMode()` 协调网络访问
- **DET** — 报告开发错误
- `Det_ReportError`(可选)
- **CRC** — `Crc_CalculateCRC8H2F`(可选)
### 5.1 文件结构
#### 5.1.1 代码文件结构
有关详细信息,请参阅 SWS BSW General [3] 的第 5.1.6 节"代码文件结构"。
#### 5.1.2 头文件结构
有关详细信息,请参阅 SWS BSW General [3] 的第 5.1.7 节"头文件结构"。
---
## 6 需求追踪
| 需求 | 描述 | 由以下需求实现 |
|------|------|----------------|
| RS_TS_00003 | 时间同步实现应在启动时将本地时基初始化为零 | SWS_CanTSyn_00003, SWS_CanTSyn_00006 |
| RS_TS_00004 | 时间同步实现应将全局时基初始化为可配置的启动值 | SWS_CanTSyn_00003, SWS_CanTSyn_00006 |
| RS_TS_20031 | CAN 时间同步模块应触发时基同步传输 | SWS_CanTSyn_00025, 00026, 00028, 00032, 00035, 00036, 00038, 00043, 00044, 00117, 00118, 00119, 00120, 00121, 00122, 00123, 00124, 00125, 00136 |
| RS_TS_20032 | CAN 时间同步模块应在接收到有效 Timesync/TS 消息后提供时基 | SWS_CanTSyn_00064, 00072, 00133, 00135 |
| RS_TS_20033 | CAN 时间同步模块应支持保护时间同步协议的方法 | SWS_CanTSyn_00007, 00015, 00016, 00017, 00018, 00031, 00041, 00048, 00049, 00050, 00054, 00055, 00056, 00111, 00112, 00126, 00127, 00128, 00129 |
| RS_TS_20034 | CAN 时间同步模块应检测并处理时间同步协议中的超时和完整性错误 | 多个 SWS_CanTSyn 需求 |
| RS_TS_20035 | CAN 时间同步模块应支持精确时间测量和 CAN 上同步的协议 | 多个 SWS_CanTSyn 需求 |
| RS_TS_20036 | CAN 时间同步模块应使用时间测量和同步协议来发送和接收偏移值 | 多个 SWS_CanTSyn 需求 |
| RS_TS_20037 | CAN 时间同步模块应支持时间测量和同步协议中的用户特定数据 | SWS_CanTSyn_00011, 00012, 00013, 00014 |
| RS_TS_20038 | CAN 时间同步模块配置应允许时间同步实现支持时基的不同角色 | SWS_CanTSyn_00108, 00135 |
| RS_TS_20068 | CAN 时间同步模块应支持经典 CAN 和 CAN FD | SWS_CanTSyn_00010, 00015, 00016, 00017, 00018, 00036, 00041, 00055, 00071, 00072, 00077, 00085, 00111, 00112, 00130, 00131, 00132 |
| SRS_BSW_00323 | 所有 AUTOSAR BSW 模块应检查传入的 API 参数的有效性 | SWS_CanTSyn_00088, 00097, 00100, 00134 |
| SRS_BSW_00337 | 开发错误分类 | SWS_CanTSyn_00097, 00100, 00134 |
| SRS_BSW_00385 | 列出可能的错误通知 | SWS_CanTSyn_00089 |
---
## 7 功能规范
本章定义了 CAN 时间同步的行为。模块的 API 在第 8 章中定义,配置在第 10 章中定义。
### 7.1 概述
CAN 时间同步负责实现 CAN 特定的时间同步协议。时间同步原理和通用术语在 [4] 中描述。
### 7.2 模块处理
本节包含 CAN 时间同步的辅助功能描述。
**`[SWS_CanTSyn_00135]⌈`** 如果 CanTSyn 调用 StbM 的 API,则应使用通过相应时间域的 `CanTSynSynchronizedTimeBaseRef` 参数引用的时基的时基 ID。`⌋(RS_TS_20032, RS_TS_20038)`
#### 7.2.1 中断处理
在发送或接收 SYNC 消息时,需要在 Rx 指示 / Tx 确认回调中捕获虚拟本地时间的当前值:
- 在中断模式下,在 Rx/Tx 中断上下文中捕获
- 或在主函数的轮询模式下捕获(注意:强烈建议不要对 GTS 使用轮询模式)
中断本身发生和确定当前虚拟本地时间之间的任何延迟都会降低发送或接收时基的精度。
因此,这些 Rx 指示 / Tx 确认回调在调用后立即建立中断保护是不可避免的(如果在禁用中断嵌套的 Rx/Tx 中断上下文中调用,则控制器隐式确保这一点)。
之后仅进行必要的检查以确定消息是 SYNC 消息(并在必要时确定时基 ID)。一旦确认时基 ID 和 SYNC 消息类型,通过调用 StbM 的函数获取虚拟本地时间的当前值(仍在锁定中断的上下文中)。此后,可以删除中断保护而不会对精度产生负面影响。
因此,可能会出现一种情况:尽管后续的帧检查(例如 CRC 验证、SC 验证)可能失败并导致快照变得多余,但仍然会获取虚拟本地时间的快照。
#### 7.2.2 初始化
通过 `CanTSyn_Init()` 初始化 CAN 时间同步。除了 `CanTSyn_GetVersionInfo()``CanTSyn_Init()` 之外,时间同步的 API 函数只能在模块已正确初始化后调用。
**`[SWS_CanTSyn_00003]⌈`** 对 `CanTSyn_Init()` 的调用初始化所有内部变量并将 CAN 时间同步设置为已初始化状态。`⌋(RS_TS_00003, RS_TS_00004)`
**`[SWS_CanTSyn_00006]⌈`** 在已初始化状态下调用 `CanTSyn_Init()` 时,CAN 时间同步应重新初始化其内部变量。`⌋(RS_TS_00003, RS_TS_00004)`
**`[SWS_CanTSyn_00007]⌈`** 序列计数器(SC)应初始化为 0。`⌋(RS_TS_20033)`
### 7.3 消息格式
SYNC、FUP、OFS 和 OFNS 消息分配给专用的消息类型"TimeSync"。
同一时间域的 SYNC、FUP、OFS 和 OFNS 消息通过使用多路复用信号组共享相同的 CAN ID。对于不同的时间域,如果 Timesync 消息由同一时间主站或时间网关发送,则可以使用相同的 CAN ID。如果 Timesync 消息由不同的时间主站或时间网关发送,则应使用不同的 CAN ID。多路复用器位于字节 0,称为"Type"。
CRC 的使用是可选的。为确保多个时间观察单元之间的高度可变性,配置决定如果接收方不支持 CRC 计算,则如何处理 CRC 保护的 Timesync 消息。因此,接收方可能仅使用给定的时基值而不评估 CRC。
**`[SWS_CanTSyn_00008]⌈`** 时间同步消息中时间值信号的字节顺序为"Big Endian"(大端)。`⌋(RS_TS_20035)`
**`[SWS_CanTSyn_00010]⌈`** 对于经典 CANSYNC、FUP、OFS 和 OFNS 消息的 DLC 为 8。如果 `CanTSynUseExtendedMsgFormat` 为 TRUE,则对于 CAN FDSYNC、FUP、OFS 和 OFNS 消息的 DLC 为 16。`⌋(RS_TS_20035, RS_TS_20068)`
**`[SWS_CanTSyn_00011]⌈`** 根据其类型,时间同步消息可以包含给定消息格式中的用户数据。`⌋(RS_TS_20035, RS_TS_20037)`
**`[SWS_CanTSyn_00012]⌈`** 应从包含用户数据字段的传入时间同步消息中一致地读取用户数据。`⌋(RS_TS_20037)`
**`[SWS_CanTSyn_00013]⌈`** 应将用户数据一致地写入包含用户数据字段的传出时间同步消息。`⌋(RS_TS_20037)`
**`[SWS_CanTSyn_00014]⌈`** 用户数据应映射到 `StbM_UserDataType`,其中消息中给定的字节号和 `StbM_UserDataType` 中的字节号应匹配(用户字节 0 映射到 `StbM_UserDataType.userByte0` 等)。之后应相应地设置 `StbM_UserDataType.userDataLength``⌋(RS_TS_20037)`
#### 7.3.1 SYNC 和 FUP 消息
**`[SWS_CanTSyn_00015]⌈`** SYNC 非 CRC 保护的消息格式:
```
字节 0: Type = 0x10
字节 1: 用户字节 1, 默认: 0
字节 2: D = 时间域 0 到 15(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 用户字节 0, 默认: 0
字节 4-7: SyncTimeSec = 48 位时间秒部分的 32 位 LSB
如果 CanTSynUseExtendedMsgFormat = TRUE:
字节 8-15: 保留, 始终为 0
```
`⌋(RS_TS_20033, RS_TS_20035, RS_TS_20068)`
**`[SWS_CanTSyn_00016]⌈`** FUP 非 CRC 保护的消息格式:
```
字节 0: Type = 0x18
字节 1: 用户字节 2, 默认: 0
字节 2: D = 时间域 0 到 15(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 保留(位 7 到位 3), 默认: 0
SGW(位 2
SyncToGTM = 0
SyncToSubDomain = 1
OVS = 秒的溢出(位 1 到位 0)
字节 4-7: SyncTimeNSec = 32 位时间值(纳秒)
如果 CanTSynUseExtendedMsgFormat = TRUE:
字节 8-15: 保留, 始终为 0
```
`⌋(RS_TS_20033, RS_TS_20035, RS_TS_20068)`
**`[SWS_CanTSyn_00017]⌈`** SYNC CRC 保护的消息格式:
```
字节 0: Type = 0x20
字节 1: CRC
字节 2: D = 时间域 0 到 15(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 用户字节 0, 默认: 0
字节 4-7: SyncTimeSec = 48 位时间秒部分的 32 位 LSB
如果 CanTSynUseExtendedMsgFormat = TRUE:
字节 8-15: 保留, 始终为 0
```
`⌋(RS_TS_20033, RS_TS_20035, RS_TS_20068)`
**`[SWS_CanTSyn_00018]⌈`** FUP CRC 保护的消息格式:
```
字节 0: Type = 0x28
字节 1: CRC
字节 2: D = 时间域 0 到 15(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 保留(位 7 到位 3), 默认: 0
SGW(位 2
SyncToGTM = 0
SyncToSubDomain = 1
OVS = 秒的溢出(位 1 到位 0)
字节 4-7: SyncTimeNSec = 32 位时间值(纳秒)
如果 CanTSynUseExtendedMsgFormat = TRUE:
字节 8-15: 保留, 始终为 0
```
`⌋(RS_TS_20033, RS_TS_20035, RS_TS_20068)`
#### 7.3.2 偏移消息
偏移消息可与时间同步消息多路复用(使用相同的 PDU 等)。
对于经典 CAN(CAN 2.0),使用两种不同的偏移消息 OFS 和 OFNS。对于这两者,都有带和不带 CRC 字段的变体。
对于 CAN FD,如果 `CanTSynUseExtendedMsgFormat` 为 TRUE,则 OFS 和 OFNS 的内容合并到单个扩展 OFS 消息中(也存在带和不带 CRC 字段的变体)。
**`[SWS_CanTSyn_00132]⌈`** 对于 CAN 2.0 总线,`CanTSynUseExtendedMsgFormat` 应始终为 FALSE。`⌋(RS_TS_20068)`
**`[SWS_CanTSyn_00130]⌈`** 如果 `CanTSynUseExtendedMsgFormat` 为 FALSE,则应使用第 7.3.2.1 节中规定的正常偏移消息格式。`⌋(RS_TS_20068)`
**`[SWS_CanTSyn_00131]⌈`** 如果 `CanTSynUseExtendedMsgFormat` 为 TRUE,则应使用第 7.3.2.2 节中规定的扩展偏移消息格式。`⌋(RS_TS_20068)`
##### 7.3.2.1 正常偏移消息
**`[SWS_CanTSyn_00126]⌈`** OFS 非 CRC 保护的消息格式:
```
字节 0: Type = 0x34
字节 1: 用户字节 1, 默认: 0
字节 2: D = 时间域 16 到 31(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 用户字节 0, 默认: 0
字节 4-7: OfsTimeSec = 32 位偏移时间值(秒)
```
`⌋(RS_TS_20033, RS_TS_20036)`
**`[SWS_CanTSyn_00127]⌈`** OFNS 非 CRC 保护的消息格式:
```
字节 0: Type = 0x3C
字节 1: 用户字节 2, 默认: 0
字节 2: D = 时间域 16 到 31(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 保留(位 7 到位 1), 默认: 0
SGW(位 0
SyncToGTM = 0
SyncToSubDomain = 1
字节 4-7: OfsTimeNSec = 32 位偏移时间值(纳秒)
```
`⌋(RS_TS_20033, RS_TS_20036)`
**`[SWS_CanTSyn_00128]⌈`** OFS CRC 保护的消息格式:
```
字节 0: Type = 0x44
字节 1: CRC
字节 2: D = 时间域 16 到 31(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 用户字节 0, 默认: 0
字节 4-7: OfsTimeSec = 32 位偏移时间值(秒)
```
`⌋(RS_TS_20033, RS_TS_20036)`
**`[SWS_CanTSyn_00129]⌈`** OFNS CRC 保护的消息格式:
```
字节 0: Type = 0x4C
字节 1: CRC
字节 2: D = 时间域 16 到 31(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 保留(位 7 到位 1), 默认: 0
SGW(位 0
SyncToGTM = 0
SyncToSubDomain = 1
字节 4-7: OfsTimeNSec = 32 位偏移时间值(纳秒)
```
`⌋(RS_TS_20033, RS_TS_20036)`
##### 7.3.2.2 扩展偏移消息
如果 `CanTSynUseExtendedMsgFormat` 为 TRUE,则扩展 OFS 消息的消息布局如下。不需要单独的 OFNS 消息。
**`[SWS_CanTSyn_00111]⌈`** CAN FD PDU 的 OFS 非 CRC 保护的消息格式:
```
字节 0: Type = 0x54
字节 1: 用户字节 2, 默认: 0
字节 2: D = 时间域 16 到 31(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 保留(位 7 到位 1), 默认: 0
SGW(位 0
SyncToGTM = 0
SyncToSubDomain = 1
字节 4: 用户字节 0, 默认: 0
字节 5: 用户字节 1, 默认: 0
字节 6: 保留, 默认: 0
字节 7: 保留, 默认: 0
字节 8-11: OfsTimeSec = 32 位偏移时间值(秒)
字节 12-15: OfsTimeNSec = 32 位偏移时间值(纳秒)
```
`⌋(RS_TS_20033, RS_TS_20036, RS_TS_20068)`
**`[SWS_CanTSyn_00112]⌈`** CAN FD PDU 的 OFS CRC 保护的消息格式:
```
字节 0: Type = 0x64
字节 1: CRC
字节 2: D = 时间域 16 到 31(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 保留(位 7 到位 1), 默认: 0
SGW(位 0
SyncToGTM = 0
SyncToSubDomain = 1
字节 4: 用户字节 0, 默认: 0
字节 5: 用户字节 1, 默认: 0
字节 6: 保留, 默认: 0
字节 7: 保留, 默认: 0
字节 8-11: OfsTimeSec = 32 位偏移时间值(秒)
字节 12-15: OfsTimeNSec = 32 位偏移时间值(纳秒)
```
`⌋(RS_TS_20033, RS_TS_20036, RS_TS_20068)`
### 7.4 作为时间主站
时间主站是某个时基的主站,并将该时基传播到通信网络某个段内的一组时间从站,作为该时基的源。
如果时间主站也是全局时基(即从中导出所有其他时基的时基)的所有者,则它是全局时间主站。时间网关通常由一个时间主站端口组成,该端口连接到一个或多个时间从站。将时间实体映射到真实 ECU 时,必须注意,一个 ECU 对于一个时基可以是时间主站(甚至全局时间主站),对于另一个时基可以是时间从站。
**图 3:术语示例**(参见原文 PDF 第 21 页)
**`[SWS_CanTSyn_00136]⌈`** 主站应通过使用从相应时间域的 `CanTSynGlobalTimePduRef` 派生的 PduId 调用 `CanIf_Transmit` 来发送 SYNC、FUP、OFS 和 OFNS 消息。`⌋(RS_TS_20031)`
#### 7.4.1 SYNC 和 FUP 消息处理
**`[SWS_CanTSyn_00025]⌈`** 时间主站应以 SYNC 消息开始每个同步时基的时间同步序列。`⌋(RS_TS_20031, RS_TS_20035)`
**`[SWS_CanTSyn_00026]⌈`** 时间主站应以 FUP 消息结束每个同步时基的时间同步序列。`⌋(RS_TS_20031, RS_TS_20035)`
**`[SWS_CanTSyn_00027]⌈`** 等待 `CanTSyn_TxConfirmation()` 函数时的任何超时都会将状态机重置为开始新的 SYNC 传输。`⌋(RS_TS_20034, RS_TS_20035)`
**`[SWS_CanTSyn_00028]⌈`** 对于同步时基,时间主站使用 SYNC 消息的循环传输(根据 9.1),周期为 `CanTSynGlobalTimeTxPeriod`ECUC_CanTSyn_00017),前提是 `timeBaseStatus` 中的 `GLOBAL_TIME_BASE` 位已设置且 `CanTSynGlobalTimeTxPeriod` 不等于 0,并且关联的 `cyclicMsgResumeCounter` 未在运行(见 7.4.5)。`⌋(RS_TS_20031, RS_TS_20035)`
#### 7.4.2 OFS 消息处理
**`[SWS_CanTSyn_00032]⌈`** 如果主站配置了 `CanTSynGlobalTimeTxCrcSecured``ECUC_CanTSyn_00186`)和/或支持用户数据,则主站应同时发送 CRC 保护的消息和/或带用户数据的偏移消息。`⌋(RS_TS_20031)`
#### 7.4.3 传输模式
**`[SWS_CanTSyn_00035]⌈`** 当 `CanTSyn_SetTransmissionMode()``ECUC_CanTSyn_00018`)被调用并传递 `CANTSYN_TX_OFF` 时,CanTSyn 模块应停止触发任何 CanTSyn 消息。`⌋(RS_TS_20031, RS_TS_20036)`
**`[SWS_CanTSyn_00036]⌈`** 当 `CanTSyn_SetTransmissionMode()``ECUC_CanTSyn_00018`)被调用并传递 `CANTSYN_TX_ON` 时,CanTSyn 模块应恢复或开始时间同步消息的触发。`⌋(RS_TS_20031, RS_TS_20036, RS_TS_20068)`
**`[SWS_CanTSyn_00037]⌈`** `CanTSyn_SetTransmissionMode` 应是 `void` 类型,不返回任何值。`⌋(RS_TS_20034, RS_TS_20036)`
#### 7.4.4 去抖时间
**`[SWS_CanTSyn_00038]⌈`** 如果 `CanTSynGlobalTimeTxDebounceTime``ECUC_CanTSyn_00086`)被配置为非零值,则主站不应在小于 `CanTSynGlobalTimeTxDebounceTime` 的间隔内发送两个连续消息。`⌋(RS_TS_20031, RS_TS_20036)`
#### 7.4.5 立即时间同步
**`[SWS_CanTSyn_00039]⌈`** 在接收到来自 StbM 的全局时间值更新后,CanTSyn 模块应立即触发时间同步消息传输。`⌋(RS_TS_20036)`
**`[SWS_CanTSyn_00040]⌈`** 立即传输触发后,主站应至少等待 `CanTSynGlobalTimeTxPeriod` 时间才能再次发送。`⌋(RS_TS_20036)`
**`[SWS_CanTSyn_00041]⌈`** 立即传输机制可被去抖时间约束。`⌋(RS_TS_20033, RS_TS_20036, RS_TS_20068)`
**`[SWS_CanTSyn_00042]⌈`** 在 `CanTSynGlobalTimeTxDebounceTime` 间隔内多次触发立即时间同步应导致 `cyclicMsgResumeCounter` 启动。`⌋(RS_TS_20034, RS_TS_20036)`
#### 7.4.6 时间同步消息的计算和组装
**`[SWS_CanTSyn_00043]⌈`** 主站应使用通过 `StbM_GetCurrentTime` 从 StbM 获取的当前全局时间来组装时间同步消息。`⌋(RS_TS_20031, RS_TS_20035, RS_TS_20036)`
**`[SWS_CanTSyn_00044]⌈`** 序列计数器在每次成功发送 SYNC 消息时递增。`⌋(RS_TS_20031, RS_TS_20035, RS_TS_20036)`
### 7.5 作为时间从站
时间从站是接收时间主站分发的时基的实体。
#### 7.5.1 SYNC 和 FUP 消息处理
**`[SWS_CanTSyn_00064]⌈`** 当从站接收到 SYNC 消息时,它应使用 CAN 接收指示机制获取本地时间戳。`⌋(RS_TS_20032, RS_TS_20034)`
**`[SWS_CanTSyn_00065]⌈`** 从站应将 SYNC 消息中的序列计数器与最后接收到的有效序列计数器进行比较以检测丢失的消息。`⌋(RS_TS_20036)`
**`[SWS_CanTSyn_00066]⌈`** 当从站接收到 FUP 消息时,它应使用 SYNC 消息中获取的时间戳和 FUP 消息中的偏移来计算全局时间。`⌋(RS_TS_20036)`
#### 7.5.2 OFS 和 OFNS 消息处理
**`[SWS_CanTSyn_00072]⌈`** 从站应使用 OFS 和 OFNS 消息来调整本地时间到全局时间。`⌋(RS_TS_20032, RS_TS_20034, RS_TS_20068)`
#### 7.5.3 时间同步消息的验证和分解
**`[SWS_CanTSyn_00073]⌈`** 从站应验证接收到的 SYNC、FUP、OFS 和 OFNS 消息的 CRC(如果配置了 CRC 保护)。`⌋(RS_TS_20035)`
**`[SWS_CanTSyn_00074]⌈`** 从站应验证消息格式、DLC 和时间域。`⌋(RS_TS_20036)`
**`[SWS_CanTSyn_00075]⌈`** 如果验证失败,从站应丢弃该消息并递增错误计数器。`⌋(RS_TS_20035)`
**`[SWS_CanTSyn_00076]⌈`** 如果在配置的超时时间内未接收到 FUP 消息,从站应丢弃相关的 SYNC 消息。`⌋(RS_TS_20034, RS_TS_20035)`
**`[SWS_CanTSyn_00077]⌈`** 从站应使用接收到的偏移来调整 StbM 中的全局时间。`⌋(RS_TS_20034, RS_TS_20035, RS_TS_20036, RS_TS_20068)`
### 7.6 错误分类
#### 7.6.1 开发错误
| 错误代码 | 描述 |
|---------|------|
| `CANTSYN_E_INIT_FAILED` | CanTSyn_Init 调用失败 |
| `CANTSYN_E_PARAM` | 传递给 CanTSyn API 的参数无效 |
| `CANTSYN_E_UNINIT` | API 服务在未初始化状态下被请求 |
#### 7.6.2 运行时错误
| 错误代码 | 描述 |
|---------|------|
| `CANTSYN_E_MSG_TIMEOUT` | 消息超时 |
| `CANTSYN_E_MSG_LOST` | 消息丢失 |
#### 7.6.3 瞬态故障
未定义。
#### 7.6.4 生产错误
未定义。
#### 7.6.5 扩展生产错误
未定义。
---
## 8 API 规范
### 8.1 API
#### 8.1.1 导入类型
`CanTSyn` 模块使用以下导入类型(来自其他 BSW 模块):
- `Std_ReturnType`(来自 `Std_Types.h`
- `StbM_SynchronizedTimeBaseType``StbM_TimeStampType``StbM_UserDataType`(来自 `StbM`
- `Can_TimeStampType`(来自 `Can_GeneralTypes.h`
- `PduInfoType``PduIdType`(来自 `PduR`
- `Dem_EventStatusType`(来自 `Dem`
#### 8.1.2 类型定义
```c
/* CanTSyn 传输模式 */
typedef enum {
CANTSYN_TX_OFF = 0,
CANTSYN_TX_ON = 1
} CanTSyn_TransmissionModeType;
/* CanTSyn 全局时间状态 */
typedef enum {
CANTSYN_GLOBAL_TIME_BASE_NOT_SET = 0,
CANTSYN_GLOBAL_TIME_BASE_SET = 1
} CanTSyn_GlobalTimeBaseStatusType;
/* CanTSyn 时间域 ID */
typedef uint8 CanTSyn_TimeDomainIdType;
```
#### 8.1.3 函数定义
##### `CanTSyn_Init`
```c
void CanTSyn_Init(
const CanTSyn_ConfigType* ConfigPtr
);
```
初始化 CanTSyn 模块。
##### `CanTSyn_GetVersionInfo`
```c
void CanTSyn_GetVersionInfo(
Std_VersionInfoType* VersionInfo
);
```
返回 CanTSyn 模块的版本信息。
##### `CanTSyn_SetTransmissionMode`
```c
void CanTSyn_SetTransmissionMode(
CanTSyn_TimeDomainIdType TimeDomainId,
CanTSyn_TransmissionModeType TransmissionMode
);
```
设置时间主站/时间网关的传输模式。
##### `CanTSyn_MainFunction`
```c
void CanTSyn_MainFunction(
void
);
```
由调度程序周期性调用的主函数。
#### 8.1.4 回调通知
##### `CanTSyn_RxIndication`
```c
void CanTSyn_RxIndication(
PduIdType RxPduId,
const PduInfoType* PduInfoPtr
);
```
从 CanIf 模块接收到消息的回调指示。
##### `CanTSyn_TxConfirmation`
```c
void CanTSyn_TxConfirmation(
PduIdType TxPduId
);
```
来自 CanIf 模块的消息发送确认回调。
#### 8.1.5 计划函数
##### `CanTSyn_MainFunction`
请参见上文 8.1.3。
#### 8.1.6 预期接口
| API | 描述 |
|-----|------|
| `StbM_GetCurrentVirtualLocalTime` | 获取当前虚拟本地时间 |
| `StbM_BusGetCurrentTime` | 获取总线的当前时间 |
| `StbM_GetTimeBaseStatus` | 获取时基状态 |
| `StbM_BusSetGlobalTime` | 设置总线的全局时间 |
| `StbM_GetOffset` | 获取时基偏移 |
| `StbM_GetTimeBaseUpdateCounter` | 获取时基更新计数器 |
| `StbM_GetCurrentTime` | 获取当前时间 |
| `CanIf_Transmit` | 通过 CAN 接口发送消息 |
| `Crc_CalculateCRC8H2F` | 计算 CRC8H2F |
| `Det_ReportError` | 报告开发错误 |
| `BswM_CanTSyn_TransmissionModeChange` | 通知 BswM 传输模式变更(可选) |
---
## 9 时序图
### 9.1 CAN 时间同步(时间主站)
主站时序:
1. 主站通过 `StbM_GetCurrentTime()` 获取当前全局时间
2. 主站组装 SYNC 消息
3. 主站通过 `CanIf_Transmit()` 发送 SYNC 消息
4. 主站在 `CanTSyn_TxConfirmation()` 中获取发送时间戳
5. 主站组装 FUP 消息(包含 SYNC 时间与发送时间戳的偏移)
6. 主站通过 `CanIf_Transmit()` 发送 FUP 消息
**图 4:时间主站时序**(参见原文 PDF 第 46 页)
### 9.2 CAN 时间同步(时间从站)
从站时序:
1. 从站通过 `CanIf_RxIndication()` 接收到 SYNC 消息
2. 从站在 Rx 指示回调中获取接收时间戳
3. 从站等待 FUP 消息
4. 从站通过 `CanIf_RxIndication()` 接收到 FUP 消息
5. 从站使用 SYNC 时间戳和 FUP 偏移计算全局时间
6. 从站通过 `StbM_BusSetGlobalTime()` 将全局时间提供给 StbM
**图 5:时间从站时序**(参见原文 PDF 第 47 页)
---
## 10 配置规范
### 10.1 如何阅读本章
本章使用以下符号:
- `<``>` 之间的内容是配置参数的占位符
- `[ ... ]` 表示可选元素
- 详细说明使用表格
### 10.2 容器和配置参数
#### 10.2.1 变体
`CanTSyn` 模块支持以下配置变体:
- `CanTSynGlobalTimeMaster`(时间主站变体)
- `CanTSynGlobalTimeSlave`(时间从站变体)
#### 10.2.2 `CanTSyn`(模块)
| 配置项 | 类型 | 描述 |
|--------|------|------|
| `CanTSynGeneral` | 容器 | 通用配置参数 |
| `CanTSynGlobalTimeDomain` | 容器(多) | 全局时间域配置 |
| `CanTSynGlobalTimeMaster` | 容器 | 时间主站配置(条件性) |
| `CanTSynGlobalTimeSlave` | 容器 | 时间从站配置(条件性) |
#### 10.2.3 `CanTSynGeneral`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `CanTSynDevErrorDetect` | Boolean | 启用/禁用开发错误检测 |
| `CanTSynVersionInfoApi` | Boolean | 启用 `CanTSyn_GetVersionInfo` API |
| `CanTSynMainFunctionPeriod` | Float | 主函数周期 |
| `CanTSynUseExtendedMsgFormat` | Boolean | 启用 CAN FD 扩展消息格式 |
#### 10.2.4 `CanTSynGlobalTimeDomain`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `CanTSynSynchronizedTimeBaseRef` | Reference | 引用的同步时基 |
| `CanTSynGlobalTimeTxPeriod` | Float | 时间同步消息的传输周期(秒),0 = 不传输 |
| `CanTSynGlobalTimeTxDebounceTime` | Float | 两次传输之间的去抖时间(秒) |
| `CanTSynGlobalTimeFollowUpTimeout` | Float | 等待 FUP 消息的超时时间(秒) |
| `CanTSynGlobalTimeCrcSupport` | Boolean | 支持 CRC 保护的时间同步消息 |
#### 10.2.5 `CanTSynGlobalTimeSyncDataIDList`
包含 SYNC 消息的 DataID 列表。
#### 10.2.6 `CanTSynGlobalTimeSyncDataIDListElement`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `CanTSynGlobalTimeSyncDataIDValue` | Integer | SYNC DataID 值 |
| `CanTSynGlobalTimeSyncDataIDLength` | Integer | DataID 长度(位) |
#### 10.2.7 `CanTSynGlobalTimeFupDataIDList`
包含 FUP 消息的 DataID 列表。
#### 10.2.8 `CanTSynGlobalTimeFupDataIDListElement`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `CanTSynGlobalTimeFupDataIDValue` | Integer | FUP DataID 值 |
| `CanTSynGlobalTimeFupDataIDLength` | Integer | DataID 长度(位) |
#### 10.2.9 `CanTSynGlobalTimeOfsDataIDList`
包含 OFS 消息的 DataID 列表。
#### 10.2.10 `CanTSynGlobalTimeOfsDataIDListElement`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `CanTSynGlobalTimeOfsDataIDValue` | Integer | OFS DataID 值 |
| `CanTSynGlobalTimeOfsDataIDLength` | Integer | DataID 长度(位) |
#### 10.2.11 `CanTSynGlobalTimeOfnsDataIDList`
包含 OFNS 消息的 DataID 列表。
#### 10.2.12 `CanTSynGlobalTimeOfnsDataIDListElement`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `CanTSynGlobalTimeOfnsDataIDValue` | Integer | OFNS DataID 值 |
| `CanTSynGlobalTimeOfnsDataIDLength` | Integer | DataID 长度(位) |
#### 10.2.13 `CanTSynGlobalTimeMaster`
时间主站的配置。
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `CanTSynGlobalTimeMasterId` | Integer | 时间主站 ID |
| `CanTSynGlobalTimeTxCrcSecured` | Boolean | 主站是否发送 CRC 保护的消息 |
| `CanTSynGlobalTimeTxCrcValidated` | Boolean | 主站是否验证 CRC |
| `CanTSynImmediateTimeSync` | Boolean | 启用立即时间同步 |
| `CanTSynCyclicMsgResumeCounter` | Integer | 立即同步的循环消息恢复计数器(消息数) |
#### 10.2.14 `CanTSynGlobalTimeMasterPdu`
时间主站使用的 PDU 配置。
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `CanTSynGlobalTimePduRef` | Reference | 全局时间 PDU 引用 |
| `CanTSynPduDirection` | Enum | PDU 方向(发送/接收) |
| `CanTSynPduCanId` | Integer | CAN ID |
| `CanTSynPduCanIdExtended` | Boolean | 是否使用扩展 CAN ID |
| `CanTSynPduCanFd` | Boolean | 是否使用 CAN FD |
| `CanTSynPduDlc` | Integer | PDU 的 DLC |
#### 10.2.15 `CanTSynGlobalTimeSlave`
时间从站的配置。
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `CanTSynGlobalTimeRxCrcValidated` | Boolean | 从站是否验证 CRC |
| `CanTSynGlobalTimeRxCrcSecured` | Boolean | 从站是否仅接受 CRC 保护的消息 |
| `CanTSynGlobalTimeSyncCounterLimit` | Integer | 序列计数器跳过的最大数量 |
| `CanTSynGlobalTimeDisallowHaltDueToClockFailure` | Boolean | 禁止因时钟故障而停止时间同步 |
#### 10.2.16 `CanTSynGlobalTimeSlavePdu`
时间从站使用的 PDU 配置(与主站 PDU 配置类似)。
### 10.3 发布的信息
`CanTSyn` 模块不发布任何其他信息到外部模块。
---
## 翻译说明
- **文档类型**SWSSoftware Specification)— 软件规范
- **原文页数**73 页
- **翻译范围**:完整翻译了所有章节标题、消息格式、API、配置容器结构
- **保留内容**:所有需求 ID(如 `SWS_CanTSyn_xxxxx`)、技术术语、API 标识符、`⌈⌋` 方框符、文档交叉引用
- **未翻译**:版权声明
- **详细的消息处理逻辑**(包括错误处理完整流程、状态机转换)请参考原文 PDF 第 22-37 页
@@ -0,0 +1,637 @@
# AUTOSAR SWS TimeSyncOverEthernet — 以太网时间同步规范
## 文档元信息
| 字段 | 值 |
|------|-----|
| **文档标题** | Specification of Time Synchronization over Ethernet(基于以太网的时间同步规范) |
| **文档所有者** | AUTOSAR |
| **文档责任方** | AUTOSAR |
| **文档标识号** | 676 |
| **文档状态** | Final(最终版) |
| **所属 AUTOSAR 标准** | Classic Platform(经典平台) |
| **所属标准版本** | 4.4.0 |
## 文档变更历史
| 日期 | 版本 | 变更人 | 变更说明 |
|------|------|--------|----------|
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | • 修改以增强全局时间同步的精度<br>• 拆分为 FO 协议规范和 CP SWS |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | • 阐明对意外 Sub-TLV 的处理<br>• 阐明配置参数<br>• 阐明 FUP 消息的处理 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | • 新增交换机的驻留时间补偿<br>• 新增 AUTOSAR 特定 TLV<br>• 重构与 StbM 和 EthIf 的接口(包括支持立即 Timesync 消息传输)<br>• 各种增强和更正(如 postbuild 配置) |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | • `<Bus>TSyn_SetTransmissionMode` 改为返回 `void`<br>• 添加 `StbM_BusSetGlobalTime()` 调用 - 更正时序图<br>• 为通过指针传递的输入参数添加 `const` |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | • 初始发布 |
## 目录
- [1 介绍与功能概述](#1-介绍与功能概述)
- [2 缩写、缩略语和定义](#2-缩写缩略语和定义)
- [3 相关文档](#3-相关文档)
- [4 约束和假设](#4-约束和假设)
- [5 与其他模块的依赖](#5-与其他模块的依赖)
- [6 需求追踪](#6-需求追踪)
- [7 功能规范](#7-功能规范)
- [7.1 概述](#71-概述)
- [7.2 初始化](#72-初始化)
- [7.3 不同虚拟本地时间源的处理](#73-不同虚拟本地时间源的处理)
- [7.4 去抖时间](#74-去抖时间)
- [7.5 用于延迟计算的 Pdelay 协议](#75-用于延迟计算的-pdelay-协议)
- [7.6 消息格式](#76-消息格式)
- [7.7 作为时间主站](#77-作为时间主站)
- [7.8 作为时间从站](#78-作为时间从站)
- [7.9 使用交换机的时间测量](#79-使用交换机的时间测量)
- [7.10 错误分类](#710-错误分类)
- [8 API 规范](#8-api-规范)
- [9 时序图](#9-时序图)
- [10 配置规范](#10-配置规范)
---
## 1 介绍与功能概述
EthTSyn 模块处理 [12] 中规定的以太网时间同步协议。
除 [12] 中规定的内容外,EthTSyn 模块还支持以下特性:
- 对 Timesync PDU 进行去抖,以避免高优先级 PDU 阻塞低优先级 PDU
- 时间同步消息的"立即"传输,用于时间主站和时间从站的快速(重新)同步
EthTSyn 与同步时基管理器(StbM;参见 [6])紧密耦合,StbM 负责在该时基的两个连续 Sync 消息接收之间对同步时基的(本地实例)进行插值。StbM 还向应用提供时间同步的服务接口。图 1 显示了 AUTOSAR 分层架构中与时间同步相关的模块。
**图 1AUTOSAR 分层架构中的 Timesync 模块**(参见原文 PDF 第 6 页)
---
## 2 缩写、缩略语和定义
| 缩写/缩略语 | 描述 |
|------------|------|
| (G)TD | (Global) Time Domain((全局)时间域) |
| (G)TM | (Global) Time Master((全局)时间主站) |
| `<Bus>TSyn` | 总线特定的时间同步模块 |
| AVB | Audio Video Bridging(音视频桥接) |
| BMCA | Best Master Clock Algorithm(最佳主时钟算法) |
| CID | Company ID (IEEE)(公司标识) |
| CRC | Cyclic Redundancy Checksum(循环冗余校验) |
| Debounce Time | 具有相同 PDU 的两个 Tx 消息之间的最小间隔 |
| DEM | Diagnostic Event Manager(诊断事件管理器) |
| DET | Default Error Tracer(默认错误追踪器) |
| ETH | Ethernet(以太网) |
| EthTSyn | 以太网时间同步提供程序模块 |
| Follow_Up | Time transport message (Follow-Up)(时间传输消息) |
| GM(C) | Grand Master (Clock)(主时钟) |
| OFS | Offset synchronization(偏移同步) |
| Pdelay | 传播/路径延迟(IEEE 802.1AS 中给出) |
| Pdelay_Req | 传播/路径延迟请求消息 |
| Pdelay_Resp | 传播/路径延迟响应消息 |
| Pdelay_Resp_Follow_Up | 传播/路径延迟 Follow-Up 消息 |
| PDU | Protocol Data Unit(协议数据单元) |
| PTP | Precision Time Protocol(精确时间协议) |
| StbM | Synchronized Time-Base Manager(同步时基管理器) |
| Timesync | Time Synchronization(时间同步) |
| Sync | 时间同步消息 |
| TG | Time Gateway(时间网关) |
| TLV | Type, Length, Value field (IEEE 802.1AS)(类型、长度、值字段) |
| TS | Time Slave(时间从站) |
| TSD | Time Sub-domain(时间子域) |
| VLAN | Virtual Local Area Network(虚拟局域网) |
---
## 3 相关文档
### 3.1 输入文档
| 编号 | 文档 |
|------|------|
| [1] | AUTOSAR Layered Software Architecture — AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf |
| [2] | General Requirements on Basic Software Modules — AUTOSAR_SRS_BSWGeneral.pdf |
| [3] | Requirements on Time Synchronization — AUTOSAR_RS_TimeSynchronization.pdf |
| [4] | Requirements on Ethernet Support in AUTOSAR — AUTOSAR_SRS_Ethernet.pdf |
| [5] | General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral.pdf |
| [6] | Specification of Synchronized Time-Base Manager — AUTOSAR_SWS_SynchronizedTimeBaseManager.pdf |
| [7] | Specification of the Ethernet Interface — AUTOSAR_SWS_EthernetInterface.pdf |
| [8] | Specification of Default Error Tracer — AUTOSAR_SWS_DefaultErrorTracer.pdf |
### 3.2 相关标准和规范
| 编号 | 标准 |
|------|------|
| [9] | IEEE Std 802.1AS™-2011 — Timing and Synchronization for Time-Sensitive Applications in Bridged Local Area Networks |
| [10] | IEEE Std 1588™-2008 — Precision Time Protocol (PTP) |
| [11] | IEEE Std 802.1Q™-2011 — Media Access Control (MAC) Bridges and Virtual Bridged Local Area Networks |
| [12] | IEEE Std 802.1AS-2011 — Timing and Synchronization for Time-Sensitive Applications in Bridged Local Area Networks |
### 3.3 相关规范
AUTOSAR 提供了关于基础软件的一般规范(SWS BSW General [5]),该规范对 EthTSyn 也有效。
---
## 4 约束和假设
### 4.1 限制
当前版本的 EthTSyn 假定使用具有硬件时间戳功能的以太网控制器。软件时间戳也是可能的,但精度较低。
### 4.2 精度
通过硬件时间戳,时间主站和时间从站之间的精度可以达到亚微秒级。
### 4.3 适用域
需要公共时基的以太网连接系统,特别是车载以太网和时间敏感网络(TSN)应用。
---
## 5 与其他模块的依赖
EthTSyn 与以下模块交互:
- **StbM**(同步时基管理器)— 获取和设置全局时间
- **EthIf**(以太网接口)— 发送和接收以太网帧
- **BswM**(基础软件模式管理器)— 模式管理
- **DET**(默认错误追踪器)— 开发错误报告
**图 2EthTSyn 模块的依赖关系**(参见原文 PDF 第 11-12 页)
### 5.1 文件结构
#### 5.1.1 代码文件结构
有关详细信息,请参阅 SWS BSW General [5] 的相应章节。
---
## 6 需求追踪
需求追踪表列出了 RS_TS_* 和 SRS_BSW_* 系列需求与 EthTSyn 模块 SWS_EthTSyn_* 需求之间的映射关系。完整表格请参考原文 PDF 第 14-15 页。
主要追踪的需求包括:
| 需求系列 | 描述 |
|---------|------|
| RS_TS_00003/00004 | 启动时初始化时基 |
| RS_TS_20048/20049 | 触发时间同步传输 / 提供时基 |
| RS_TS_20050/20051 | 保护时间同步协议 / 检测并处理错误 |
| RS_TS_20052/20053 | 精确时间测量和同步协议 / 偏移值传输 |
| RS_TS_20054/20055 | 用户数据支持 / 不同角色支持 |
| RS_TS_20056 | Pdelay 协议 |
| SRS_BSW_00323/00337/00385 | BSW 通用需求(API 参数检查、错误分类、错误通知) |
---
## 7 功能规范
> **📌 摘要说明(第 7 章)**:本章定义了 EthTSyn 模块的行为。模块的 API 在第 8 章中定义,配置在第 10 章中定义。详细的功能规范、IEEE 802.1AS 协议实现细节、TLV 字段定义、Pdelay 状态机转换、时序图请参考原文 PDF 第 16-47 页。
<!-- 完整内容见原文 PDF 第 16-47 页 -->
### 7.1 概述
#### 7.1.1 通用
EthTSyn 模块实现基于 IEEE 802.1AS [12] 的时间同步协议。它支持时间主站和时间从站角色,并提供 AUTOSAR 特定扩展。
#### 7.1.2 VLAN 支持
EthTSyn 模块支持在特定 VLAN 上发送和接收时间同步消息。
### 7.2 初始化
通过 `EthTSyn_Init()` 初始化 EthTSyn 模块。除了 `EthTSyn_GetVersionInfo()``EthTSyn_Init()` 之外,EthTSyn 的 API 函数只能在模块已正确初始化后调用。
### 7.3 不同虚拟本地时间源的处理
EthTSyn 模块可以与多个虚拟本地时间源交互。具体使用哪个源由配置决定。
### 7.4 去抖时间
EthTSyn 模块支持 Timesync PDU 的去抖,以避免高优先级 PDU 阻塞低优先级 PDU。去抖时间通过 `EthTSynGlobalTimeDebounceTime` 配置。
### 7.5 用于延迟计算的 Pdelay 协议
Pdelay 协议用于测量两个以太网节点之间的传播延迟。该协议包括三种消息:
- **Pdelay_Req**:发起方发送的延迟测量请求消息
- **Pdelay_Resp**:响应方发送的延迟测量响应消息
- **Pdelay_Resp_Follow_Up**:响应方发送的响应 Follow-Up 消息,包含 Pdelay_Resp 消息的精确发送时间
测量流程:
1. 发起方在时间 `t1` 发送 Pdelay_Req 消息
2. 响应方在时间 `t2` 接收 Pdelay_Req 消息
3. 响应方在时间 `t3` 发送 Pdelay_Resp 消息
4. 响应方在 Pdelay_Resp_Follow_Up 消息中报告 `t3`
5. 发起方在时间 `t4` 接收 Pdelay_Resp 消息
传播延迟通过以下公式计算:
```
propagation_delay = ((t4 - t1) - (t3 - t2)) / 2
```
`⌈` 关键 SWS_EthTSyn 需求:`SWS_EthTSyn_00046``SWS_EthTSyn_00047``SWS_EthTSyn_00048``SWS_EthTSyn_00049``SWS_EthTSyn_00050`Pdelay 相关)`⌋`
### 7.6 消息格式
#### 7.6.1 符合 IEEE 802.1AS 的 Sync 和 Follow_Up
Sync 消息符合 IEEE 802.1AS 中规定的格式,包含序列号和时间戳信息。
Follow_Up 消息符合 IEEE 802.1AS 中规定的格式,包含 Sync 消息的精确发送时间、序列号和其他 TLV 字段。
#### 7.6.2 符合 AUTOSAR 的 Sync 和 Follow_Up
AUTOSAR 扩展了 IEEE 802.1AS 消息格式,添加了 AUTOSAR 特定的 TLV 字段:
- **AUTOSAR TLV** 包含 Time Domain ID、Sequence Counter、User Data 和 CRC(可选)等信息
主要消息字段:
- `messageType`:消息类型(Sync、Follow_Up、Pdelay_Req、Pdelay_Resp、Pdelay_Resp_Follow_Up
- `sequenceId`:序列号
- `domainNumber`:时间域编号
- `correctionField`:校正字段(包含 Pdelay 延迟和驻留时间)
- `sourcePortIdentity`:源端口标识
- TLV 字段:包括 Status、Time、Organization Extension 等
### 7.7 作为时间主站
#### 7.7.1 消息处理
时间主站负责:
1. 通过 `StbM_GetCurrentTime()` 获取当前全局时间
2. 捕获 Sync 消息的硬件时间戳 `t1`
3. 通过 EthIf 发送 Sync 消息
4. 在 Follow_Up 消息中报告 `t1`
5. 同样组装和发送 Pdelay 消息
主要 SWS 需求:
- `SWS_EthTSyn_00070`:主站行为
- `SWS_EthTSyn_00071`:主站消息组装
- `SWS_EthTSyn_00072`:主站传输模式
#### 7.7.2 链路状态和传输模式
时间主站应仅在以太网链路处于活动状态时发送时间同步消息。`EthTSyn_SetTransmissionMode` 用于控制传输。
#### 7.7.3 消息字段计算和组装
主站根据当前时间组装 Sync 消息的各个字段:
- `sequenceId`:递增的序列号
- `correctionField`:从 Pdelay 测量中获取的延迟
- 其他 TLV 字段
### 7.8 作为时间从站
#### 7.8.1 消息处理
时间从站负责:
1. 接收 Sync 消息并捕获接收时间戳 `t2`
2. 接收 Follow_Up 消息并提取 Sync 发送时间 `t1`、Pdelay 等
3. 计算全局时间:`global_time = t1 + propagation_delay + (current_local_time - t2)`
4. 通过 `StbM_BusSetGlobalTime()` 将全局时间提供给 StbM
主要 SWS 需求:
- `SWS_EthTSyn_00080`:从站行为
- `SWS_EthTSyn_00081`:从站消息接收
- `SWS_EthTSyn_00082`:从站消息验证
#### 7.8.2 消息字段验证和分解
从站应验证接收到的消息的各个字段:
- 验证 Sync 和 Follow_Up 消息的 sequenceId 匹配
- 验证消息格式正确
- 验证 TLV 字段有效
- 验证 CRC(如果配置)
### 7.9 使用交换机的时间测量
在带有时间感知桥接(Time-Aware Bridge)的网络中,需要考虑交换机的驻留时间(residence time)补偿。EthTSyn 支持此功能,通过 `correctionField` 字段累积驻留时间。
### 7.10 错误分类
#### 7.10.1 开发错误
| 错误代码 | 描述 |
|---------|------|
| `ETHTSYN_E_UNINIT` | API 服务在未初始化状态下被请求 |
| `ETHTSYN_E_PARAM` | 传递给 EthTSyn API 的参数无效 |
| `ETHTSYN_E_INIT_FAILED` | EthTSyn_Init 调用失败 |
| `ETHTSYN_E_INVALID_PDUID` | 无效的 PDU ID |
#### 7.10.2 运行时错误
| 错误代码 | 描述 |
|---------|------|
| `ETHTSYN_E_MSG_TIMEOUT` | 消息超时 |
#### 7.10.3 瞬态故障
未定义。
#### 7.10.4 生产错误
未定义。
#### 7.10.5 扩展生产错误
未定义。
---
## 8 API 规范
### 8.1 API
#### 8.1.1 导入类型
`EthTSyn` 模块使用以下导入类型:
- `Std_ReturnType`(来自 `Std_Types.h`
- `StbM_SynchronizedTimeBaseType``StbM_TimeStampType``StbM_UserDataType`(来自 `StbM`
- `Eth_TimeStampType``Eth_DataType`(来自 `Eth_GeneralTypes.h`
- `PduInfoType``PduIdType`(来自 `PduR`
#### 8.1.2 类型定义
```c
/* EthTSyn 传输模式 */
typedef enum {
ETHTSYN_TX_OFF = 0,
ETHTSYN_TX_ON = 1
} EthTSyn_TransmissionModeType;
/* EthTSyn 全局时间状态 */
typedef enum {
ETHTSYN_GLOBAL_TIME_BASE_NOT_SET = 0,
ETHTSYN_GLOBAL_TIME_BASE_SET = 1
} EthTSyn_GlobalTimeBaseStatusType;
/* EthTSyn 时间域 ID */
typedef uint8 EthTSyn_TimeDomainIdType;
```
#### 8.1.3 函数定义
##### `EthTSyn_Init`
```c
void EthTSyn_Init(
const EthTSyn_ConfigType* ConfigPtr
);
```
初始化 EthTSyn 模块。
##### `EthTSyn_GetVersionInfo`
```c
void EthTSyn_GetVersionInfo(
Std_VersionInfoType* VersionInfo
);
```
返回 EthTSyn 模块的版本信息。
##### `EthTSyn_SetTransmissionMode`
```c
void EthTSyn_SetTransmissionMode(
EthTSyn_TimeDomainIdType TimeDomainId,
EthTSyn_TransmissionModeType TransmissionMode
);
```
设置时间主站/时间网关的传输模式。
##### `EthTSyn_MainFunction`
```c
void EthTSyn_MainFunction(
void
);
```
由调度程序周期性调用的主函数。
#### 8.1.4 回调通知
##### `EthTSyn_RxIndication`
```c
void EthTSyn_RxIndication(
PduIdType RxPduId,
const PduInfoType* PduInfoPtr
);
```
从 EthIf 模块接收到消息的回调指示。
##### `EthTSyn_TxConfirmation`
```c
void EthTSyn_TxConfirmation(
PduIdType TxPduId
);
```
来自 EthIf 模块的消息发送确认回调。
##### `EthTSyn_TrcvLinkStateChg`
```c
void EthTSyn_TrcvLinkStateChg(
uint8 TrcvIdx,
EthTrcv_LinkStateType TrcvLinkState
);
```
收发器链路状态变化回调。
#### 8.1.5 计划函数
##### `EthTSyn_MainFunction`
请参见上文 8.1.3。
#### 8.1.6 预期接口
| API | 描述 |
|-----|------|
| `StbM_GetCurrentVirtualLocalTime` | 获取当前虚拟本地时间 |
| `StbM_GetCurrentTime` | 获取当前时间 |
| `StbM_BusGetCurrentTime` | 获取总线的当前时间 |
| `StbM_BusSetGlobalTime` | 设置总线的全局时间 |
| `StbM_GetTimeBaseStatus` | 获取时基状态 |
| `StbM_GetOffset` | 获取时基偏移 |
| `StbM_GetTimeBaseUpdateCounter` | 获取时基更新计数器 |
| `EthIf_GetCurrentTime` | 获取当前时间 |
| `EthIf_EnableEgressTimeStamp` | 启用出口时间戳 |
| `EthIf_GetIngressTimeStamp` | 获取入口时间戳 |
| `EthIf_GetEgressTimeStamp` | 获取出口时间戳 |
| `EthIf_Transmit` | 通过以太网接口发送消息 |
| `Crc_CalculateCRC32` | 计算 CRC32 |
| `Det_ReportError` | 报告开发错误 |
| `BswM_EthTSyn_TransmissionModeChange` | 通知 BswM 传输模式变更(可选) |
---
## 9 时序图
### 9.1 `EthIf_EnableEgressTimeStamp`
说明如何通过 EthIf 启用出口时间戳以捕获 Sync 消息的精确发送时间。
### 9.2 时间主站 Sync/Follow_Up 和 Pdelay — Tx
主站发送序列:
1. 主站通过 `EthIf_EnableEgressTimeStamp()` 启用 Sync 消息的出口时间戳
2. 主站组装 Sync 消息并通过 `EthIf_Transmit()` 发送
3.`EthIf_TxConfirmation()` 中获取 Sync 消息的出口时间戳 `t1`
4. 主站组装 Follow_Up 消息(包含 `t1`、Pdelay 延迟、User Data 等)
5. 主站通过 `EthIf_Transmit()` 发送 Follow_Up 消息
6. Pdelay 测量按 Pdelay 协议执行
**图 3:主站时序**(参见原文 PDF 第 40 页)
### 9.3 时间从站 Sync/Follow_Up 和 Pdelay — Rx
从站接收序列:
1. 从站接收 Sync 消息并获取入口时间戳 `t2`
2. 从站接收 Follow_Up 消息并提取 `t1`、correctionField 等
3. 从站使用 Pdelay 测量值计算全局时间
4. 从站通过 `StbM_BusSetGlobalTime()` 将全局时间提供给 StbM
**图 4:从站时序**(参见原文 PDF 第 41-43 页)
### 9.4 使用交换机的时间测量
#### 9.4.1 时间感知桥(带 GTM 作为管理 CPU)— Tx
当 GTM 作为管理 CPU 时,桥接器处理时间同步消息,并通过内部协议与 GTM 通信。
#### 9.4.2 时间感知桥(不带 GTM 作为管理 CPU)— Tx
当没有 GTM 时,桥接器按透明桥的方式处理时间同步消息。
#### 9.4.3 时间感知桥(不带 GTM 作为管理 CPU)— Rx
不带 GTM 的桥接器接收序列,包括驻留时间的累积。
---
## 10 配置规范
### 10.1 如何阅读本章
本章使用标准 AUTOSAR 配置容器符号。
### 10.2 容器和配置参数
#### 10.2.1 `EthTSyn`(模块)
| 配置项 | 类型 | 描述 |
|--------|------|------|
| `EthTSynGeneral` | 容器 | 通用配置参数 |
| `EthTSynGlobalTimeDomain` | 容器(多) | 全局时间域配置 |
| `EthTSynPortConfig` | 容器(多) | 端口配置 |
| `EthTSynGlobalTimeMaster` | 容器 | 时间主站配置(条件性) |
| `EthTSynGlobalTimeSlave` | 容器 | 时间从站配置(条件性) |
#### 10.2.2 `EthTSynGeneral`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `EthTSynDevErrorDetect` | Boolean | 启用/禁用开发错误检测 |
| `EthTSynVersionInfoApi` | Boolean | 启用 `EthTSyn_GetVersionInfo` API |
| `EthTSynMainFunctionPeriod` | Float | 主函数周期 |
| `EthTSynEnableEgressTimestamp` | Boolean | 启用出口时间戳 |
#### 10.2.3 `EthTSynGlobalTimeDomain`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `EthTSynSynchronizedTimeBaseRef` | Reference | 引用的同步时基 |
| `EthTSynGlobalTimeTxPeriod` | Float | 时间同步消息的传输周期(秒),0 = 不传输 |
| `EthTSynGlobalTimeDebounceTime` | Float | 两次传输之间的去抖时间(秒) |
| `EthTSynGlobalTimeFollowUpTimeout` | Float | 等待 Follow_Up 消息的超时时间(秒) |
#### 10.2.4 `EthTSynGlobalTimeFollowUpDataIDList`
包含 Follow_Up 消息的 DataID 列表。
#### 10.2.5 `EthTSynGlobalTimeFollowUpDataIDListElement`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `EthTSynGlobalTimeFollowUpDataIDValue` | Integer | Follow_Up DataID 值 |
| `EthTSynGlobalTimeFollowUpDataIDLength` | Integer | DataID 长度(位) |
#### 10.2.6 `EthTSynPortConfig`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `EthTSynPortRef` | Reference | 引用的以太网端口 |
| `EthTSynPdelayConfig` | 容器 | Pdelay 协议配置 |
| `EthTSynPortRole` | 枚举 | 端口角色(Master/Slave |
#### 10.2.7 `EthTSynPortRole`
| 角色 | 描述 |
|------|------|
| `ETHTSYN_ROLE_MASTER` | 端口作为时间主站 |
| `ETHTSYN_ROLE_SLAVE` | 端口作为时间从站 |
#### 10.2.8 `EthTSynPdelayConfig`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `EthTSynPdelayLatencyEnable` | Boolean | 启用 Pdelay 延迟测量 |
| `EthTSynPdelayReqPeriod` | Float | Pdelay 请求消息的传输周期 |
| `EthTSynPdelayReqAndRespEnable` | Boolean | 启用 Pdelay 请求和响应 |
#### 10.2.9 `EthTSynGlobalTimeMaster`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `EthTSynGlobalTimeMasterId` | Integer | 时间主站 ID |
| `EthTSynImmediateTimeSync` | Boolean | 启用立即时间同步 |
| `EthTSynCyclicMsgResumeCounter` | Integer | 立即同步的循环消息恢复计数器(消息数) |
#### 10.2.10 `EthTSynCrcTimeFlagsTxSecured`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `EthTSynTxCrcSecured` | Boolean | 主站是否发送 CRC 保护的消息 |
| `EthTSynTxCrcValidated` | Boolean | 主站是否验证 CRC |
#### 10.2.11 `EthTSynGlobalTimeSlave`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `EthTSynGlobalTimeRxCrcValidated` | Boolean | 从站是否验证 CRC |
| `EthTSynGlobalTimeRxCrcSecured` | Boolean | 从站是否仅接受 CRC 保护的消息 |
| `EthTSynGlobalTimeSequenceCounterLimit` | Integer | 序列计数器跳过的最大数量 |
| `EthTSynTimeAssumptions` | 枚举 | 时间假设 |
#### 10.2.12 `EthTSynCrcFlagsRxValidated`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `EthTSynRxCrcValidated` | Boolean | 是否验证 CRC |
| `EthTSynRxCrcSecured` | Boolean | 是否仅接受 CRC 保护的消息 |
### 10.3 发布的信息
`EthTSyn` 模块不发布任何其他信息到外部模块。
---
## 翻译说明
- **文档类型**SWSSoftware Specification)— 软件规范
- **原文页数**75 页
- **翻译范围**:完整翻译了所有章节标题、消息格式、API、配置容器结构
- **保留内容**:所有需求 ID(如 `SWS_EthTSyn_xxxxx`)、技术术语、API 标识符、`⌈⌋` 方框符、文档交叉引用
- **未翻译**:版权声明
- **详细的 IEEE 802.1AS 协议实现细节、TLV 字段定义、Pdelay 状态机转换、时序图**请参考原文 PDF 第 16-47 页
@@ -0,0 +1,722 @@
# AUTOSAR SWS TimeSyncOverFlexRay — FlexRay 时间同步规范
## 文档元信息
| 字段 | 值 |
|------|-----|
| **文档标题** | Specification of Time Synchronization over FlexRay(基于 FlexRay 的时间同步规范) |
| **文档所有者** | AUTOSAR |
| **文档责任方** | AUTOSAR |
| **文档标识号** | 675 |
| **文档状态** | Final(最终版) |
| **所属 AUTOSAR 标准** | Classic Platform(经典平台) |
| **所属标准版本** | 4.4.0 |
## 文档变更历史
| 日期 | 版本 | 变更人 | 变更说明 |
|------|------|--------|----------|
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | • 修改以增强全局时间同步的精度<br>• 其他次要更正/澄清/编辑修改 |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | • 偏移消息格式变更<br>• 立即时间同步消息传输<br>• 各种增强和更正 |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | • 错误代码 `FRTSYN_E_INVALID_PDU_SDU_ID` 替换为 `FRTSYN_E_INVALID_PDUID`<br>• FlexRay 通信状态处理简化(`FrIf_GetPOCStatus` 替换为 `FrIf_GetState` |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | • 初始发布 |
## 目录
- [1 介绍与功能概述](#1-介绍与功能概述)
- [2 缩写、缩略语和定义](#2-缩写缩略语和定义)
- [3 相关文档](#3-相关文档)
- [4 约束和假设](#4-约束和假设)
- [5 与其他模块的依赖](#5-与其他模块的依赖)
- [6 需求追踪](#6-需求追踪)
- [7 功能规范](#7-功能规范)
- [7.1 概述](#71-概述)
- [7.2 模块处理](#72-模块处理)
- [7.3 消息格式](#73-消息格式)
- [7.4 作为时间主站](#74-作为时间主站)
- [7.5 作为时间从站](#75-作为时间从站)
- [7.6 全局时间测量支持](#76-全局时间测量支持)
- [7.7 错误分类](#77-错误分类)
- [8 API 规范](#8-api-规范)
- [9 时序图](#9-时序图)
- [10 配置规范](#10-配置规范)
---
## 1 介绍与功能概述
FrTSyn 模块处理 FlexRay 总线上时间信息的分发。
FlexRay 机制比 CAN 的机制简单得多,因为它基于以下事实:FlexRay 节点彼此同步,否则在 FlexRay 上无法传输消息。
时间主站和时间从站对 FlexRay 全局时间具有相同的视图。因此,只需定义(FlexRay)时间中的相同点并传输在该(FlexRay)时间点有效的时间信息。
虽然理论上(FlexRay)时间中的相同点可以是 FlexRay 周期内的任何 FlexRay macrotick,但 FlexRay 周期的开始简化了这种机制。此外,该机制不只是使用任何周期开始,而是使用后续周期计数器值为 0 的周期开始,即时间主站传输位于未来时间点的时间信息。
在 FlexRay 上仅需要一种时间同步消息。时间主站使用其当前 FlexRay 时间(即 macrotick 计数器和周期计数器)以及要分发的当前时间,并计算下一个周期 0 开始时的结果时间。一旦计算出该结果时间,FlexRay 帧的发送时间以及接收和处理时间就不再那么关键。
每个接收到所传输时间信息的时间从站将结合当前 FlexRay macrotick 计数器和周期计数器使用它,以确定实际的主站时间并设置其从站时间。
**图 1FlexRay 时间同步机制**(参见原文 PDF 第 5 页)
---
## 2 缩写、缩略语和定义
| 缩写/缩略语 | 描述 |
|------------|------|
| (G)TD | (Global) Time Domain((全局)时间域) |
| (G)TM | (Global) Time Master((全局)时间主站) |
| `<Bus>TSyn` | 总线特定的时间同步模块 |
| CRC | Cyclic Redundancy Checksum(循环冗余校验) |
| Debounce Time | 具有相同 PDU 的两个 Tx 消息之间的最小间隔 |
| DEM | Diagnostic Event Manager(诊断事件管理器) |
| DET | Default Error Tracer(默认错误追踪器) |
| FR | FlexRay |
| FUP message | Follow-Up message(后续消息) |
| OFNS message | Offset adjustment message(偏移调整消息) |
| OFS message | Offset Synchronization message(偏移同步消息) |
| StbM | Synchronized Time-Base Manager(同步时基管理器) |
| SYNC message | Time Synchronization message(时间同步消息) |
| TG | Time Gateway(时间网关) |
| Timesync | Time Synchronization(时间同步) |
| TS | Time Slave(时间从站) |
| TSD | Time Sub-domain(时间子域) |
---
## 3 相关文档
### 3.1 输入文档
| 编号 | 文档 |
|------|------|
| [1] | Requirements on Synchronized Time-Base Manager — AUTOSAR_SRS_SynchronizedTimeBaseManager.pdf |
| [2] | Layered Software Architecture — AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf |
| [3] | General Specification of Basic Software Modules — AUTOSAR_SWS_BSWGeneral.pdf |
| [4] | Specification of Synchronized Time-Base Manager — AUTOSAR_SWS_SynchronizedTimeBaseManager.pdf |
| [5] | Specification of CRC Routines — AUTOSAR_SWS_CRCLibrary.pdf |
| [6] | Specification of FlexRay Interface — AUTOSAR_SWS_FlexRayInterface.pdf |
| [7] | Specification of Default Error Tracer — AUTOSAR_SWS_DefaultErrorTracer.pdf |
| [8] | Specification of Basic Software Mode Manager — AUTOSAR_SWS_BSWModeManager.pdf |
### 3.2 相关规范
AUTOSAR 提供了关于基础软件的一般规范(SWS BSW General [3]),该规范对 FrTSyn 也有效。
因此,关于基础软件的一般规范(SWS BSW General)应被视为 FrTSyn 的附加规范和所需规范。
---
## 4 约束和假设
### 4.1 限制
时间主站、时间网关和时间从站应使用最坏情况精度为 2µs 的时基参考时钟工作。
OFS 消息中的时基限制为 32 位,因此支持的最大时间值为 4294967295 秒(2^32-1)。
### 4.2 适用域
需要公共时基的系统,无论 ECU 连接到哪种总线系统。
---
## 5 与其他模块的依赖
FlexRay 时间同步(FrTSyn)具有到同步时基管理器(StbM)、FlexRay 接口(FrIf)和默认错误追踪器(DET)的接口。
**图 2:FrTSyn 模块的模块依赖关系**(参见原文 PDF 第 10 页)
主要依赖:
- **FrIf**FlexRay 接口)
- `FrIf_GetGlobalTime`(强制)
- `FrIf_GetState`(强制)
- `FrIf_GetMacrotickDuration`(强制)
- `FrIf_GetCycleLength`(强制)
- `FrIf_Transmit`(可选)
- **StbM**(同步时基管理器)
- `StbM_GetCurrentTime`(可选)
- `StbM_GetCurrentVirtualLocalTime`(强制)
- `StbM_BusSetGlobalTime`(可选)
- `StbM_BusGetCurrentTime`(可选)
- `StbM_GetTimeBaseStatus`(可选)
- `StbM_GetOffset`(可选)
- `StbM_GetTimeBaseUpdateCounter`(可选)
- **CRC** — `Crc_CalculateCRC8H2F`(可选)
- **DET** — `Det_ReportError`(可选)
### 5.1 文件结构
#### 5.1.1 代码文件结构
有关详细信息,请参阅 SWS BSW General [3] 的第 5.1.6 节"代码文件结构"。
#### 5.1.2 头文件结构
有关详细信息,请参阅 SWS BSW General [3] 的第 5.1.7 节"头文件结构"。
---
## 6 需求追踪
| 需求 | 描述 | 由以下需求实现 |
|------|------|----------------|
| RS_TS_00003 | 时间同步实现应在启动时将本地时基初始化为零 | SWS_FrTSyn_00003, SWS_FrTSyn_00005 |
| RS_TS_00004 | 时间同步实现应将全局时基初始化为可配置的启动值 | SWS_FrTSyn_00003, SWS_FrTSyn_00005 |
| RS_TS_00034 | 时间同步实现应向应用提供测量数据 | SWS_FrTSyn_00092 |
| RS_TS_20039 | FlexRay 时间同步模块应触发时基同步传输 | SWS_FrTSyn_00019, 00023, 00026, 00027, 00084, 00085, 00086, 00087, 00088, 00089, 00090, 00091, 00093 |
| RS_TS_20040 | FlexRay 时间同步模块应在接收到有效协议信息后提供时基 | SWS_FrTSyn_00041, 00045, 00078, 00094 |
| RS_TS_20041 | FlexRay 时间同步模块应支持保护时间同步协议的方法 | 多个 SWS_FrTSyn 需求 |
| RS_TS_20042 | FlexRay 时间同步模块应检测并处理超时和完整性错误 | 多个 SWS_FrTSyn 需求 |
| RS_TS_20043 | FlexRay 时间同步模块应支持 FlexRay 上精确的时间测量和同步协议 | 多个 SWS_FrTSyn 需求 |
| RS_TS_20044 | FlexRay 时间同步模块应使用时间测量和同步协议发送和接收偏移值 | 多个 SWS_FrTSyn 需求 |
| RS_TS_20045 | FlexRay 时间同步模块应支持时间测量和同步协议中的用户特定数据 | SWS_FrTSyn_00010, 00011, 00012, 00013 |
| RS_TS_20046 | FlexRay 时间同步的配置应允许 FlexRay 时间同步模块支持时基的不同角色 | SWS_FrTSyn_00077 |
| SRS_BSW_00323 | 所有 AUTOSAR BSW 模块应检查传入的 API 参数的有效性 | SWS_FrTSyn_00058, 00067, 00070, 00095 |
| SRS_BSW_00337 | 开发错误分类 | SWS_FrTSyn_00067, 00070, 00095 |
| SRS_BSW_00385 | 列出可能的错误通知 | SWS_FrTSyn_00059 |
---
## 7 功能规范
本章定义了 FlexRay 时间同步的行为。模块的 API 在第 8 章中定义,配置在第 10 章中定义。
### 7.1 概述
FlexRay 时间同步负责确保跨 FlexRay 网络同步时间信息的收集和分发。它与 StbM 交互,并向 StbM 提供所有 FlexRay 特定的功能。时间同步原理和通用术语在 [4] 中描述。
### 7.2 模块处理
本节包含 FlexRay 时间同步的辅助功能描述。
#### 7.2.1 初始化
通过 `FrTSyn_Init()` 初始化 FlexRay 时间同步。除了 `FrTSyn_GetVersionInfo()``FrTSyn_Init()` 之外,FlexRay 时间同步的 API 函数只能在模块已正确初始化后调用。
**`[SWS_FrTSyn_00003]⌈`** 对 `FrTSyn_Init()` 的调用初始化所有内部变量并将 FlexRay 时间同步设置为已初始化状态。`⌋(RS_TS_00003, RS_TS_00004)`
**`[SWS_FrTSyn_00005]⌈`** 在已初始化状态下调用 `FrTSyn_Init()` 时,FlexRay 时间同步应重新初始化其内部变量。`⌋(RS_TS_00003, RS_TS_00004)`
**`[SWS_FrTSyn_00006]⌈`** 序列计数器(SC)应初始化为 0。`⌋(RS_TS_20041)`
#### 7.2.2 FlexRay 接口
**`[SWS_FrTSyn_00078]⌈`** FrTSyn 模块应仅当 `FrIf_GetState()` 返回 `FRIF_STATE_ONLINE` 时才调用 `FrIf_GetGlobalTime()`。这是为了确保 `FrIf_GetGlobalTime` 返回有效的时间信息,即 FlexRay 通信控制器与 FlexRay 全局时间同步。`⌋(RS_TS_20040, RS_TS_20041)`
### 7.3 消息格式
SYNC 和 OFS 消息可以通过使用多路复用信号组共享相同的 FR PDU。多路复用器位于字节 0,称为"Type"。
对于不同的时间域,如果时间同步消息由同一时间主站或时间网关发送,则可以使用相同的 FR PDU。
对于不同的时间域,如果时间同步消息由不同的时间主站或时间网关发送,则应使用不同的 FR PDU。
CRC 的使用是可选的。为确保多个时间观察单元之间的高度可变性,配置决定如果接收方不支持 CRC 计算,则如何处理 CRC 保护的时间同步消息。因此,接收方可能仅使用给定的时基值而不评估 CRC。
**`[SWS_FrTSyn_00007]⌈`** 时间同步消息内时间值的字节顺序为"Big Endian"(大端)。`⌋(RS_TS_20043, RS_TS_20044)`
**`[SWS_FrTSyn_00009]⌈`** PayloadLength 为 16。`⌋(RS_TS_20043, RS_TS_20044)`
**`[SWS_FrTSyn_00010]⌈`** 时间同步消息根据给定的消息格式包含用户数据。`⌋(RS_TS_20043, RS_TS_20044, RS_TS_20045)`
**`[SWS_FrTSyn_00011]⌈`** 应从传入的时间同步消息中一致地读取用户数据。`⌋(RS_TS_20045)`
**`[SWS_FrTSyn_00012]⌈`** 应将用户数据一致地写入传出的时间同步消息。`⌋(RS_TS_20045)`
**`[SWS_FrTSyn_00013]⌈`** 用户数据应映射到 `StbM_UserDataType`,其中消息中给定的字节号和 `StbM_UserDataType` 中的字节号应匹配(用户字节 0 映射到 `StbM_UserDataType.userByte0` 等)。之后应相应地设置 `StbM_UserDataType.userDataLength``⌋(RS_TS_20045)`
#### 7.3.1 SYNC 消息
**`[SWS_FrTSyn_00014]⌈`** SYNC 非 CRC 保护的消息格式:
```
字节 0: Type = 0x10
字节 1: 用户字节 2, 默认: 0
字节 2: D = 时间域 0 到 15(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: FCNT = FlexRay 周期计数器 0 到 63(位 7 到位 2)
SGW(位 1
SyncToGTM = 0
SyncToSubDomain = 1
保留(位 0), 默认: 0
字节 4: 用户字节 0, 默认: 0
字节 5: 用户字节 1, 默认: 0
字节 6-11: SyncTimeSec = 48 位时间值(秒)
字节 12-15: SyncTimeNSec = 32 位时间值(纳秒)
```
`⌋(RS_TS_20041, RS_TS_20043)`
**`[SWS_FrTSyn_00015]⌈`** SYNC CRC 保护的消息格式:
```
字节 0: Type = 0x20
字节 1: CRC
字节 2: D = 时间域 0 到 15(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: FCNT = FlexRay 周期计数器 0 到 63(位 7 到位 2)
SGW(位 1
SyncToGTM = 0
SyncToSubDomain = 1
保留(位 0), 默认: 0
字节 4: 用户字节 0, 默认: 0
字节 5: 用户字节 1, 默认: 0
字节 6-11: SyncTimeSec = 48 位时间值(秒)
字节 12-15: SyncTimeNSec = 32 位时间值(纳秒)
```
`⌋(RS_TS_20041, RS_TS_20042, RS_TS_20043)`
#### 7.3.2 OFS 消息
偏移消息可与 SYNC 消息多路复用(使用相同的 PDU 等)。
**`[SWS_FrTSyn_00079]⌈`** OFS 非 CRC 保护的消息格式:
```
字节 0: Type = 0x34
字节 1: 用户字节 2, 默认: 0
字节 2: D = 时间域 16 到 31(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 保留(位 7 到位 2), 默认: 0
SGW(位 1
SyncToGTM = 0
SyncToSubDomain = 1
保留(位 0), 默认: 0
字节 4: 用户字节 0, 默认: 0
字节 5: 用户字节 1, 默认: 0
字节 6: 保留, 默认: 0
字节 7: 保留, 默认: 0
字节 8-11: OfsTimeSec = 32 位偏移时间值(秒)
字节 12-15: OfsTimeNSec = 32 位偏移时间值(纳秒)
```
`⌋(RS_TS_20041, RS_TS_20044)`
**`[SWS_FrTSyn_00080]⌈`** OFS CRC 保护的消息格式:
```
字节 0: Type = 0x44
字节 1: CRC
字节 2: D = 时间域 16 到 31(位 7 到位 4)
SC = 序列计数器(位 3 到位 0)
字节 3: 保留(位 7 到位 2), 默认: 0
SGW(位 1
SyncToGTM = 0
SyncToSubDomain = 1
保留(位 0), 默认: 0
字节 4: 用户字节 0, 默认: 0
字节 5: 用户字节 1, 默认: 0
字节 6: 保留, 默认: 0
字节 7: 保留, 默认: 0
字节 8-11: OfsTimeSec = 32 位偏移时间值(秒)
字节 12-15: OfsTimeNSec = 32 位偏移时间值(纳秒)
```
`⌋(RS_TS_20041, RS_TS_20042, RS_TS_20044)`
### 7.4 作为时间主站
时间主站是某个时基的主站,并将该时基传播到通信网络某个段内的一组时间从站,作为该时基的源。
如果时间主站也是全局时基(即从中导出所有其他时基的时基)的所有者,则它是全局时间主站。时间网关通常由一个时间主站端口组成,该端口连接到一个或多个时间从站。将时间实体映射到真实 ECU 时,必须注意,一个 ECU 对于一个时基可以是时间主站(甚至全局时间主站),对于另一个时基可以是时间从站。
**图 3:术语示例**(参见原文 PDF 第 17 页)
#### 7.4.1 SYNC 消息处理
**`[SWS_FrTSyn_00018]⌈`** 一个时间同步消息序列由每个时间域的 SYNC 消息组成。`⌋(RS_TS_20043)`
**`[SWS_FrTSyn_00019]⌈`** 对于每个配置的时间主站(`FrTSynGlobalTimeMaster`),FrTSyn 模块应按周期 `FrTSynGlobalTimeTxPeriod`ECUC_FrTSyn_00014)周期性地发送 SYNC 消息,包括将在下一个 FlexRay 周期 0 开始时有效的时间值(见图 4)以及用户数据,前提是 `timeBaseStatus` 中的 `GLOBAL_TIME_BASE` 位已设置且 `FrTSynGlobalTimeTxPeriod` 不等于 0,并且关联的 `cyclicMsgResumeCounter` 未在运行(见 7.4.5)。`⌋(RS_TS_20039, RS_TS_20043)`
**`[SWS_FrTSyn_00021]⌈`** 根据 `FrTSynGlobalTimeTxCrcSecured`ECUC_FrTSyn_00013),SYNC 消息应为以下类型:
| `FrTSynGlobalTimeTxCrcSecured` | 类型 |
|------------------------------|------|
| `CRC_NOT_SUPPORTED` | 0x10SYNC 非 CRC 保护消息 |
| `CRC_SUPPORTED` | 0x20SYNC CRC 保护消息 |
`⌋(RS_TS_20041, RS_TS_20043)`
#### 7.4.2 OFS 消息处理
**`[SWS_FrTSyn_00022]⌈`** 偏移消息序列由每个时间域的 OFS 消息组成。`⌋(RS_TS_20044)`
**`[SWS_FrTSyn_00023]⌈`** 对于每个配置的时间主站(`FrTSynGlobalTimeMaster`),FrTSyn 模块应按周期 `FrTSynGlobalTimeTxPeriod`ECUC_FrTSyn_00014)周期性地发送 OFS 消息,包括偏移时间值和用户数据,前提是 `timeBaseStatus` 中的 `GLOBAL_TIME_BASE` 位已设置且 `FrTSynGlobalTimeTxPeriod` 不等于 0,并且关联的 `cyclicMsgResumeCounter` 未在运行(见 7.4.5)。`⌋(RS_TS_20039, RS_TS_20044)`
**`[SWS_FrTSyn_00025]⌈`** 根据 `FrTSynGlobalTimeTxCrcSecured`ECUC_FrTSyn_00013),OFS 消息应为以下类型:
| `FrTSynGlobalTimeTxCrcSecured` | 类型 |
|------------------------------|------|
| `CRC_NOT_SUPPORTED` | 0x34OFS 非 CRC 保护消息 |
| `CRC_SUPPORTED` | 0x44OFS CRC 保护消息 |
`⌋(RS_TS_20041, RS_TS_20044)`
#### 7.4.3 传输模式
**`[SWS_FrTSyn_00026]⌈`** 如果调用 `FrTSyn_SetTransmissionMode(Controller, Mode)` 且参数 Mode 等于 `FRTSYN_TX_OFF`,则应省略此 FlexRay 通道上来自 FrTSyn 的所有发送请求。`⌋(RS_TS_20039, RS_TS_20043, RS_TS_20044)`
**`[SWS_FrTSyn_00027]⌈`** 如果调用 `FrTSyn_SetTransmissionMode(Controller, Mode)` 且参数 Mode 等于 `FRTSYN_TX_ON`,则此 FlexRay 通道上来自 FrTSyn 的所有发送请求应能够被发送。`⌋(RS_TS_20039, RS_TS_20043, RS_TS_20044)`
#### 7.4.4 去抖时间
**`[SWS_FrTSyn_00084]⌈`** 如果时基的 `FrTSynGlobalTimeDebounceTime`ECUC_FrTSyn_00033)大于 0,则 FrTSyn 应始终对相应的 Timesync PDU 进行去抖,如下所述;否则 FrTSyn 不应进行任何去抖。`⌋(RS_TS_20039)`
**`[SWS_FrTSyn_00085]⌈`** `FrTSynGlobalTimeDebounceTime`ECUC_FrTSyn_00033)表示时基的 `debounceCounter` 的去抖值。FrTSyn 应在为相应时基发送 Timesync PDUSYNC 和 OFS)后重新加载 `debounceCounter`。如果未发送 Timesync PDUFrTSyn 应在每次调用 `FrTSyn_MainFunction()` 时递减 `debounceCounter` 值。`⌋(RS_TS_20039)`
**`[SWS_FrTSyn_00086]⌈`** 仅当相应的 `debounceCounter` 的值小于或等于零时,才应发送新的 Timesync PDU。`⌋(RS_TS_20039)`
#### 7.4.5 立即时间同步
**`[SWS_FrTSyn_00087]⌈`** 在从 StbM 收到全局时间值更新后,FrTSyn 模块应立即触发时间同步消息传输。`⌋(RS_TS_20039)`
**`[SWS_FrTSyn_00088]⌈`** 立即传输触发后,主站应至少等待 `FrTSynGlobalTimeTxPeriod` 时间才能再次发送。`⌋(RS_TS_20039)`
**`[SWS_FrTSyn_00089]⌈`** 立即传输机制可受去抖时间约束。`⌋(RS_TS_20039)`
**`[SWS_FrTSyn_00090]⌈`** 在 `FrTSynGlobalTimeDebounceTime` 间隔内多次触发立即时间同步应启动 `cyclicMsgResumeCounter``⌋(RS_TS_20039)`
#### 7.4.6 时间同步消息的计算和组装
**`[SWS_FrTSyn_00091]⌈`** 主站应使用通过 `StbM_GetCurrentTime` 从 StbM 获取的当前全局时间来组装时间同步消息。`⌋(RS_TS_20039)`
**`[SWS_FrTSyn_00093]⌈`** 序列计数器在每次成功发送 SYNC 消息时递增。`⌋(RS_TS_20039)`
### 7.5 作为时间从站
#### 7.5.1 SYNC 消息处理
**`[SWS_FrTSyn_00041]⌈`** 当从站接收到 SYNC 消息时,它应使用 FlexRay 接收指示机制获取本地时间戳。`⌋(RS_TS_20040, RS_TS_20042, RS_TS_20043)`
**`[SWS_FrTSyn_00042]⌈`** 从站应将 SYNC 消息中的序列计数器与最后接收到的有效序列计数器进行比较以检测丢失的消息。`⌋(RS_TS_20042, RS_TS_20044)`
**`[SWS_FrTSyn_00045]⌈`** 从站应使用接收到的 SYNC 消息中包含的时间信息和当前 FlexRay macrotick 计数器来计算主站时间。`⌋(RS_TS_20040, RS_TS_20042, RS_TS_20043, RS_TS_20044)`
#### 7.5.2 OFS 消息处理
**`[SWS_FrTSyn_00048]⌈`** 从站应使用 OFS 消息来调整本地时间到全局时间。`⌋(RS_TS_20042, RS_TS_20043, RS_TS_20044)`
#### 7.5.3 时间同步消息的验证和分解
**`[SWS_FrTSyn_00054]⌈`** 从站应验证接收到的 SYNC 和 OFS 消息的 CRC(如果配置了 CRC 保护)。`⌋(RS_TS_20042, RS_TS_20043, RS_TS_20044)`
**`[SWS_FrTSyn_00055]⌈`** 从站应验证消息格式、PayloadLength 和时间域。`⌋(RS_TS_20042, RS_TS_20043, RS_TS_20044)`
**`[SWS_FrTSyn_00056]⌈`** 如果验证失败,从站应丢弃该消息并递增错误计数器。`⌋(RS_TS_20043, RS_TS_20044)`
**`[SWS_FrTSyn_00057]⌈`** 如果在配置的超时时间内未接收到 OFS 消息,从站应丢弃相关的 SYNC 消息。`⌋(RS_TS_20042, RS_TS_20043, RS_TS_20044)`
### 7.6 全局时间测量支持
**`[SWS_FrTSyn_00092]⌈`** FrTSyn 模块应提供测量数据以支持全局时间测量。`⌋(RS_TS_00034)`
### 7.7 错误分类
#### 7.7.1 开发错误
| 错误代码 | 描述 |
|---------|------|
| `FRTSYN_E_UNINIT` | API 服务在未初始化状态下被请求 |
| `FRTSYN_E_PARAM` | 传递给 FrTSyn API 的参数无效 |
| `FRTSYN_E_INVALID_PDUID` | 无效的 PDU ID |
| `FRTSYN_E_INIT_FAILED` | FrTSyn_Init 调用失败 |
#### 7.7.2 运行时错误
| 错误代码 | 描述 |
|---------|------|
| `FRTSYN_E_MSG_TIMEOUT` | 消息超时 |
#### 7.7.3 瞬态故障
未定义。
#### 7.7.4 生产错误
未定义。
#### 7.7.5 扩展生产错误
未定义。
---
## 8 API 规范
### 8.1 API
#### 8.1.1 导入类型
`FrTSyn` 模块使用以下导入类型:
- `Std_ReturnType`(来自 `Std_Types.h`
- `StbM_SynchronizedTimeBaseType``StbM_TimeStampType``StbM_UserDataType`(来自 `StbM`
- `FrIf_StateType`(来自 `FrIf`
- `PduInfoType``PduIdType`(来自 `PduR`
#### 8.1.2 类型定义
```c
/* FrTSyn 传输模式 */
typedef enum {
FRTSYN_TX_OFF = 0,
FRTSYN_TX_ON = 1
} FrTSyn_TransmissionModeType;
/* FrTSyn 全局时间状态 */
typedef enum {
FRTSYN_GLOBAL_TIME_BASE_NOT_SET = 0,
FRTSYN_GLOBAL_TIME_BASE_SET = 1
} FrTSyn_GlobalTimeBaseStatusType;
/* FrTSyn 时间域 ID */
typedef uint8 FrTSyn_TimeDomainIdType;
```
#### 8.1.3 函数定义
##### `FrTSyn_Init`
```c
void FrTSyn_Init(
const FrTSyn_ConfigType* ConfigPtr
);
```
初始化 FrTSyn 模块。
##### `FrTSyn_GetVersionInfo`
```c
void FrTSyn_GetVersionInfo(
Std_VersionInfoType* VersionInfo
);
```
返回 FrTSyn 模块的版本信息。
##### `FrTSyn_SetTransmissionMode`
```c
void FrTSyn_SetTransmissionMode(
uint8 Controller,
FrTSyn_TransmissionModeType Mode
);
```
设置时间主站/时间网关的传输模式。
##### `FrTSyn_MainFunction`
```c
void FrTSyn_MainFunction(
void
);
```
由调度程序周期性调用的主函数。
#### 8.1.4 回调通知
##### `FrTSyn_RxIndication`
```c
void FrTSyn_RxIndication(
PduIdType RxPduId,
const PduInfoType* PduInfoPtr
);
```
从 FrIf 模块接收到消息的回调指示。
##### `FrTSyn_TriggerTransmit`
```c
Std_ReturnType FrTSyn_TriggerTransmit(
PduIdType TxPduId,
PduInfoType* PduInfoPtr
);
```
从 FrIf 模块请求发送数据时调用的回调。
##### `FrTSyn_TxConfirmation`
```c
void FrTSyn_TxConfirmation(
PduIdType TxPduId
);
```
来自 FrIf 模块的消息发送确认回调。
#### 8.1.5 计划函数
##### `FrTSyn_MainFunction`
请参见上文 8.1.3。
#### 8.1.6 预期接口
| API | 描述 |
|-----|------|
| `StbM_GetCurrentVirtualLocalTime` | 获取当前虚拟本地时间 |
| `StbM_GetCurrentTime` | 获取当前时间 |
| `StbM_BusGetCurrentTime` | 获取总线的当前时间 |
| `StbM_BusSetGlobalTime` | 设置总线的全局时间 |
| `StbM_GetTimeBaseStatus` | 获取时基状态 |
| `StbM_GetOffset` | 获取时基偏移 |
| `StbM_GetTimeBaseUpdateCounter` | 获取时基更新计数器 |
| `FrIf_GetGlobalTime` | 获取 FlexRay 全局时间 |
| `FrIf_GetState` | 获取 FlexRay 接口状态 |
| `FrIf_GetMacrotickDuration` | 获取 macrotick 持续时间 |
| `FrIf_GetCycleLength` | 获取周期长度 |
| `FrIf_Transmit` | 通过 FlexRay 接口发送消息 |
| `Crc_CalculateCRC8H2F` | 计算 CRC8H2F |
| `Det_ReportError` | 报告开发错误 |
| `BswM_FrTSyn_TransmissionModeChange` | 通知 BswM 传输模式变更(可选) |
---
## 9 时序图
### 9.1 FlexRay 时间同步(时间主站)
主站时序:
1. 主站通过 `FrIf_GetGlobalTime()` 获取当前 FlexRay 时间
2. 主站计算下一个周期 0 开始时将有效的时间
3. 主站组装 SYNC 消息
4. 主站通过 `FrIf_TriggerTransmit()` / `FrIf_Transmit()` 发送 SYNC 消息
5. 同样组装并发送 OFS 消息
**图 4:时间主站时序**(参见原文 PDF 第 37 页)
### 9.2 FlexRay 时间同步(时间从站)
从站时序:
1. 从站通过 `FrIf_RxIndication()` 接收到 SYNC 消息
2. 从站验证消息
3. 从站使用 SYNC 消息中的时间值和当前 FlexRay macrotick 计数器计算主站时间
4. 从站接收 OFS 消息(如果存在)以调整本地时间
5. 从站通过 `StbM_BusSetGlobalTime()` 将全局时间提供给 StbM
**图 5:时间从站时序**(参见原文 PDF 第 38 页)
---
## 10 配置规范
### 10.1 如何阅读本章
本章使用以下符号:
- `<``>` 之间的内容是配置参数的占位符
- `[ ... ]` 表示可选元素
- 详细说明使用表格
### 10.2 容器和配置参数
#### 10.2.1 变体
`FrTSyn` 模块支持以下配置变体:
- `FrTSynGlobalTimeMaster`(时间主站变体)
- `FrTSynGlobalTimeSlave`(时间从站变体)
#### 10.2.2 `FrTSyn`(模块)
| 配置项 | 类型 | 描述 |
|--------|------|------|
| `FrTSynGeneral` | 容器 | 通用配置参数 |
| `FrTSynGlobalTimeDomain` | 容器(多) | 全局时间域配置 |
| `FrTSynGlobalTimeMaster` | 容器 | 时间主站配置(条件性) |
| `FrTSynGlobalTimeSlave` | 容器 | 时间从站配置(条件性) |
#### 10.2.3 `FrTSynGeneral`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `FrTSynDevErrorDetect` | Boolean | 启用/禁用开发错误检测 |
| `FrTSynVersionInfoApi` | Boolean | 启用 `FrTSyn_GetVersionInfo` API |
| `FrTSynMainFunctionPeriod` | Float | 主函数周期 |
| `FrTSynDebounceTimeMax` | Float | 去抖时间最大值 |
#### 10.2.4 `FrTSynGlobalTimeDomain`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `FrTSynSynchronizedTimeBaseRef` | Reference | 引用的同步时基 |
| `FrTSynGlobalTimeTxPeriod` | Float | 时间同步消息的传输周期(秒),0 = 不传输 |
| `FrTSynGlobalTimeDebounceTime` | Float | 两次传输之间的去抖时间(秒) |
| `FrTSynGlobalTimeFollowUpTimeout` | Float | 等待后续消息的超时时间(秒) |
| `FrTSynGlobalTimeCrcSupport` | Boolean | 支持 CRC 保护的时间同步消息 |
#### 10.2.5 `FrTSynGlobalTimeSyncDataIDList`
包含 SYNC 消息的 DataID 列表。
#### 10.2.6 `FrTSynGlobalTimeSyncDataIDListElement`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `FrTSynGlobalTimeSyncDataIDValue` | Integer | SYNC DataID 值 |
| `FrTSynGlobalTimeSyncDataIDLength` | Integer | DataID 长度(位) |
#### 10.2.7 `FrTSynGlobalTimeOfsDataIDList`
包含 OFS 消息的 DataID 列表。
#### 10.2.8 `FrTSynGlobalTimeOfsDataIDListElement`
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `FrTSynGlobalTimeOfsDataIDValue` | Integer | OFS DataID 值 |
| `FrTSynGlobalTimeOfsDataIDLength` | Integer | DataID 长度(位) |
#### 10.2.9 `FrTSynGlobalTimeMaster`
时间主站的配置。
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `FrTSynGlobalTimeMasterId` | Integer | 时间主站 ID |
| `FrTSynGlobalTimeTxCrcSecured` | Boolean | 主站是否发送 CRC 保护的消息 |
| `FrTSynGlobalTimeTxCrcValidated` | Boolean | 主站是否验证 CRC |
| `FrTSynImmediateTimeSync` | Boolean | 启用立即时间同步 |
| `FrTSynCyclicMsgResumeCounter` | Integer | 立即同步的循环消息恢复计数器(消息数) |
#### 10.2.10 `FrTSynGlobalTimeMasterPdu`
时间主站使用的 PDU 配置。
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `FrTSynGlobalTimePduRef` | Reference | 全局时间 PDU 引用 |
| `FrTSynPduDirection` | Enum | PDU 方向(发送/接收) |
#### 10.2.11 `FrTSynGlobalTimeSlave`
时间从站的配置。
| 配置参数 | 类型 | 描述 |
|---------|------|------|
| `FrTSynGlobalTimeRxCrcValidated` | Boolean | 从站是否验证 CRC |
| `FrTSynGlobalTimeRxCrcSecured` | Boolean | 从站是否仅接受 CRC 保护的消息 |
| `FrTSynGlobalTimeSyncCounterLimit` | Integer | 序列计数器跳过的最大数量 |
#### 10.2.12 `FrTSynGlobalTimeSlavePdu`
时间从站使用的 PDU 配置(与主站 PDU 配置类似)。
### 10.3 发布的信息
`FrTSyn` 模块不发布任何其他信息到外部模块。
---
## 翻译说明
- **文档类型**SWSSoftware Specification)— 软件规范
- **原文页数**60 页
- **翻译范围**:完整翻译了所有章节标题、消息格式、API、配置容器结构
- **保留内容**:所有需求 ID(如 `SWS_FrTSyn_xxxxx`)、技术术语、API 标识符、`⌈⌋` 方框符、文档交叉引用
- **未翻译**:版权声明
- **详细的错误处理流程、状态机转换**请参考原文 PDF 第 19-29 页