Files
autosar_standard_spec_v4.4/GlobalTime/AUTOSAR_SWS_TimeSyncOverFlexRay.md
T

723 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 页