# LIN 状态管理器规范 (Specification of LIN State Manager) > **AUTOSAR CP Release 4.4.0** > **文档 ID 255: AUTOSAR_SWS_LIN_StateManager** ## 元信息 | 项目 | 内容 | | --- | --- | | 文档标题 | LIN 状态管理器规范 | | 文档所有者 | AUTOSAR | | 文档责任方 | AUTOSAR | | 文档标识号 | 255 | | 文档状态 | Final | | 所属 AUTOSAR 标准 | Classic Platform | | 所属标准版本 | 4.4.0 | ## 文档变更历史 | 日期 | 版本 | 变更方 | 变更说明 | | --- | --- | --- | --- | | 2018-10-31 | 4.4.0 | AUTOSAR Release Management | LIN Slave 支持 (CONC_634);LIN 2.1 引用替换为 ISO 17987:2016 | | 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 修正/澄清/编辑 | | 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 修复 LinSM_ScheduleRequest 时序 | | 2015-07-31 | 4.2.2 | AUTOSAR Release Management | DET 引用更名为"默认错误跟踪器" | | 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 增加 LIN 模式请求重试 | | 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 编辑变更 | | 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 移除过时需求 | | 2013-03-15 | 4.1.1 | AUTOSAR Administration | 调度切换的细化 | | 2011-12-22 | 4.0.3 | AUTOSAR Administration | 重新设计模式管理交互 | | 2010-09-30 | 3.1.5 | AUTOSAR Administration | 加入更多调度同步管理 | | 2010-02-02 | 3.1.4 | AUTOSAR Administration | 与 ComM 集成 | | 2008-08-13 | 3.1.1 | AUTOSAR Administration | 法律声明修订 | | 2007-12-21 | 3.0.1 | AUTOSAR Administration | 初始发布 | --- ## 目录 - [1. 介绍与功能概述](#1-介绍与功能概述) - [2. 缩略语](#2-缩略语) - [3. 相关文档](#3-相关文档) - [4. 约束与假设](#4-约束与假设) - [5. 与其他模块的依赖](#5-与其他模块的依赖) - [6. 需求可追溯性](#6-需求可追溯性) - [7. 功能规范](#7-功能规范) - [8. API 规范](#8-api-规范) - [9. 时序图](#9-时序图) - [10. 配置规范](#10-配置规范) - [11. 不适用需求](#11-不适用需求) --- ## 1. 介绍与功能概述 本文档规定了 AUTOSAR 基础软件模块 **LIN 状态管理器** (LinSM) 的功能、API 和配置。 LinSM 负责 LIN 总线的控制流。 ### 1.1 架构概述 LinSM 位于通信服务层,与 ComM(上层)、LinIf(下层)、BswM 交互。 ### 1.2 功能概述 LinSM 负责: - 当上层请求时切换调度表 (仅 LIN 主节点) - 处理进入睡眠和唤醒(上层请求或下层指示) - 通知上层进入新状态 --- ## 2. 缩略语 | 缩略语 | 描述 | | --- | --- | | API | Application Program Interface | | AUTOSAR | Automotive Open System Architecture | | BSW | Basic Software | | BswM | BSW Mode Manager | | ComM | Communication Manager | | DCM | Diagnostic Communication Manager | | DEM | Diagnostic Event Manager | | DET | Default Error Tracer | | ECU | Electric Control Unit | | ID | Identifier | | ISR | Interrupt Service Routine | | LIN | Local Interconnect Network | | LinIf | LIN Interface | | LinSM | LIN State Manager | | MCAL | Microcontroller Abstraction Layer | | PDU | Protocol Data Unit | | RTE | Run Time Environment | | RX | Receive | | SPAL | Standard Peripheral Abstraction Layer | | SRS | Software Requirement Specification | | SW | Software | | SWS | Software Design Specification | | TP | Transport Protocol | | TX | Transmit | --- ## 3. 相关文档 ### 3.1 输入文档 - [1] List of Basic Software Modules - [2] Layered Software Architecture - [3] General Requirements on Basic Software Modules - [4] Specification of Standard Types - [5] Specification of Default Error Tracer - [6] Requirements on LIN - [7] Specification of LIN Interface - [8] Specification of Diagnostic Event Manager - [9] Specification of ECU Configuration - [10] Specification of LIN Driver - [11] Specification of Communication Manager - [12] Specification of Basic Software Mode Manager - [13] General Specification of Basic Software Modules ### 3.2 相关标准 - [14] ISO 17987:2016 (所有部分) ### 3.3 相关规范 AUTOSAR 提供 SWS BSW General [13],该规范同样适用于 LIN 状态管理器。 --- ## 4. 约束与假设 ### 4.1 限制 每个 ECU 最多一个 LinSM 实例。如底层 LIN 驱动支持多网络,LinSM 可作为多个集群的主或从节点。 所有调度表切换引用仅适用于 LIN 主节点。 ### 4.2 适用车域 适用于所有使用 LIN 的车域。 --- ## 5. 与其他模块的依赖 - **[SWS_LinSM_00001]** ⌈LIN Interface – LinIf⌋ (SRS_BSW_00384) - **[SWS_LinSM_00085]** ⌈Diagnostic Event Manager – DEM⌋ (SRS_BSW_00384) - **[SWS_LinSM_00086]** ⌈Default Error Tracer – DET⌋ (SRS_BSW_00384) - **[SWS_LinSM_00105]** ⌈Communication Manager – ComM⌋ (SRS_BSW_00384) - **[SWS_LinSM_00196]** ⌈BSW Mode Manager - BswM⌋ (SRS_BSW_00384) ### 5.1 上层关系 #### 5.1.1 操作系统 LinSM 内部数据访问无需 OS 保护(仅简单类型访问)。 #### 5.1.2 DET 模块 Det_ReportError 用于上报开发和运行时错误。 #### 5.1.3 DEM 模块 未使用。 #### 5.1.4 ComM 模块 ComM 是 LinSM 的主要客户端。通过 LinSM_RequestComMode 请求通信模式;通过 ComM_BusSM_ModeIndication 反馈模式变化。 #### 5.1.5 BswM 模块 通过 BswM_LinSM_CurrentState 和 BswM_LinSM_CurrentSchedule 通知当前状态。 ### 5.2 下层关系 #### 5.2.1 LinIf 模块 LinSM 调用 LinIf_GotoSleep、LinIf_Wakeup、LinIf_ScheduleRequest、LinIf_SetTrcvMode 控制 LinIf。 ### 5.3 文件结构 LinSM 模块包含 LinSM.h、LinSM_Cfg.h 等头文件。 --- ## 6. 需求可追溯性 | 需求 ID | 描述 | 满足者 | | --- | --- | --- | | SRS_BSW_00101 | BSW 模块应能在独立初始化函数中初始化 | SWS_LinSM_00155 | | SRS_BSW_00373 | main 函数命名约定 | SWS_LinSM_00156 | | SRS_BSW_00384 | BSW 模块需指明所需其他模块 | SWS_LinSM_00001, SWS_LinSM_00085, SWS_LinSM_00086, SWS_LinSM_00105, SWS_LinSM_00196 | | SRS_BSW_00406 | 模块初始化标志 | SWS_LinSM_00116, SWS_LinSM_00125, SWS_LinSM_00128, SWS_LinSM_00131 | | SRS_BSW_00407 | 版本信息读取 | SWS_LinSM_00117 | | SRS_BSW_00414 | init 函数应有配置结构指针 | SWS_LinSM_00155 | | SRS_Lin_01560 | 进入 sleep 时唤醒应返回运行 | SWS_LinSM_00211 | | SRS_Lin_01590 | LIN 从节点配置仅通过主节点调度表 | SWS_LinSM_00211 | > **[摘要]** 完整需求追溯表见原文 PDF 第 16-19 页。 --- ## 7. 功能规范 本章规定 LinSM 模块的需求。 LinSM 的主要职责: - 控制所有 LIN 网络的通信状态(无通信或全通信) - 处理调度表切换请求(仅主节点) - 处理通信模式请求 - 通知上层状态变化 - **[SWS_LinSM_00019]** ⌈LinSM 模块应能处理一个或多个 LIN 网络。⌋ ### 7.1 LinSM 状态机的状态与转换 LinSM 模块按状态机操作。每个连接的网络运行独立的子状态机。 - **[SWS_LinSM_00020]** ⌈LinSM 模块应有一个状态机,包含 LINSM_UNINIT 和 LINSM_INIT 状态。⌋ - **[SWS_LinSM_00173]** ⌈LINSM_INIT 中应为每个网络存在子状态机,包含 LINSM_NO_COM 和 LINSM_FULL_COM。⌋ - **[SWS_LinSM_00021]** ⌈LINSM_INIT 中,每个网络可独立处于 LINSM_NO_COM 或 LINSM_FULL_COM。⌋ #### 主节点状态机 ``` LINSM_UNINIT --LinSM_Init--> LINSM_INIT | LINSM_NO_COM | (reqComMode==FULL_COM) v LINSM_FULL_COM --> LINSM_RUN_COMMUNICATION | (reqComMode==NO_COM) v LINSM_GOTO_SLEEP --> LINSM_NO_COM ``` #### 7.1.1 LINSM_UNINIT - **[SWS_LinSM_00022]** ⌈应有状态 LINSM_UNINIT。⌋ - **[SWS_LinSM_00161]** ⌈启动时 LINSM_UNINIT 处于活动状态。⌋ #### 7.1.2 LINSM_INIT 初始化完成后激活。包含两个子状态:LINSM_NO_COM 和 LINSM_FULL_COM。 - **[SWS_LinSM_00024]** ⌈应有状态 LINSM_INIT。⌋ - **[SWS_LinSM_00025]** ⌈调用 LinSM_Init 时,状态机转换到 LINSM_INIT。⌋ - **[SWS_LinSM_00152]** ⌈调用 LinSM_Init 时,所有网络转换到 LINSM_NO_COM 子状态。⌋ - **[SWS_LinSM_00216]** ⌈LinSM_Init 应为每个配置通道设置 NULL_SCHEDULE 调度类型(仅主节点)。⌋ #### 7.1.3 LINSM_NO_COM - **[SWS_LinSM_00026]** ⌈LINSM_INIT 中应有 LINSM_NO_COM 子状态。⌋ - **[SWS_LinSM_00027]** ⌈进入 LINSM_NO_COM 时,LinSM 应通知 ComM (COMM_NO_COMMUNICATION)。⌋ - **[SWS_LinSM_00193]** ⌈进入 LINSM_NO_COM 时,LinSM 应通知 BswM。⌋ - **[SWS_LinSM_00166]** ⌈LinSM_Init 函数中不应通知状态变化。⌋ - **[SWS_LinSM_00203]** ⌈进入 LINSM_NO_COM 时,如 LinSMTransceiverPassiveMode=true,收发器设为 STANDBY;否则设为 SLEEP。⌋ #### 7.1.4 LINSM_FULL_COM - **[SWS_LinSM_00032]** ⌈LINSM_INIT 中应有 LINSM_FULL_COM 子状态。⌋ - **[SWS_LinSM_00033]** ⌈进入 LINSM_FULL_COM 时,LinSM 应通知 ComM (COMM_FULL_COMMUNICATION)。⌋ - **[SWS_LinSM_00192]** ⌈进入 LINSM_FULL_COM 时,LinSM 应通知 BswM。⌋ - **[SWS_LinSM_00205]** ⌈进入 LINSM_FULL_COM 时,收发器设为活动模式。⌋ - **[SWS_LinSM_00301]** ⌈进入 LINSM_FULL_COM 时,进入子状态 LINSM_RUN_COMMUNICATION。⌋ #### 7.1.5 进入睡眠 (Goto sleep) 进入睡眠序列在主节点和从节点之间不同: - **主节点**:ComM 请求 no communication 时,LinSM 请求在总线发送 goto-sleep 命令。 - **从节点**:LIN 接口指示总线进入睡眠事件(由收到 goto-sleep 命令或检测到总线空闲触发)。 - **[SWS_LinSM_00035]** ⌈LinSM 模块仅在 LINSM_FULL_COM/LINSM_RUN_COMMUNICATION 状态调用 LinIf_GotoSleep。⌋ - **[SWS_LinSM_00046]** ⌈LinSM_GotoSleepConfirmation 调用时,如当前状态为 LINSM_FULL_COM/LINSM_GOTOSLEEP,LinSM 应将状态置为 LINSM_NO_COM(不考虑 success 参数)。⌋ - **[SWS_LinSM_00302]** ⌈如 LinIf_GotoSleep 返回 E_OK,LinSM 进入子状态 LINSM_GOTOSLEEP。⌋ ##### 7.1.5.1 主节点特定的进入睡眠 - **[SWS_LinSM_10208]** ⌈如状态为 LINSM_FULL_COM 且 ComM 请求 COMM_NO_COMMUNICATION,LinSM 应调用 LinIf_GotoSleep 在请求的网络上发送 goto-sleep 命令。⌋ - **[SWS_LinSM_00036]** ⌈ComM 调用 LinSM_RequestComMode 请求 COMM_NO_COMMUNICATION 时,LinSM 应直接调用 LinIf_GotoSleep。⌋ ##### 7.1.5.2 从节点特定的进入睡眠 - **[SWS_LinSM_00230]** ⌈LIN 从节点中,ComM 请求 COMM_NO_COMMUNICATION 时,LinSM 应存储请求模式并返回 E_OK。⌋ - **[SWS_LinSM_00231]** ⌈LinSM_GotoSleepIndication 调用且当前状态为 LINSM_FULL_COM 时,LinSM 应直接调用 LinIf_GotoSleep。⌋ - **[SWS_LinSM_00233]** ⌈成功 goto-sleep 后,LinSM 调用 ComM_BusSM_BusSleepMode 通知 ComM。⌋ #### 7.1.6 切换调度表 (仅主节点) - **[SWS_LinSM_00079]** ⌈调用 LinSM_ScheduleRequest 时,LinSM 应将请求转发至 LinIf (LinIf_ScheduleRequest)。⌋ - **[SWS_LinSM_00168]** ⌈LinSM 应将 LinIf_ScheduleRequest 返回值转发给调用者。⌋ - **[SWS_LinSM_00206]** ⌈LinSM 收到调度表设置确认时,如未超时,应调用 BswM_LinSM_CurrentSchedule。⌋ #### 7.1.7 唤醒过程 LIN 网络可通过 ComM 请求或 LIN 节点发送唤醒信号唤醒。两种情况下 ComM 都请求 full communication。 - **[SWS_LinSM_00047]** ⌈ComM 请求 COMM_FULL_COMMUNICATION 时,LinSM 应直接调用 LinIf_Wakeup。⌋ - **[SWS_LinSM_00049]** ⌈LinIf 通知唤醒成功时,状态置为 LINSM_FULL_COM。⌋ #### 7.1.8 请求超时 - **[SWS_LinSM_00175]** ⌈每个网络应有请求定时器,相互独立。⌋ - **[SWS_LinSM_00100]** ⌈调用 LinIf_GotoSleep、LinIf_Wakeup 或 LinIf_ScheduleRequest 前,启动定时器。⌋ - **[SWS_LinSM_00101]** ⌈定时器超过 LinSMConfirmationTimeout 即发生超时。⌋ - **[SWS_LinSM_00102]** ⌈超时时上报 LINSM_E_CONFIRMATION_TIMEOUT 错误给 DET。⌋ - **[SWS_LinSM_00304]** ⌈LinIf_Wakeup 超时且未达最大重试次数(LinSMModeRequestRepetitionMax)时,重新发送 LinIf_Wakeup。⌋ ##### 7.1.8.1 从节点唤醒重试 - **[SWS_LinSM_00235]** ⌈从节点上,SWS_LinSM_00307 情况下应启动 silence-after-wakeup 定时器。⌋ ### 7.2 错误分类 #### 7.2.1 开发错误 | 错误名 | 错误码 | 含义 | | --- | --- | --- | | LINSM_E_UNINIT | 0x00 | 模块未初始化即调用 | | LINSM_E_ALREADY_INITIALIZED | 0x01 | 模块已初始化时再次调用 Init | | LINSM_E_PARAMETER | 0x02 | 参数无效 | | LINSM_E_PARAMETER_POINTER | 0x03 | NULL 指针 | | LINSM_E_NONEXISTENT_NETWORK | 0x04 | 不存在的网络 ID | #### 7.2.2 运行时错误 | 错误名 | 错误码 | 含义 | | --- | --- | --- | | LINSM_E_CONFIRMATION_TIMEOUT | 0x30 | LinIf 确认超时 | --- ## 8. API 规范 ### 8.1 导入类型 | 模块 | 头文件 | 导入类型 | | --- | --- | --- | | ComM | ComM.h | ComM_ModeType | | ComStack_Types | ComStack_Types.h | NetworkHandleType | | LinIf | LinIf.h | LinIf_SchHandleType | | Std_Types | Std_Types.h | Std_ReturnType, Std_VersionInfoType | ### 8.2 类型定义 #### 8.2.1 LinSM_ConfigType ```c typedef struct LinSM_ConfigType LinSM_ConfigType; ``` LinSM 模块初始化配置数据结构。 #### 8.2.2 LinSM_ModeType ```c typedef enum { LINSM_FULL_COM = 0x00, LINSM_NO_COM = 0x01 } LinSM_ModeType; ``` ### 8.3 函数定义 #### 8.3.1 LinSM_Init ```c void LinSM_Init(const LinSM_ConfigType* ConfigPtr) ``` | 项目 | 内容 | | --- | --- | | Service ID | 0x01 | | Sync/Async | Synchronous | | Reentrancy | Non Reentrant | | 参数 (in) | ConfigPtr — 配置数据指针 | | 描述 | 初始化 LinSM 模块 | - **[SWS_LinSM_00155]** ⌈LinSM_Init 应初始化所有 LinSM 内部变量,所有网络置为 LINSM_NO_COM。⌋ (SRS_BSW_00101) #### 8.3.2 LinSM_GetVersionInfo ```c void LinSM_GetVersionInfo(Std_VersionInfoType* VersionInfo) ``` | Service ID | 0x02 | | --- | --- | | 描述 | 获取模块版本信息 | #### 8.3.3 LinSM_ScheduleRequest ```c Std_ReturnType LinSM_ScheduleRequest( NetworkHandleType network, LinIf_SchHandleType Schedule ) ``` | Service ID | 0x10 | | --- | --- | | Sync/Async | Asynchronous | | 描述 | 请求切换调度表(仅主节点) | #### 8.3.4 LinSM_GetCurrentComMode ```c Std_ReturnType LinSM_GetCurrentComMode( NetworkHandleType network, ComM_ModeType* mode ) ``` | Service ID | 0x11 | | --- | --- | | 描述 | 获取当前通信模式 | #### 8.3.5 LinSM_RequestComMode ```c Std_ReturnType LinSM_RequestComMode( NetworkHandleType network, ComM_ModeType mode ) ``` | Service ID | 0x12 | | --- | --- | | 描述 | ComM 请求通信模式变更 | ### 8.4 回调通知 #### 8.4.1 LinSM_ScheduleRequestConfirmation ```c void LinSM_ScheduleRequestConfirmation( NetworkHandleType network, LinIf_SchHandleType schedule ) ``` LinIf 调度表切换确认。 #### 8.4.2 LinSM_GotoSleepConfirmation ```c void LinSM_GotoSleepConfirmation( NetworkHandleType network, boolean success ) ``` LinIf goto-sleep 命令发送确认。 #### 8.4.3 LinSM_GotoSleepIndication (从节点) ```c void LinSM_GotoSleepIndication(NetworkHandleType network) ``` LinIf 通知总线睡眠事件。 #### 8.4.4 LinSM_WakeupConfirmation ```c void LinSM_WakeupConfirmation( NetworkHandleType network, boolean success ) ``` LinIf 唤醒发送确认。 ### 8.5 调度函数 #### 8.5.1 LinSM_MainFunction ```c void LinSM_MainFunction(void) ``` | 项目 | 内容 | | --- | --- | | Service ID | 0x30 | | 描述 | 主处理函数,处理定时器和状态机 | - **[SWS_LinSM_00156]** ⌈应提供 LinSM_MainFunction 用于定时器处理。⌋ (SRS_BSW_00373) ### 8.6 期望接口 #### 8.6.1 强制接口 - LinIf_GotoSleep - LinIf_Wakeup - LinIf_ScheduleRequest - ComM_BusSM_ModeIndication - BswM_LinSM_CurrentState - BswM_LinSM_CurrentSchedule - Det_ReportRuntimeError #### 8.6.2 可选接口 - Det_ReportError - LinIf_SetTrcvMode - ComM_BusSM_BusSleepMode --- ## 9. 时序图 > **[摘要]** 本章包含初始化、模式请求、调度切换、进入睡眠、唤醒过程的时序图。详细图见原文 PDF 第 36-42 页。 主要场景: - 主节点进入 FULL_COM(ComM 请求 → LinSM_RequestComMode → LinIf_Wakeup → 唤醒确认 → 模式确认) - 主节点进入 NO_COM(ComM 请求 → LinSM_RequestComMode → LinIf_GotoSleep → goto-sleep 确认 → 模式确认) - 主节点调度切换(BswM/上层调用 LinSM_ScheduleRequest → LinIf_ScheduleRequest → 确认) - 从节点 LinIf 指示 bus sleep(LinSM_GotoSleepIndication → 处理) --- ## 10. 配置规范 ### 10.1 如何阅读本章 参考 [ECU Configuration Specification] 文档。 ### 10.2 容器与配置参数 #### 10.2.1 LinSM 根容器。 #### 10.2.2 LinSMConfigSet LinSM 配置集容器。 #### 10.2.3 LinSMChannel LIN 网络配置。 | 参数 | 类型 | 说明 | | --- | --- | --- | | LinSMComMNetworkHandleRef | ref | 引用 ComM 网络句柄 | | LinSMConfirmationTimeout | float | 确认超时(秒) | | LinSMModeRequestRepetitionMax | int | 模式请求最大重试次数 | | LinSMNodeType | enum | LIN_MASTER / LIN_SLAVE | | LinSMSilenceAfterWakeupTimeout | float | 唤醒后静默时间(从节点) | | LinSMTransceiverPassiveMode | bool | 收发器在 NO_COM 时是否进 STANDBY | #### 10.2.4 LinSMSchedule 调度表配置(主节点)。 #### 10.2.5 LinSMGeneral 通用配置(版本 API 启用等)。 ### 10.3 已发布信息 按 BSW General 提供模块版本信息。 --- ## 11. 不适用需求 部分 SRS_BSW 通用需求不在本规范范围内。详见原文 PDF 第 54 页。 --- ## 翻译说明 - 本译本基于 AUTOSAR CP 4.4.0 (2018-10-31) 的 LIN 状态管理器规范 (Document ID 255,共 54 页) - 摘要标记位置: - 第 6 章需求可追溯性表 - 第 9 章时序图 - 第 11 章不适用需求列表