AUTOSAR_SWS_LINStateManager
Specification of LIN State Manager
简介和功能概述
该规范规定了 AUTOSAR 基础软件模块 LIN 状态管理器 (LinSM) 的功能、API 和配置。LinSM 与 LIN 接口、LIN 驱动程序和 LIN 收发器驱动程序共同构成了完整的 LIN 协议。
LIN 状态管理器被设计为独立于硬件。
LinSM 依赖于上层模块通信管理器 [1] (ComM) 和下层模块 LIN 接口 [2] (LinIf)。
本文档假设读者熟悉 ISO 17987 规范。本文档不会描述 ISO 17987 规范中已描述的功能。
架构概述
分层软件架构 [3] 将 LinSM 定位在 BSW 架构中,如下所示。
功能概述
LinSM 负责 LIN 总线的控制流。这意味着:
- 当上层请求切换调度表时(仅适用于 LIN 主节点)。
- 当上层请求进入休眠或唤醒,或下层指示进入休眠或唤醒时的处理。
- 当切换状态时,通知上层。
首字母缩略词和缩写
以下为在本文档中被使用的首字母缩略词和缩写。其他缩写可在 ISO 17987 规范中被找到。
输入文件和相关标准及规范
[1] Specification of Communication Manager
- AUTOSAR_SWS_COMManager.pdf
[2] Specification of LIN Interface
- AUTOSAR_SWS_LINInterface.pdf
[3] List of Basic Software Modules
- AUTOSAR_TR_BSWModuleList.pdf
[4] General Specification of Basic Software Modules
- AUTOSAR_SWS_BSWGeneral.pdf
[5] Specification of LIN Driver
- AUTOSAR_SWS_LINDriver.pdf
[6] Specification of Default Error Tracer
- AUTOSAR_SWS_DefaultErrorTracer.pdf
[7] Specification of Diagnostic Event Manager
- AUTOSAR_SWS_DiagnosticEventManager.pdf
[8] Specification of Basic Software Mode Manager
- AUTOSAR_SWS_BSWModeManager.pdf
[9] General Requirements on Basic Software Modules
- AUTOSAR_SRS_BSWGeneral.pdf
[10] Requirements on LIN
- AUTOSAR_SRS_LIN.pdf
[11] Layered Software Architecture
- AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[12] Specification of Standard Types
- AUTOSAR_SWS_StandardTypes.pdf
相关规范
AUTOSAR 提供了基础软件模块的通用规范 [4],该规范也适用于 LIN 状态管理器。
因此,该规范被视为 LIN 状态管理器的附加和必需规范。
约束和假设
限制
每个 ECU 中最多只有一个 LinSM 实例。如果底层 LIN 驱动程序 [5] 支持多个网络,则 LinSM 将在多个集群中作为 LIN 主节点或 LIN 从节点。
所有对调度表(切换)的引用仅适用于 LIN 主节点。
对于汽车领域的适用性
该规范适用于所有使用 LIN 的汽车领域。
对其他模块的依赖
本节描述了 LinSM 与基础软件中其他模块之间的关系,并描述了这些模块所使用的服务。图 5.1 显示了实现 LinSM 模块所必需的或可选的模块,该图不应被视为需求。
为了使 LinSM 模块能够运行,将与以下模块进行连接:
[SWS_LinSM_00001]
[SRS_BSW_00384]
- LIN 接口 - LinIf
[SWS_LinSM_00085]
[SRS_BSW_00384]
- 诊断事件管理器 - DEM
[SWS_LinSM_00086]
[SRS_BSW_00384]
- 默认错误追踪器 - DET
[SWS_LinSM_00105]
[SRS_BSW_00384]
- 通信管理器 - ComM
[SWS_LinSM_00196]
[SRS_BSW_00384]
- BSW 模式管理器 - BswM
请注意,使用此模块的接口(回调除外)的模块在此未被列出。
原则上,不存在特定模块必须调用 LinSM 模块的接口的要求。以下列出了 LinSM 模块的常规用户。
OS
LinSM 模块中确实存在对与上层或下层模块共享的数据的访问(使用 API),对共享数据的完整性(一致性)的保护无需 OS 的帮助(没有按数组的形式进行的访问,只有按简单数据类型的形式进行的访问)。但是,在 LinSM 模块中可能存在访问相同数据的可重入函数,由此导致的访问问题由实现者自行解决。
DET
模块 DET [6] 的 Det_ReportError 函数将在开发错误或运行时错误出现时被调用。
DEM
产品错误将被报告给诊断事件管理器模块 [7]。
ComM
ComM 模块通过 LIN 协议栈请求通信并查询 LinSM 模块的状态。
BswM
当状态发生变化时,LinSM 模块将通知 BswM 模块 [8]。BswM 模块在请求新的调度表时,将与 LinSM 模块进行交互(仅适用于 LIN 主节点)。
与下层模块的关系
以下是 LinSM 模块连接到的模块。
LinIf
LinSM 模块假定 LinIf 模块 [2] 提供以下原语:
- LinIf_GotoSleep
- 传输(发送)进入休眠命令(仅适用于 LIN 主节点)并将下层设置为休眠模式 (LinIf_GotoSleep)。
- LinIf_Wakeup
- LIN 总线唤醒。
- LinIf_ScheduleRequest
- 请求切换调度表(仅适用于 LIN 主节点)。
假定 LinIf 模块将调用以下回调函数:
- LinSM_WakeupConfirmation
- 确认已进入运行模式,无论是否传输唤醒帧。
- LinSM_GotoSleepConfirmation
- 确认已进入休眠模式,在传输(发送)进入休眠命令后(LIN 主节点),或在接收到进入休眠命令或检测到总线空闲后(LIN 从节点)。
- LinSM_ScheduleRequestConfirmation
- 确认调度表切换完成(仅适用于 LIN 主节点)。
[SWS_LinSM_00002]
[ ]
- LinSM 模块不得使用或访问 LIN 驱动程序,也不得通过以上接口函数获取有关它的信息,LinIf 模块提供的信息除外。
文件结构
代码文件结构
本章介绍实现 LinSM 模块的配置的 C 文件。本规范并未完整定义代码文件结构。缺失的结构细节由实现者自行设计。
预编译和链接时的配置参数必须被保存在单独的文件中:
头文件结构
本章介绍 LinSM 模块和可能的其他模块将包含的头文件。
LinSM 头文件
LinSM 的实现中将存在以下头文件:
[SWS_LinSM_00005]
[ ]
- LinSM 的实现应提供一个头文件 LinSM.h,其中包含 LinSM 提供的所有数据 - API 声明(回调除外)、数据类型和全局数据。
包含的头文件
应包含以下外部头文件:
[SWS_LinSM_00013]
[ ]
- LinSM 模块应包含 ComM.h。
[SWS_LinSM_00201]
[ ]
- LinSM 模块应包含 BswM_LinSM.h。
[SWS_LinSM_00305]
[ ]
- LinSM 模块应包含 ComM_BusSM.h。
[SWS_LinSM_00208]
[SRS_BSW_00004]
- LinSM 模块应通过检查头文件和代码文件的版本号来确保模块的完整性(一致性)。
需求可追溯性
下表引用了 [9] 和 [10] 中规定的要求,并提供了这些要求的实现链接。请注意,如果某个特定要求的“满足”列为空,则表示本文档未满足该要求。
本章规定了 LinSM 模块的要求。有关 LinSM 职责的概述,请参阅基础软件模块文档 [11]。LinSM 的主要职责包括:
- 控制所有 LIN 网络的通信状态(无通信或完全通信)。
- 处理切换调度表的请求(仅适用于 LIN 主节点)。
- 处理切换通信模式的请求。
- 通知上层有关状态的变化。
LinSM 模块不会直接实现 LIN 规范中的功能。LinSM 模块将支持 ISO 17987 规范中定义的行为。LinSM 模块兼容现存的基于 LIN 1.3、2.0、2.1、2.2 和 ISO 17987 规范的 LIN 节点。
[SWS_LinSM_00019]
[ ]
- LinSM 模块应能够处理一个或多个 LIN 网络。
支持的 LIN 网络的数量受 LinIf 规范限制。所有网络均通过 ComM 模块指定的 NetworkHandleType 进行处理。
对 LIN 网络的标识是通过在配置中对 ComM 网络句柄的引用来实现的。
LinSM 状态机的状态及状态变化
LinSM 模块将运行在状态机中。每个已连接的网络将运行在独立的子状态机中。图 7.1 和图 7.2 显示了以下需求的简化版本,这些图的目的并非完善需求,仅提供一个概述。
[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 模块的初始状态。
[SWS_LinSM_00022]
[ ]
- 应该有一个名为 LINSM_UNINIT 的状态。
[SWS_LinSM_00161]
[ ]
- 启动时,在调用任何 API 之前,LinSM 模块应处于 LINSM_UNINIT 状态。
LINSM_INIT
初始化完成后,LinSM 模块将处于 LINSM_INIT 状态。此状态包含两个子状态,一个是 LINSM_NO_COM 状态,此时在 LIN 总线上不存在任何通信。另一个是 LINSM_FULL_COM 状态,此时所有通信均在进行,并且对于 LIN 主节点,调度表处于活动状态。每个已连接的网络将分别处于 LINSM_NO_COM 或 LINSM_FULL_COM 状态。
[SWS_LinSM_00024]
[ ]
- 应该有一个名为 LINSM_INIT 的状态。
[SWS_LinSM_00025]
[ ]
- 当调用 LinSM_Init 时,LinSM 应从其他状态切换到 LINSM_INIT 状态。
[SWS_LinSM_00152]
[ ]
- 当调用 LinSM_Init 时,LinSM 的子状态机应从其它状态切换到 LINSM_NO_COM 状态。
[SWS_LinSM_00043]
[ ]
- 当进入 LINSM_INIT 状态时,LinSM 应处于初始化状态。初始化状态意味着全局变量等应被设置为默认值。
[SWS_LinSM_00160]
[ ]
- 当调用 LinSM_Init 时,将进入 LINSM_INIT 状态,对于所有已连接的网络,(与其对应的)子状态机应处于 LINSM_NO_COM 状态。
[SWS_LinSM_00216]
[ ]
- LinSM_Init 函数应将每个已配置的通道的调度类型设置为 NULL_SCHEDULE。此要求仅适用于 LIN 主节点。
为了使 LinSM 独立于 LinIf 模块,LinSM 模块在 LinSM_Init 函数中不应调用 LinIf 模块。因此,对 LinSM_Init 有额外的要求,参见 8.3.1。
LINSM_NO_COM
在初始化后,以及当 ComM 模块请求无通信(LIN 主节点)或 LinIf 指示总线休眠事件(LIN 从节点)时,LinSM 应处于 LINSM_NO_COM 状态。
[SWS_LinSM_00026]
[ ]
- LINSM_INIT 状态中应有一个名为 LINSM_NO_COM 的子状态。
[SWS_LinSM_00027]
[ ]
- 当进入 LINSM_NO_COM 状态时,LinSM 模块应使用参数 COMM_NO_COMMUNICATION 调用 ComM_BusSM_ModeIndication 函数,以通知 ComM 有关特定的网络的状态的变化([SWS_LinSM_00166] 除外)。
[SWS_LinSM_00193]
[ ]
- 当进入 LINSM_NO_COM 状态时,LinSM 模块应使用参数 LINSM_NO_COM 调用 BswM_LinSM_CurrentState 函数,以通知 BswM 有关特定的网络的状态的变化([SWS_LinSM_00166] 除外)。
上述两个要求有一个例外。其理由是,在执行 LinSM_Init 函数时,ComM 可能尚未被初始化。
[SWS_LinSM_00166]
[ ]
- 当调用 LinSM_Init 而进入 LINSM_NO_COM 状态时,LinSM 模块不应通知其他模块有关状态的变化。即在 LinSM_Init 函数中既不应调用 ComM_BusSM_ModeIndication 也不应调用 BswM_LinSM_Current State。
[SWS_LinSM_00028]
[ ]
- 当处于 LINSM_NO_COM 状态时,LinSM 模块不应请求 LinIf 模块与所选网络进行通信,即总线应保持静默。
注意:
进入或退出 LINSM_NO_COM 状态时,LinSM 模块不会将硬件接口或 MCU 的电源模式设置为新的模式。这不属于 LinSM 的职责范围。
[SWS_LinSM_00203]
[ ]
- 当进入 LINSM_NO_COM 状态时,如果设置了 LinSMTransceiverPassiveMode 参数,则应调用 LinIf_SetTrcvMode 函数将收发器设置为 STANDBY 模式,否则,应设置为 SLEEP 模式。此要求仅在通道的 LinSMTransceiverPassiveMode 参数被配置时适用。
[SWS_LinSM_00204]
[ ]
- 不应在函数 LinSM_Init 中调用 LinIf_SetTrcvMode。
注意:
无需在函数 LinSM_Init 中设置(收发器的)模式,因为收发器会在其初始化函数中设置其模式。具体被设置的模式取决于收发器的配置。
LINSM_FULL_COM
只有当处于 LINSM_FULL_COM 状态时,LIN 总线上的通信才被允许进行。每个网络将分别进入或退出此状态。以下所有要求均适用于每个网络。
[SWS_LinSM_00032]
[ ]
- 当处于 LINSM_INIT 状态时,每个网络都应有一个名为 LINSM_FULL_COM 的子状态。
[SWS_LinSM_00033]
[ ]
- 当进入 LINSM_FULL_COM 状态时,LinSM 模块应使用参数 COMM_FULL_COMMUNICATION 调用 ComM_BusSM_ModeIndication 函数,以通知 ComM 有关特定的网络的状态的变化。
[SWS_LinSM_00192]
[ ]
- 当进入 LINSM_FULL_COM 状态时,LinSM 模块应使用参数 LINSM_FULL_COM 调用 BswM_LinSM_CurrentState 函数,以通知 BswM 有关特定的网络的状态的变化。
[SWS_LinSM_00205]
[ ]
- 当进入 LINSM_FULL_COM 状态时,应使用 LinIf_SetTrcvMode 将收发器设置为活动状态。此要求仅在通道的 LinSMTransceiverPassiveMode 参数被配置时适用。
[SWS_LinSM_00301]
[ ]
- 当进入 LINSM_FULL_COM 时,子状态机将进入 LINSM_RUN_COMMUNICATION 状态。
进入休眠流程
主节点和从节点中的进入休眠 (goto-sleep) 流程有所不同。
在主节点中,当 ComM 模块请求进入无通信模式时,LinSM 将请求在 LIN 总线上发送进入休眠 (goto-sleep) 命令。
在从节点中,LIN 接口会向 LinSM 指示总线休眠事件,在总线上接收到进入休眠 (goto-sleep) 命令或检测到总线空闲状态都会引发该事件。如果 ComM 模块之前已请求进入 LINSM_NO_COM 状态,则总线休眠事件将被传递给 ComM。否则,如果 ComM 模块请求进入 LINSM_FULL_COM 状态,则总线休眠事件不会被传递给 ComM,但在进入休眠 (goto-sleep) 流程完成后,LinSM 会重新启动唤醒流程。
在所有情况下,进入 LINSM_NO_COM 状态都会通知 BswM 和 ComM。即使出现问题,回调也会被调用。
[SWS_LinSM_00035]
[ ]
- 当处于 LINSM_FULL_COM 状态时,如果子状态机处于 LINSM_RUN_COMMUNICATION 状态,LinSM 模块将调用 LinIf_GotoSleep。
[SWS_LinSM_00046]
[ ]
- 当调用 LinSM_GotoSleepConfirmation 时,如果当前状态为 LINSM_FULL_COM 且子状态为 LINSM_GOTOSLEEP,则 LinSM 应将状态设置为 LINSM_NO_COM,无论“success”参数取何值。在任何其他状态下,LinSM_GotoSleepConfirmation 都应被忽略。
[SWS_LinSM_00302]
[ ]
- 如果 LinIf_GotoSleep 返回 E_OK,则 LinSM 将设置子状态机为 LINSM_GOTOSLEEP。
主节点中的进入休眠流程
本章仅适用于 LIN 主节点。
[SWS_LinSM_10208]
[ ]
- 如果处于 LINSM_FULL_COM 状态,则当 ComM 请求 COMM_NO_COMMUNICATION 时,LinSM 应调用 LinIf_GotoSleep 在被请求的网络上传输进入休眠 (goto-sleep)命令。
[SWS_LinSM_10209]
[ ]
- 在 [SWS_LinSM_10208] 中的所有其他情况下,不应调用 LinIf_Goto Sleep。
[SWS_LinSM_00036]
[ ]
- 如果 ComM 模块调用 LinSM_RequestComMode 请求进入 COMM_NO_COMMUNICATION 模式,则 LinSM 模块应直接(而不是等待主函数的下一次调用)在被请求的网络上调用函数 LinIf_GotoSleep。
[SWS_LinSM_00177]
[ ]
- 如果 LinIf_GotoSleep 返回 E_NOT_OK,则 LinSM_RequestComMode 应返回 E_NOT_OK。如果在 LinSM_RequestComMode 中 LinSM 模块的返回值为 E_NOT_OK,则应设置相同的状态(以便 ComM_BusSM_ModeIndication 和 BswM_LinSM_CurrentState 被调用)。
从节点中的进入休眠流程
本章仅适用于 LIN 从节点。
[SWS_LinSM_00230]
[ ]
- 如果处于 LINSM_FULL_COM 状态,则当 ComM 请求 COMM_NO_COMMUNICATION 时,LinSM 应保存所请求的通信模式并返回 E_OK 且无需采取进一步操作。
[SWS_LinSM_00231]
[ ]
- 当调用 LinSM_GotoSleepIndication 时,如果当前状态为 LINSM_FULL_COM,则 LinSM 模块应直接(而不是等待主函数的下一次调用)在被请求的网络上调用函数 LinIf_GotoSleep。
[SWS_LinSM_00232]
[ ]
- 在 [SWS_LinSM_00231] 中的所有其他情况下,不应调用 LinIf_Goto Sleep。
[SWS_LinSM_00233]
[ ]
- 如果处于 LINSM_FULL_COM 状态,则当 ComM 请求 COMM_NO_COMMUNICATION 时,LinIf 应调用 LinIf_GotoSleep,然后调用 ComM_BusSM_BusSleepMode 以通知 ComM 有关特定网络上的总线休眠事件。
[SWS_LinSM_00234]
[ ]
- 在 [SWS_LinSM_00046] 的情况下,如果 ComM 请求的模式是 COMM_FULL_COMMUNICATION,则 LinSM 应重新启动唤醒流程。
切换调度表(仅主节点)
本章仅适用于 LIN 主节点。
[SWS_LinSM_00079]
[ ]
- 当调用 LinSM_ScheduleRequest 时,LinSM 模块应调用 LinIf_ScheduleRequest 将请求传递(而不是等待主函数的下一次调用)给 LinIf 模块。
[SWS_LinSM_00168]
[ ]
- 当 LinSM 在 LinSM_ScheduleRequest 中调用 LinIf_ScheduleRequest 时,它应将 LinIf_ScheduleRequest 的返回值作为 LinSM_ScheduleRequest 的返回值。
[SWS_LinSM_00213]
[ ]
- 如果 LinIf_ScheduleRequest 返回 E_NOT_OK,则 LinSM 模块应在主函数的下一次调用中使用旧的调度表调用 BswM_LinSM_CurrentSchedule。
[SWS_LinSM_00206]
[ ]
- 当 LinIf 模块向 LinSM 模块确认有关对调度表的设置时,如果定时器未发生超时,则应调用 BswM_LinSM_CurrentSchedule。
[SWS_LinSM_00214]
[ ]
- 如果定时器发生超时,LinSM 模块应使用旧的调度表调用 BswM_LinSM_CurrentSchedule 函数。请注意,LinIf 在进入休眠状态时会将调度表切换为 NULL,此时会调用切换调度表的回调。
[SWS_LinSM_00207]
[ ]
- 如果 LinIf 确认了对调度表的切换,且事先没有请求新的调度表,则应调用 BswM_LinSM_CurrentSchedule。
唤醒流程
如果 ComM 模块通过调用 LinSM_RequestComMode 请求唤醒,或者 LIN 节点在网络上发送唤醒信号,LIN 网络将被唤醒。集群发起的唤醒不由 LinSM 模块处理,而是由 EcuM 模块处理,这将导致与 ComM 请求唤醒一样的效果。在这两种情况下,ComM 都会请求 LinSM 模块在特定网络的上进行通信。
如果 LinIf 已处于唤醒状态(由于 LIN 节点唤醒了总线),LinIf 将忽略该唤醒请求。
[SWS_LinSM_00047]
[ ]
- 如果 ComM 请求 COMM_FULL_COMMUNICATION,LinSM 应直接调用 LinIf_Wakeup(而不是等待主函数的下一次调用)在被请求的网络上传输唤醒信号,[SWS_LinSM_00237] 的情况除外。
[SWS_LinSM_00178]
[ ]
- 在 [SWS_LinSM_00047] 中的所有其他情况下,LinSM 模块不得调用 LinIf_Wakeup。
[SWS_LinSM_00049]
[ ]
- 当 LinIf 通知关于对唤醒信号的发送成功(success = true)时,LinSM 的状态应被设置为 LINSM_FULL_COM。
[SWS_LinSM_00202]
[ ]
- 在 [SWS_LinSM_00049] 中的所有其他情况下,LinSM 的状态应被设置为与请求之前的状态相同的状态(以便调用 BswM 和 ComM 的模式指示回调)。
[SWS_LinSM_00176]
[ ]
- 如果 LinIf_Wakeup 返回 E_NOT_OK,则 LinSM_RequestComMode 将直接返回 E_NOT_OK,而无需采取进一步操作。
请求超时处理
适用于 LIN 主节点:
调用 LinIf_GotoSleep、LinIf_Wakeup 或 LinIf_ScheduleRequest 后,LinSM 模块将等待 LinIf 模块确认“对进入休眠状态的命令的传输(发送)”、“总线上的唤醒”或“对调度表的切换”。有一种可能性是确认未被接收到,因此 LinSM 模块将一直等待。导致这种情况的唯一原因是软件问题,即总线事件或类似事件不会导致这种问题。
适用于 LIN 从节点:
调用 LinIf_GotoSleep 或 LinIf_Wakeup 后,LinSM 模块将等待 LinIf 模块确认“进入休眠模式”或“对唤醒信号的传输(发送)”。有一种可能性是确认未被接收到,因此 LinSM 模块将一直等待。
丢失对“进入休眠模式”的确认的唯一原因是软件问题,即总线事件或类似事件不会导致这种问题。
丢失对“对唤醒信号的传输(发送)”的确认的原因可能是软件问题,也可能是总线故障或主节点的问题。从节点不像主节点那样在“对唤醒信号的传输(发送)”后立即确认总线被唤醒,而是在接收到来自主节点的第一个 LIN 报头后才确认。如果通信未被启动,LIN 从节点应最多重复传输(发送)三次唤醒请求。在(失败地)重复传输三次唤醒请求后,在重新启动唤醒流程前,节点应等待一段最小时间。
[SWS_LinSM_00175]
[ ]
- 每个网络都应有一个请求定时器。各个网络的定时器应独立于彼此。
[SWS_LinSM_00162]
[ ]
- 对 LinSM 模块使用的所有请求定时器的处理(倒计时和到期)应在 LinSM_MainFunction 中被完成。
[SWS_LinSM_00159]
[ ]
- 所有请求定时器的超时时间都应为 LinSM_MainFunction 的周期的整数倍(即 LinSM_MainFunction 的周期 * m,m 为大于 0 的整数)。
[SWS_LinSM_00100]
[ ]
- 在 LinSM 调用 LinIf_GotoSleep、LinIf_Wakeup 或 LinIf_ScheduleRequest 之前,LinSM 模块应启动一个计时器。
[SWS_LinSM_00101]
[ ]
- 当定时器发生超时,定时器的值将大于配置参数 LinSMConfirmationTimeout 时。
[SWS_LinSM_00154]
[ ]
- 如果 LinIf 模块在定时器发生超时之前调用确认回调,则定时器应停止。
[SWS_LinSM_00102]
[ ]
- 当定时器发生超时时,应向 DET 模块报告错误代码 LINSM_E_CONFIRMATION_TIMEOUT。
[SWS_LinSM_00170]
[ ]
- 如果请求定时器已发生超时(即模块 LinIf 未在超时时间内调用通知回调)并且已达到最大重试次数,则在 LinIf_Wakeup 请求的情况下,LinSM 模块应用相同的状态通知 ComM 模块。
[SWS_LinSM_00215]
[ ]
- 如果请求定时器已发生超时(即模块 LinIf 未在超时时间内调用通知回调)并且已达到最大重试次数,则在 LinIf_Wakeup 请求的情况下,LinSM 模块应用相同的状态通知 BswM 模块。
如果不需要超时监控,则将超时监控实现为可选功能可以优化 LinSM 模块的实现大小:
[SWS_LinSM_00103]
[ ]
- 如果配置参数 LinSMConfirmationTimeout 被设置为零,则不使用定时器,因此不会发生超时。这意味着 [SWS_LinSM_00102]、[SWS_LinSM_00170] 和 [SWS_LinSM_00215] 将不会发生。
[SWS_LinSM_00172]
[ ]
- 如果 LinIf 模块在定时器发生超时后调用确认回调,则不会向 ComM 模块发出通知,即忽略该确认回调。
[SWS_LinSM_00304]
[ ]
- 如果对 LinIf_Wakeup 的请求发生超时且未达到最大重试次数(LinSMModeRequestRepetitionMax),则会再次尝试该请求。
[SWS_LinSM_00307]
[ ]
- 如果已达到最大重试次数(LinSMModeRequestRepetitionMax),则仅在 [SWS_LinSM_00170] 和 [SWS_LinSM_00215] 的情况下对 LinIf_Wakeup 请求进行超时监控。
从节点中的重复唤醒
本章仅适用于 LIN 从节点。
[SWS_LinSM_00235]
[ ]
- 对于 [SWS_LinSM_00307],LinSM 应启动唤醒后(总线)静默的定时器,其重装载值由配置参数 LinSMSilenceAfterWakeupTimeout 给出。
[SWS_LinSM_00236]
[ ]
- 如果唤醒后(总线)静默发生超时,并且 ComM 模块请求的通信模式是 COMM_FULL_COMMUNICATION,则 LinSM 应重新启动唤醒流程。
[SWS_LinSM_00237]
[ ]
- 如果唤醒后(总线)静默定时器正在运行,并且 ComM 请求的通信模式是 COMM_FULL_COMMUNICATION,则 LinSM 应延迟对 LinIf_Wakeup 的调用,直到唤醒后(总线)静默定时器发生超时(另请参阅 [SWS_LinSM_00047])。
对多网络和多驱动程序的处理
通常,ECU 中只需一个 LIN 模块(支持多个网络)即可处理所有 LIN 网络。然而,在极少数情况下,ECU 的某些硬件配置会包含不同的 LIN 硬件(例如,高级 LIN 控制器和 UART)。在这种情况下,需要多个不同的 LIN 驱动程序。这不会影响 LinSM 模块,因为 LIN 驱动程序仅与 LinIf 模块连接。
LinSM 仅处理网络,并不关心网络映射到哪个驱动程序,这将由 LinIf 处理。
多网络
每个网络在 LinSM 配置中都有一个唯一的网络索引 (LinSMComMNetworkHandleRef)。
配置参数 LinSMComMNetworkHandleRef 直接引用 ComM 模块的配置。这意味着在与 LinIf 模块连接时,LinSM 模块无需将网络索引与网络进行映射。网络索引可以被直接用于 LinIf 模块 API。
[SWS_LinSM_00164]
[ ]
- 当与 LinIf 模块连接时(当需要以 LIN 网络作为参数时),LinSM 模块应使用通过 API 接收到的相同的 NetworkHandle 值。
错误分类
《基础软件模块通用规范》文档的“错误处理”部分详细描述了对基础软件的错误的处理。首先,它构成了一个分类方案,其中包含 BSW 模块中可能出现的五种错误类型。
在此基础上,下一节将具体说明每种错误,并其分别列于以下各个小节中。
开发错误
[SWS_LinSM_00053]
[ ]
[SWS_LinSM_00224]
[ ]
API 规范
导入的类型
标准类型
本章列出了以下模块包含的所有数据类型。AUTOSAR 标准数据类型在 AUTOSAR 标准数据类型规范文档 [12] 中被定义。
LinSM 模块使用以下数据类型:
[SWS_LinSM_00219]
[ ]
类型定义
以下为由 LinSM 模块定义的数据类型:
LinSM_ModeType
[SWS_LinSM_00220]
[ ]
LinSM_ConfigType
[SWS_LinSM_00221]
[ ]
LinSM API
这是提供给上层模块的 API 的列表。
LinSM_Init
[SWS_LinSM_00155]
[SRS_BSW_00101]
[SRS_BSW_00358]
[SRS_BSW_00414]
[SWS_LinSM_00151]
[ ]
- 不得在 LinSM_Init 函数中调用其他 LinSM API 或其他模块(例如 LinIf)的 API。因为此时其他模块可能未被初始化。
LinSM_ScheduleRequest
LinSM_ScheduleRequest 服务仅适用于 LIN 主节点。
[SWS_LinSM_00113]
[SRS_BSW_00369]
[SWS_LinSM_00114]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 network 的值为无效值时,应向 DET 模块报告错误代码 LINSM_E_NONEXISTENT_NETWORK,并返回 E_NOT_OK。
[SWS_LinSM_00115]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 schedule 的值为无效值时,应向 DET 模块报告错误代码 LINSM_E_PARAMETER,并返回 E_NOT_OK。
[SWS_LinSM_00116]
[SRS_BSW_00406]
- 如果启用了 LinSMDevErrorDetect,当当前的状态为 LINSM_UNINIT 时,应向 DET 模块报告错误代码 LINSM_E_UNINIT,并返回 E_NOT_OK。
[SWS_LinSM_00163]
[ ]
- 如果调用 LinSM_ScheduleRequest 函数,并且此时在被请求的网络上存在另一个正在被处理的请求,则 LinSM_ScheduleRequest 应直接返回 E_NOT_OK。
[SWS_LinSM_10211]
[ ]
- 如果调用 LinSM_ScheduleRequest 函数,并且当前的状态不是 LINSM_FULL_COM,则 LinSM_ScheduleRequest 应直接返回 E_NOT_OK。
[SWS_LinSM_00241]
[ ]
- 仅当 LinSM 模块在至少一个通道上被配置为 LIN 主节点时,LinSM_ScheduleRequest 函数才可用。如果在配置中不存在作为 LIN 主节点的通道,则该函数不可用。通道类型由配置参数 LinSMNodeType 进行配置。
LinSM_GetVersionInfo
[SWS_LinSM_00117]
[SRS_BSW_00407]
[SWS_LinSM_00119]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 versioninfo 的值为无效值(例如 NULL)时,应向 DET 模块报告错误代码 LINSM_E_PARAM_POINTER,并返回 E_NOT_OK。
LinSM_GetCurrentComMode
[SWS_LinSM_00122]
[SRS_BSW_00369]
[SWS_LinSM_00123]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 network 的值为无效值时,应向 DET 模块报告错误代码 LINSM_E_NONEXISTENT_NETWORK,并返回 E_NOT_OK。
[SWS_LinSM_00124]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 mode 的值为无效值(例如 NULL)时,应向 DET 模块报告错误代码 LINSM_E_PARAM_POINTER,并返回 E_NOT_OK。
[SWS_LinSM_00125]
[SRS_BSW_00406]
- 如果启用了 LinSMDevErrorDetect,当当前的状态为 LINSM_UNINIT 时,应向 DET 模块报告错误代码 LINSM_E_UNINIT,并返回 E_NOT_OK。
[SWS_LinSM_00180]
[ ]
- 如果当前的状态为 LINSM_NO_COM,则应返回状态 COMM_NO_COMMUNICATION。
[SWS_LinSM_00181]
[ ]
- 如果当前的状态为 LINSM_FULL_COM,则应返回状态 COMM_FULL_COMMUNICATION。
[SWS_LinSM_00182]
[ ]
- 如果当前的状态为 LINSM_UNINIT,则应返回状态 COMM_NO_COMMUNICATION。
注意:
LinSM 模块不使用 COMM_SILENT_COMMUNICATION。
LinSM_RequestComMode
[SWS_LinSM_00126]
[SRS_BSW_00369]
[SWS_LinSM_00127]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 network 的值为无效值时,应向 DET 模块报告错误代码 LINSM_E_NONEXISTENT_NETWORK,并返回 E_NOT_OK。
[SWS_LinSM_00191]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 mode 的值为无效值时,应向 DET 模块报告错误代码 LINSM_E_PARAMETER,并返回 E_NOT_OK。
[SWS_LinSM_00128]
[SRS_BSW_00406]
- 如果启用了 LinSMDevErrorDetect,当当前的状态为 LINSM_UNINIT 时,应向 DET 模块报告错误代码 LINSM_E_UNINIT,并返回 E_NOT_OK。
[SWS_LinSM_00183]
[ ]
- 如果被请求的模式为 COMM_SILENT_COMMUNICATION,则应直接返回 E_NOT_OK 并且不采取任何操作。
[SWS_LinSM_00223]
[ ]
- 如果返回值为 E_OK,则 LinSM_RequestComMode 将保存被请求的模式。当 LinSM_MainFunction 下一次被调用时,将在处理状态机时处理此请求。
注意:
本节中的状态机将引用被保存的请求。
调度函数
本章列出了以固定周期运行的函数。
LinSM_MainFunction
此函数由基础软件调度器模块直接调用。以下函数无返回值、无参数且不可重入。
此函数不依赖于其他模块的主函数,此函数的执行无需考虑其他主函数。但合理地调度不同模块的主函数可以最大限度地减少函数的执行时间的时长和抖动。
[SWS_LinSM_00156]
[SRS_BSW_00373]
提示:
LinSM_MainFunction 函数可能会被其他函数中断。应确保该函数处理的定时器受到保护,以确保其正常地运行(例如,在必要时使用临界区)。
[SWS_LinSM_00157]
[ ]
- LinSM_MainFunction 应处理函数 LinIf_GotoSleep、LinIf_Wakeup 或 LinIf_ScheduleRequest 中的定时器(参见段落)。
LinSM 回调接口
LinSM_ScheduleRequestConfirmation
LinSM_ScheduleRequestConfirmation 仅适用于 LIN 主节点。
[SWS_LinSM_00129]
[ ]
[SWS_LinSM_00130]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 network 的值为无效值时,应向 DET 模块报告错误代码 LINSM_E_NONEXISTENT_NETWORK。
[SWS_LinSM_00131]
[SRS_BSW_00406]
- 如果启用了 LinSMDevErrorDetect,当当前的状态为 LINSM_UNINIT 时,应向 DET 模块报告错误代码 LINSM_E_UNINIT。
[SWS_LinSM_00242]
[ ]
- 仅当 LinSM 模块在至少一个通道上被配置为 LIN 主节点时,回调函数 LinSM_ScheduleRequestConfirmation 才可用。如果在配置中不存在作为 LIN 主节点的通道,则该函数不可用。通道类型由配置参数 LinSMNodeType 进行配置。
LinSM_GotoSleepIndication
LinSM_GotoSleepIndication 仅适用于 LIN 从节点。
[SWS_LinSM_91000]
[ ]
[SWS_LinSM_00239]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 network 的值为无效值时,应向 DET 模块报告错误代码 LINSM_E_NONEXISTENT_NETWORK。
[SWS_LinSM_00240]
[ ]
- 如果启用了 LinSMDevErrorDetect,当当前的状态为 LINSM_UNINIT 时,应向 DET 模块报告错误代码 LINSM_E_UNINIT。
[SWS_LinSM_00243]
[ ]
- 仅当 LinSM 模块在至少一个通道上被配置为 LIN 从节点时,回调函数 LinSM_GotoSleepIndication 才可用。如果在配置中不存在作为 LIN 从节点的通道,则该函数不可用。通道类型由配置参数 LinSMNodeType 进行配置。
LinSM_GotoSleepConfirmation
[SWS_LinSM_00135]
[ ]
[SWS_LinSM_00136]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 network 的值为无效值时,应向 DET 模块报告错误代码 LINSM_E_NONEXISTENT_NETWORK。
[SWS_LinSM_00137]
[SRS_BSW_00406]
- 如果启用了 LinSMDevErrorDetect,当当前的状态为 LINSM_UNINIT 时,应向 DET 模块报告错误代码 LINSM_E_UNINIT。
LinSM_WakeupConfirmation
[SWS_LinSM_00132]
[ ]
[SWS_LinSM_00133]
[ ]
- 如果启用了 LinSMDevErrorDetect,当参数 network 的值为无效值时,应向 DET 模块报告错误代码 LINSM_E_NONEXISTENT_NETWORK。
[SWS_LinSM_00134]
[SRS_BSW_00406]
- 如果启用了 LinSMDevErrorDetect,当当前的状态为 LINSM_UNINIT 时,应向 DET 模块报告错误代码 LINSM_E_UNINIT。
强制接口
本章定义了实现核心功能所需的所有接口。
[SWS_LinSM_00229]
[ ]
可选接口
本章定义了实现模块可选功能所需的所有接口。
[SWS_LinSM_00138]
[ ]
时序图
This chapter will show use-cases for LIN communication and API usage. As the communication is in real-time it is not easy to show the real-time behavior in the UML dynamic diagrams. It is advisable to read the corresponding descriptive text to each UML diagram.
To show the behavior of the modules in the different use-cases, there are local function calls made to show what is done and when to get information. It is not mandatory to use these local functions; they are here just to make the use-cases more understandable.
Note:
All parameters and return types are left out to make the diagrams easier to read and understand. If needed for clarification the parameter value or return value are shown.
Goto-sleep process
Master
This chapter is only applicable for LIN master nodes.
This use-case shows the transition into the LINSM_NO_COM state when the gotosleep command has been sent successfully on the bus.
This chapter is only applicable for LIN slave nodes.
This use-case shows the transition into the LINSM_NO_COM state when the gotosleep command has been received on the bus when no communication is requested.
The Figure 9.3 shows the internal wakeup. A wakeup is requested from module above the LinSM.
This chapter is only applicable for LIN master nodes.
Figure 9.4 shows the use-cases of switching the schedule table when the LinSM accepts the request.
In general, this chapter defines configuration parameters and their clustering into containers.
The chapter 10.3 specifies the structure (containers) and the parameters of the LinSM module.
How to read this chapter
For details refer to the chapter 10.1 "Introduction to configuration specification" in SWS_BSWGeneral.
Containers and configuration parameters
The following chapters summarize all configuration parameters. The detailed meanings of the parameters describe Chapters 7 and Chapter 8.
Example: The LinSM_Configuration is placed in a specific Flash sector. This flash sector may be reflashed after the ECU is placed in the vehicle.
Configuration Tool
A configuration tool will create a configuration structure that is understood by the Lin SM.
[SWS_LinSM_00073]
[SRS_BSW_00167]
- The LinSM module shall not make any consistency check of the configuration in run-time in production software. It may, however, be done if the Development Error Detection is enabled.
LinSM_Configuration
The paragraph defines the LinSM configuration.
评论
发表评论