# 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 | • 修改以增强全局时间同步的精度
• 其他次要更正/澄清/编辑修改 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | • 更正和澄清如何应用速率校正
• 阐明 Time Base Status 和 Time Leap 行为 | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | • 新增速率校正
• 新增时间精度测量支持
• 新增时间/状态通知机制
• 各种增强和更正 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | • 为 `StbM_Init` 添加配置参数参数
• `StbM_TimeStampRawType` 改为 uint32
• `StbM_BusSetGlobalTime` 允许 `userDataPtr` 为 NULL
• 为通过指针传递的输入参数添加 `const`
• 调试支持标记为过时 | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | • 纳入"全局时间同步"概念以替换(并改进)原始功能并支持新功能,例如:
 – 支持 CAN 和以太网
 – 支持网关以启用跨多个总线的时域
• 由于缺陷,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`
• 删除需求 `StbM_0030` 和 `00035`
• 关于服务接口的章节重组和澄清
• 参数 `StbMFlexRayClusterRef` / `StbMTtcanClusterRef` 标记为过时
• 编辑性变更 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | • 新增"已知限制"
• 消除错误处理中的矛盾
• 新增服务接口章节
• 根据新的 SWS_BSWGeneral 重新设计 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | • 新增绝对时间提供功能 | | 2010-09-30 | 3.1.5 | AUTOSAR Administration | • SRS_General:SRS_BSW_00004
• SWS 文档中提到的标准化 AUTOSAR 接口的绑定特性
• 缺少的 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 Manager,StbM)模块的功能、API 和配置。 同步时基管理器的目的是向其客户提供同步时基,即与分布式系统其他节点上的时基同步的时基。 ### 1.1 用例 同步时基管理器支持两个主要用例: #### a) RunnableEntity 的同步 任意数量的 RunnableEntity 必须同步执行。"同步"意味着它们应以定义良好且有保证的相对偏移开始(例如相对偏移"0"表示应在同一时间点执行)。 此类需求可以由 AUTOSAR Timing Extensions [10] 指定,并且必须独立于软件组件的实际部署来满足。 此用例的典型示例是不同 RunnableEntity 的传感器数据读出或同步执行器触发。 #### b) 提供绝对时间值 应用(和其他 BSW 模块)应提供一个中央模块,负责提供关于绝对时间和时间流逝的信息。 此用例的典型示例包括: - **传感器数据融合**:可以时间相关来自各种传感器系统(如雷达或立体多用途相机)的数据 - **事件数据记录**:在某些情况下(如碰撞),需要存储关于不同 ECU 事件和内部状态的数据。为了对这些事件和状态进行时间相关,需要一个公共时基 - **诊断事件存储的同步日历时间访问** ### 1.2 功能概述 **图 1:作为代理的同步时基管理器**(参见原文 PDF 第 9 页) 同步时基管理器本身不提供网络时间协议或时间协商协议来将其(本地)时基与在其他节点上的时基同步。它与 BSW 的 `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(时基提供程序) 通过特定于总线的通信提供来自其他节点的时基的模块,例如 `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 ECU(Timesync ECU) 参与时间同步的 ECU。 #### 2.2.16 Timesync Module(Timesync 模块) `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 同步 - **`TSyn` 模块**(如 `CanTSyn`、`FrTSyn`、`EthTSyn`)— 时基提供程序 - **BswM**(基础软件模式管理器)— 模式管理 - **DET**(默认错误追踪器)— 开发错误报告 - **EcuM**(ECU 状态管理器)— 初始化和关闭 **图 2:StbM 模块依赖关系**(参见原文 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]⌈`** 全局时间主站应在设置全局时间后立即通知 `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 应通知所有已配置的 `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 进行版本检查。 --- --- ## 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` | 来自 `TSyn` 模块的接口 | | `BusSetGlobalTime` | 来自 `TSyn` 模块的接口 | | `BusGetCurrentTime` | 来自 `TSyn` 模块的接口 | | `GetTimeBaseStatus` | 来自 `TSyn` 模块的接口 | | `GetOffset` | 来自 `TSyn` 模块的接口 | | `GetTimeBaseUpdateCounter` | 来自 `TSyn` 模块的接口 | | `GetCurrentTime` | 来自 `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**:从客户接收的端口 --- --- ## 9 时序图 ### 9.1 StbM 初始化 ``` EcuM -> StbM_Init StbM -> StbM: 初始化内部状态 StbM -> BswM: 通知初始化完成 ``` **图 3:StbM 初始化**(参见原文 PDF 第 124 页) ### 9.2 立即时间同步 ``` Customer -> StbM: StbM_SetGlobalTime StbM -> StbM: 更新时基 StbM -> TSyn: 通知立即传输 TSyn -> Bus: 发送时间消息 ``` **图 4:立即时间同步**(参见原文 PDF 第 125 页) ### 9.3 OS ScheduleTable 显式同步 ``` OS -> StbM: StbM_GetCurrentTime StbM -> OS: 返回当前时间 OS -> OS: 调整 ScheduleTable ``` **图 5:OS 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 不适用的需求 无。 --- ## 翻译说明 - **文档类型**:SWS(Software Specification)— 软件规范 - **原文页数**:151 页 - **翻译范围**:完整翻译了所有章节标题、核心概念、关键 API、配置容器结构、关键 SWS 需求 - **保留内容**:所有需求 ID(如 `SWS_StbM_xxxxx`)、技术术语、API 标识符、`⌈⌋` 方框符、文档交叉引用 - **未翻译**:版权声明 - **详细的时间校正算法、状态机转换、错误处理完整流程、配置容器的所有参数详细说明**请参考原文 PDF 第 35-150 页