AUTOSAR_SWS_DiagnosticCommunicationManager-2

7 Functional specification

7.3 Diagnostic Session Layer (DSL)

7.3.1 Introduction

DSL模块的功能详细参考ISO14229-1 [2]和ISO15765-3 [4]。

7.3.2 Use cases

7.3.3 Interaction with other modules

与DSL子模块交互的模块有以下几个:
PduR 模块
PduRDSL提供诊断请求的数据。
在诊断请求的响应准备好后,将由DSL触发PduR发送诊断响应。
DSD 子模块
PduR提供的诊断请求的数据转发给DSD
在诊断请求的响应准备好后,将由DSD通知DSL发送诊断响应。
SW-Cs / DSP 子模块
DSL提供安全和会话状态的访问通道。
ComM 模块
DSL通过ComM管理诊断的通信状态等。

7.3.4 Functional description

7.3.4.1 Overview

DSL模块提供的功能有以下几个:

请求处理:
转发请求: 从PduR接收诊断请求并转发至DSD
并发"TesterPresent": 保持会话活跃(Keep-Alive Logic)。
响应处理
转发响应:将 DSD生成的诊断响应转发至PduR
响应时序保证: 确保响应时序。
周期性传输支持: 支持定期数据传输机制。
事件触发响应支持: 实现ResponseOnEvent (ROE) 数据传输。
分段响应支持: 分段响应。
应用触发响应挂起: 支持Application触发的ResponsePending响应。
安全级别管理:
安全管理: 控制并维护诊断安全等级。
会话状态管理:
会话状态控制: 管理会话开启、关闭等状态。
非默认会话追踪: 记录并管理非默认会话状态。
时序调整: 允许修改会话相关的定时参数。
诊断协议处理:
协议处理: 支持多种诊断协议的解析与处理。
资源管理: 合理调配诊断过程中所需资源。
通信模式管理:
模式切换: 控制全通信/静默通信/无通信模式(Full- / Silent- / No Communication)。
诊断状态指示: 标记诊断活动或非活动状态。
传输控制: 启用或禁用所有诊断数据传输功能。

7.3.4.2 Forward requests from the PduR module to the DSD submodule

graph TD Start(PDUR接收到诊断请求<br>DcmRxPduId收到请求内容) SecondRequestCheck1{当前有无请求处理?} SecondRequestCheck2{DcmDslDiagRespOnSecondDeclinedRequest==Ture?} ConnectionCheck{新请求使用了不同的DcmDslConnection?<br>且新的请求的优先度与当前处理请求相同或者更低<br>且处于非默认会话状态} DcmStart(PDUR调用Dcm_StartOfReception<br>参数包含需要Dcm接收的Sdu数据长度以及首帧或者单帧数据) Check{Check缓冲区大小和服务可用性?} Reject(拒绝接收请求) Copy(PDUR调用Dcm_CopyRxData<br>将数据拷贝进DCM的缓冲区) Finish(PDUR调用Dcm_TpRxIndication<br>通知DCM接收已完成) Store(DCM存储PDU寻址信息) DSD(转发至DSD, 同时DcmPduId被锁定<br>相同的DcmDslConnection的后续请求不会被接受<br>并发的TesterPresent requests-0x78除外) Address(用于后续响应时准确发送到对应的请求地址<br>同时追踪同一地址的后续请求) Release(PDUR调用Dcm_TpTxConfirmation) BufferOverflow(缓冲区溢出) Start --> DcmStart DcmStart -->SecondRequestCheck1 SecondRequestCheck1 --> |当前没有其他请求在处理| Check SecondRequestCheck1 --> |当前有其他请求在处理| ConnectionCheck ConnectionCheck --> |使用了不同的通道|SecondRequestCheck2 ConnectionCheck --> |使用了相同的通道| y(Dcm_StartOfReception<br>返回BUFREQ_E_NOT_OK) SecondRequestCheck2 --> |判断成立<br>Dcm_StartOfReception<br>返回BUFREQ_OK| x(由于当前有请求正在处理<br>这里DCM会回复响应: NRC 0x21) SecondRequestCheck2 --> |判断不成立<br>Dcm_StartOfReception<br>返回BUFREQ_E_NOT_OK| z(拒绝接受请求) Check --> |缓冲区足够且服务可用<br>Dcm_StartOfReception<br>返回BUFREQ_OK| Copy Check --> |Dcm_StartOfReception<br>返回BUFREQ_E_OVFL| BufferOverflow BufferOverflow --> Reject Check --> |服务不可用| Reject Check --> |缓冲区足够且服务可用<br>Dcm_StartOfReception<br>返回BUFREQ_OK| Store Store --> Address Copy --> Finish Finish -->|Dcm_TpRxIndication<br>参数Result = E_OK| DSD DSD -->|响应发送成功| Release Release -->|Dcm_TpTxConfirmation<br>参数Result = E_OK| END(DcmPduId被释放)
※Note:
新请求的优先度更高时,是否会直接直接抢占?
以下是诊断通信用到的几种PDU (DcmDslConnection配置相关?)
OBD DcmRxPduId
OBD DcmTxPduId
UDS phys DcmRxPduId
UDS func DcmRxPduId
UDS DcmTxPduId

通过配置DcmDslProtocolRx容器中的DcmDslProtocolRxAddrTypeDCM_FUNCTIONAL_TYPE或者DCM_PHYSICAL_TYPE
并且每个通道分配适当的DcmDslProtocolRxPduId,就可以实现物理寻址和功能寻址的设定。

7.3.4.2.1 Dcm_StartOfReception

参照流程图

※Note1:
当有请求在处理中时,如果收到了来自外部的TesterPresent诊断请求,无论与正在处理的请求是否源自同一通道,都会被接受(Dcm_StartOfReception返回BUFREQ_OK),但是都不会进行处理(即:不进行S3Server timer的重制)。
※Note2:
Dcm_StartOfReception()可以在中断中调用。
※Note3:
Dcm_StartOfReception()的参数 TpSduLength等于0,函数也会返回BUFREQ_E_NOT_OK,不会再进行下一步的处理。
7.3.4.2.2 Dcm_CopyRxData
※Note1
Dcm_CopyRxData被调用且参数SduLength为0时,函数也会返回BUFREQ_OK,并且通过bufferSizePtr返回当前Dcm的接收缓冲区的剩余大小==
根据前面的Dcm_StartOfReception的说明,当该函数的参数TpSduLength等于0时,会返回BUFREQ_E_NOT_OK,并且不会进行进一步的处理,这是否意味着当TpSduLength等于0这种情况发生时,根本不存在进行下一步的Dcm_CopyRxData调用?
猜测:Dcm_CopyRxData可能不仅在接受请求数据时调用,或者是为了保证Dcm_CopyRxData函数的兼容性。
※Note2:
Dcm_StartOfReception取得Dcm接收缓冲区指针到Dcm_TpRxIndication 被调用的时间内,是数据拷贝阶段,这段时间内,Dcm模块不能访问Dcm缓冲区。
※Note3:
Dcm_CopyRxData可以在中断中调用。
7.3.4.2.3 Dcm_TpRxIndication
※Note1:
Dcm_TpRxIndication被调用且参数Std_ReturnType result不是E_OK时,Dcm模块将不对接收该PduIdType id数据的缓冲区域进行进一步的评估(如计算剩余size等),因为接收的数据无法确认是有效还是无效的,防止引发其他错误。
※Note2:
Dcm_StartOfReception取得Dcm接收缓冲区指针到Dcm_TpRxIndication 被调用的时间内,是数据拷贝阶段,这段时间内,Dcm模块不能访问Dcm缓冲区。
※Note3:
Dcm_TpRxIndication可以在中断中调用

7.3.4.3 Concurrent ”TesterPresent” (”keep alive logic”)

graph TD A[PduR调用Dcm_TpRxIndication<br>参数Result=E_OK] --> B{是否为TesterPresent请求?} B -- 不是 --> C[转发到DSD做进一步处理] B -- 是 --> D{suppressPosRspMsgIndicationBit==TRUE?} D -- 不是 --> C[转发到DSD做进一步处理] D -- 是 --> E[重置S3Server会话计时器] E --> F[不转发到DSD模]
※Note1:
不同于前面的正常的诊断请求的接收流程,对于服务SID 0x3E的keep-alive logic请求使用独立的DcmRxPduId,并且缓冲区也由Dcm模块内部直接给定,不需要显式的配置。
※Note2:
该服务的DcmRxPduId(UDS func DcmRxPduId)也属于物理寻址的DcmDslConnection,也正因为有独立的处理过程,所以对于积极响应抑制位为TRUE的情况,不影响其他的物理寻址请求。
7.3.4.3.1 Dcm_CopyTxData

※Note1:
:如果 PduR_DcmTransmit()中请求发送的数据长度大于已经被Dcm_CopyTxData拷贝到发送缓冲区的数据长度,那么说明发送缓冲区的长度不足以容纳请求的数据,在当前发送缓冲区的数据发送成功后,PDUR会继续调用Dcm_CopyTxData拷贝后续数据。

posted @ 2024-06-01 12:04  元子难挣  阅读(261)  评论(0)    收藏  举报