7.3 DSL

7.3诊断会话层 (DSL)

参考

介绍

DSL符合iso14229标准和15765网络独立part;
DSL子模块中没有网络相关的功能区;
在配置中,可以根据网络设置一些参数。

DSL submodule使用场合

会话处理
应用层时间处理
特定响应性行为

与其他模块交互

PduR module:
PduR module提供传入诊断需求数据;
DSL 子模块触发诊断响应的输出。
DSD submodule:
DSL 子模块通知 DSD 子模块传入的请求并提供数据。
DSD 子模块触发诊断响应的输出。
SWCs/DSP module:
DSL 子模块提供对安全性和会话状态。
ComM module:
DSL子模块保证了所需的通信行为通信模块。
p47框图

功能描述

概要

1,请求处理:
将请求从 PduR 模块转发到 DSD 子模块。
并发“TesterPresent”(“保持活动逻辑”)
2,相应处理:
将 DSD 子模块的响应转发到 PduR 模块
支持 ResponseOnEvent (ROE) 传输。
支持分段响应。
支持由应用程序触发的 ResponsePending 响应。
3,安全等级处理:
管理安全级别。
4,会话状态处理:
管理会话状态。
跟踪活动的非默认会话。
允许修改时间。
5,诊断协议处理:
处理不同的诊断协议。
管理资源。
6,通讯方式处理:
处理通信要求(完全/静默/无通信)。
指示活动/非活动诊断。
启用/禁用各种诊断传输。

对上述功能详细阐述P53,对着达芬奇看配置参数
1,请求处理:
将请求从 PduR 模块转发到 DSD 子模块:
  • 每当在分配给 Dcm 模块的 DcmRxPduId 上开始接收新的诊断请求内容时;
  • PduR调用Dcm_StartOfReception,通知Dcm模块接收的数据大小,并提供第一帧或单帧的数据,如果数据规模溢出缓冲区大小,或者请求的服务不可用允许Dcm拒绝接收诊断数据;
  • PduR模块之后调用Dcm_CopyRxData函数请求Dcm模块将数据拷贝到Dcm buffer
    PduR 模块将调用 Dcm_CopyTxData 请求 Dcm 模块提供要传输的数据
  • 如果DCM模块接收诊断请求(Dcm_StartOfReception函数返回成功),PduR模块就会调用Dcm_TpRxIndication Dcm模块一个接收指示。

Dcm 应能够使用通用连接,其中寻址信息由 Dcm_StartOfReception 通过 DcmRxPdu 的元数据提供给 Dcm。必须存储此寻址信息并将其用于响应和检测来自同一测试仪的请求。

  • Dcm_TpRxIndication 返回Result = E_OKDSL 子模块才会将接收到的数据转发DSD 子模块

有一个诊断请求
PduR通知DSL接收数据及其大小【Dcm_StartOfReception】
PduR请求DSL将数据从PudrBuf拷贝到DCMBuf(就是bsw里DcmDslBuffer)【Dcm_CopyRxData】
DSL同意接收诊断请求,PudR知道后让DSL接收数据
DSL接收完数据后转发数据给DSD

并发“TesterPresent”(“保持活动逻辑”)

测试人员有可能与物理请求/响应并行发送功能性“TesterPresent”命令。 这在 ISO14229-1 [2] 中称为“保持活动逻辑”。 该功能性“TesterPresent”将在单独的 DcmRxPduId (UDS funcDcmRxPduId) 上接收,该 DcmRxPduId (UDS funcDcmRxPduId) 与物理请求属于相同的 DcmDslConnection。 在这种情况下,使用了未明确配置的 Dcm 内部接收缓冲区。 由于这个原因,功能 TesterPresent(并且只有功能 TesterPresent 没有响应)以下列方式处理:
当 PduR 模块调用 Dcm_TpRxIndication返回结果为 Result = E_OK, 并且请求是“TesterPresent”时且“suppressPosRspMsgIndicationBit”设置为 TRUE的命令(抑制响应),如:测试者通过物理寻址方式发送0x3E 80诊断请求,则:

  • DSL接收到0x3E 80的请求后需要维持当前的诊断会话不退出(通过重置超时计数器S3Server)。
  • DSL子模块不应将此请求转发给 DSD 子模块;由于绕过了 DSL 子模块中的“TesterPresent”功能,Dcm 模块能够毫无延迟接收和处理下一个物理请求
  • 仅当在“suppressPosRspMsgIndicationBit”设置为 TRUE 的功能地址上接收到测试仪呈现请求时,Dcm 才应将其作为并发请求处理。
2,响应处理:
将 DSD 子模块的响应转发到 PduR 模块

DSD模块准完成诊断响应后会向DSL模块请求发送诊断响应报文。【下面是DSL与pduR之间的过程】PduR模块接收到请求后调用调用PduR_DcmTransmit()函数发送数据,数据发送后,PduR模块调用Dcm_TxConfirmation()函数通知Dcm模块数据发送结果。

  • [SWS_Dcm_00114] DSD 子模块应请求 DSL 子模块传输响应
  • [SWS_Dcm_00115] 当 DcmDslMainConnection 的诊断响应准备好时,DSL 子模块应通过使用相应的 DcmDslProtocolTxPduRef 参数作为 PduId 调用 PduR_DcmTransmit() 来触发将诊断响传输到 PduR 模块
  • [SWS_Dcm_01072] 在 PeriodicTransmission 的情况下,Dcm 应在对 PduR_DcmTransmit() 的调用中提供完整的有效载荷数据,并且不希望对 Dcm_CopyTxData 进行调用。
  • [SWS_Dcm_01073] 在 PeriodicTransmission 【解释:定期传输】的情况下,将调用 Dcm 进行周期性传输,并带有 Dcm_TxConfirmation 以指示传输结果。
    使用 DcmTxPduId 发送响应,它在 Dcm 模块配置中链接到 DcmRxPduId,即接收请求时使用的 ID(请参阅配置参数 DcmDslProtocolTx) 在 PduR_DcmTransmit() 中仅包含长度信息,对于通用连接,还有寻址信息, 被赋予 PduR 模块。在 Dcm 模块成功调用 PduR_DcmTransmit() 后,
    PduR 模块将调用 Dcm_CopyTxData 请求 Dcm 模块提供要传输的数据,并在完整的 PDU 成功传输或发生错误后调用 Dcm_TpTxConfirmation
  • [SWS_Dcm_00117] 如果 DSL 子模块在完整的 Dcm PDU 成功传输后收到确认或调用 Dcm_TpTxConfirmation 发生错误,则 DSL 子模块应将此确认转发给 DSD 子模块。
  • [SWS_Dcm_00118] 如果传输失败(失败的 PduR_DcmTransmit() 请求)或错误确认(Dcm_TpTxConfirmation with error),DSD 子模块不应重复诊断响应传输。
  • 注意:仅当 PduR_DcmTransmit 成功时才需要 Dcm_TpTxConfirmation。
    [SWS_Dcm_01166] d 如果 DcmDslProtocolTx 的 Multiplicity 设置为“0”,则 Dcm
    应处理收到的诊断请求而不发送响应。
通用连接处理

以CAN网络上的通用诊断连接处理为例。CAN网络上的每个ECU节点内部都会记忆两个诊断请求ID,物理寻址请求ID和功能寻址请求ID。

示例:Tester为连接到CAN网络上发送诊断请求的上位机,可发送任意诊断报文。ECU_A本地配置的物理寻址ID为0x728,功能寻址ID为0x7DF。ECU_B本地配置的物理寻址ID为0x72E,功能寻址ID为0x7DF。
Tester发送功能寻址ID为0x7DF的诊断请求时ECU_A和ECU_B都会响应。
Tester发送功能寻址ID为0x7DF的诊断请求时ECU_A和ECU_B都会响应。

Dcm 应该能够处理由 DcmPdus 用类型 SOURCE_ADDRESS_16 和 TARGET_ADDRESS_16 的元数据项标识的通用连接。这些连接在运行时携带实际的测试仪地址。请注意,此地址未提供给应用程序。如果应用程序需要识别不同的测试人员,则必须创建单独的连接。根据 ISO15765-2 [10],IP 诊断和 FlexRay 诊断以及使用普通固定或混合 29 位寻址格式的 CAN 诊断支持通用连接。根据 CAN ID 的实际布局,通用连接也可用于扩展或正常和混合 11 位寻址格式。 Dcm 不知道 CanTp 使用的实际寻址格式。多个连接可能引用相同的 DcmPdus。

  • [SWS_Dcm_CONSTR_6044] 通用连接应一致。这意味着 DcmDslConnection 的所有引用的 PDU(DcmDslProtocolRxPduRef、DcmDslProtocolTxPduRef、DcmDslPeriodicTxPduRef、DcmDslRoeTxPduRef)的 MetaDataItems 和 PduLength 是相同的。
  • [SWS_Dcm_00848] 必须存储通过通用连接接收到的诊断请求的源地址。它在通过 Dcm_StartOfReception 提供的 MetaDataItem SOURCE_ADDRESS_16 中提供。
  • [SWS_Dcm_00849] 通用连接传输的目标地址如果 Dcm 即将为通用连接请求发送响应、事件响应或周期性消息,则 Dcm 应将 TARGET_ADDRESS_16 设置为存储在 MetaDataPtr 中的源地址的值PduR_DcmTransmit()(SRS_Diag_04153)
  • [SWS_Dcm_01429] 通过通用连接接收的诊断请求的源地址应在参数 TesterSourceAddress 中提供给应用程序 [SWS_Dcm_01339]、[SWS_Dcm_01340]、[SWS_Dcm_01341]、
  • [SWS_Dcm_01342]、[SWS_Dcm_00692]、[SWS_Dcm_00694]、[SWS_Dcm_00340]、
    [SWS_Dcm_00698])。
  • [SWS_Dcm_01347] 通过通用连接接收的诊断请求的目标地址可以在 MetaDataItem TARGET_ADDRESS_16 中提供Dcm_StartOfReception()。在这种情况下,Dcm 应忽略目标地址不等于配置的 ECU 地址 DcmDspProtocolEcuAddr 的物理请求。
  • [SWS_Dcm_01348] 通过通用连接传输的响应的源地址可以从配置参数 DcmDsp-ProtocolEcuAddr 中读取。它应提供给元数据中的 PduR_DcmTransmit()数据项 SOURCE_ADDRESS_16,如果为传输 PDU 配置。
  • 注意:如果同一 DcmDslProtocolRow 的某些传输的诊断消息需要不同的源地址,则可以从 PDU 中省略 MetaDataItem SOURCE_ADDRESS_16,然后可以在较低层中配置地址。 物理请求也是如此,其中 TARGET_ADDRESS_16 可以从 PDU 中省略。
发送Busy响应来保证诊断时序

上位机发送诊断请求后会要求ECU在一个最大响应时间(一般是50ms)发出响应报文,但是对于一些请求的处理,ECU内部会耗时比较长(比如0x2E写NVM的请求),来不及在规定时间发出响应。这个时候ECU可以发送0x78(Pending)的否定响应吗来通知上位机ECU内部繁忙(Busy),需要上位机等待(Pending,一版Pending时间可以设置为1秒)。上位机收到0x78(Pending)的否定响应码后就会等待,直到ECU发出积极响应或者Pending时间超时。这个发送Bussy响应来保证诊断时序的功能由DSL模块实现。

[SWS_Dcm_00024] 如果应用程序(或 DSP 子模块)能够执行请求诊断任务,但需要额外的时间来完成任务并准备响应,则 DSL 子模块应在达到响应时间(DcmDspSessionP2ServerMax-DcmTimStrP2ServerAdjust 分别为 DcmDspSessionP2StarServerMax -DcmTimStrP2StarServerAdjust)发送 NRC 0x78(响应未决)的否定响应。
[SWS_Dcm_00024] 基本原理:DSL 子模块保证对测试仪的响应时间。
[SWS_Dcm_00119] DSL 子模块应根据 [SWS_Dcm_00024] 中的要求从单独的缓冲区发送否定响应
[SWS_Dcm_00119] 的基本原理:这是必要的,以避免覆盖正在进行的请求处理,例如应用程序已经在诊断缓冲区中准备了响应内容。一个诊断请求的 NRC 0x78(响应等待)的否定响应数量受配置参数 DcmDslDiagRespMaxNumRespPend 的限制。这避免了应用程序中的死锁。

支持周期性传输。

UDS提供的“ReadDataByPeriodicIdentifier (0x2A)”服务,用于向由一个或多个periodicDataIdentifiers标识的ECU请求定期传输数据记录值。实际项目中没有用到过。

UDS 服务 ReadDataByPeriodicIdentifier (0x2A) 允许测试仪从一个或多个周期性数据标识符标识的 ECU 请求定期传输数据记录值。

  • [SWS_Dcm_00122] Dcm 模块应使用单独的协议和可配置大小的单独缓冲区发送周期性传输的响应。DcmDslPeriodicTransmissionConRef 配置参数允许将用于接收周期性传输请求/传输周期性传输响应的协议链接到用于传输周期性传输消息的协议。请注意,可以将多个 DcmTxPduId 分配给周期性传输协议。 Dcm 模块根据通信模式有几个限制:
  • [SWS_Dcm_00123]定期传输通信只能在完全通信模式下进行。不处于完全通信模式时,可能会发生周期性传输事件。所以存在以下要求:
  • [SWS_Dcm_00125] Dcm 模块应丢弃除完全通信模式之外的周期性传输事件,并且不应将其排队等待传输。
  • [SWS_Dcm_00126] 周期性传输事件不应激活完全通信模式。
支持 ResponseOnEvent (ROE) 传输。----还没看

通过UDS Service ResponseOnEvent (0x86),测试人员可以请求ECU启动或停止传输由指定事件发起的响应。当注册一个事件进行传输时,测试者也指定相应的服务来响应(例如:UDS service ReadDataByIdentifier 0x22)。实际项目中没有用到过。

  • [SWS_Dcm_00595] ROE 功能仅在容器 DcmDslResponseOnEvent 存在时启用。
支持分段响应(分页缓冲区)—没看懂。

通过UDS Service ResponseOnEvent (0x86),测试人员可以请求ECU启动或停止传输由指定事件发起的响应。当注册一个事件进行传输时,测试者也指定相应的服务来响应(例如:UDS service ReadDataByIdentifier 0x22)。实际项目中没有用到过。

当Dcm模块调用一个操作并得到一个错误状态DCM_E_FORCE_RCRRP时,DSL子模块将触发NRC 0x78(响应等待)的负响应传输。这个响应需要从一个单独的缓冲区发送,以避免覆盖正在进行的请求处理。

  • [SWS_Dcm_00028]如果启用 (DcmPagedBufferEnabled=TRUE),Dcm 模块应提供一种机制来发送大于配置和分配的诊断缓冲区的响应。
  • [SWS_Dcm_CONSTR_6055] DcmDslProtocolMaximumResponseSize 的依赖性 DcmDslProtocolMaximumResponseSize 仅在以下情况下才存在
    DcmPagedBufferEnabled 设置为 TRUE。
  • [SWS_Dcm_01058] 如果 DcmPagedBufferEnabled == TRUE 并且生成的请求响应长于 DcmDslProtocolMaximumResponseSize,则 Dcm 应以 NRC 0x14 (DCM_E_RESPONSETOOLONG) 进行响应。
  • [SWS_Dcm_01059] 如果 DcmPagedBufferEnabled == FALSE 并且生成的请求响应长于 Dcm_MsgContextType 结构元素 res-MaxDataLen,则 Dcm 应以 NRC 0x14 (DCM_E_RESPONSETOOLONG) 响应

使用分页缓冲区处理,ECU 不会被迫提供与响应的最大长度一样大的缓冲区。请注意
分页缓冲区处理仅用于传输 - 不支持接收。
分页缓冲区处理不适用于应用程序(仅限 DCM 内部使用)。

  • [SWS_Dcm_01186]Dcm 应提供 TP 请求的正确数据量,或者在请求的数据量不可用的情况下返回 BUFREQ_E_BUSY。
  • 注意:如果请求的数据量不可用,Dcm 应立即填满分页缓冲区。
支持由应用程序触发的 ResponsePending 响应。

在某些情况下,例如 在例程执行的情况下,应用程序需要立即请求一个 NRC 0x78(响应等待),它应该立即发送,而不仅仅是在到达响应时间(P2ServerMax 分别为 P2*ServerMax)之发送。当 Dcm 模块调用操作并获取 错误状态 DCM_E_FORCE_RCRRP,DSL 子模块将触发带有 NRC 0x78(响应未决)的否定响应的传输。 此响应需要从单独的缓冲区发送,以避免覆盖正在进行的请求处理

3,安全等级处理:-----两个字目录没仔细看

安全等级理解:DCM模块的每个诊断服务可以配置安全访问等级,一般有无需通过安全访问、需要通过安全等级1访问、需要通过安全等级2访问三种等级。比如对于0x2E下的服务都设定为需要过安全访问等级1后,我们在请求0x2E的服务时需要通过特定的安全校验后才能通过安全访问等级1,这样才能得到0x2E服务的积极响应。
DLS子模块应该保存当前激活安全等级状态。DLS模块提供两个接口用来设置和获取当前安全等级:
获取当前激活的安全等级: Dcm_GetSecurityLevel
设置新的安全等级: DslInternal_SetSecurityLevel()
DCM模块初始化完后,安全等级设置为0x00(DCM_SEC_LEV_LOCKED,使能了安全访问功能)。
如果我们通过安全校验算法后后使得安全等级不为0,当发生以下任意事件后,安全等级状态将回到初始状态0x00(即启用安全性)(DCM_SEC_LEV_LOCKED):
1)诊断会话从非默认会话切换到非默认会话,包括从当前非默认会话切换到自己本身(当前切换到当前和当前切换到其他—非默认会话)。
2)诊断会话从非默认会话切换到默认会话。由 UDS 服务 DiagnosticSessionControl(0x10) 或 S3Server 超时启动)。一次只能激活一个安全级别。

  • [SWS_Dcm_01329] 在每次安全级别更改时,Dcm 都应使用新的安全级别更ModeDeclarationGroup DcmSecurityAccess。

7.3.4.11.1 初始化序列
[SWS_Dcm_01154] 在初始化时,对于每个 DcmDspSecurityAttemptCounterEnabled 配置参数设置为 TRUE 的 DcmDspSecurityRow 条目,应调用相应的 Xxx_GetSecurityAttemptCounter 以获得每个这些 DcmDspSecurityRow 条目的 AttemptCounter 的值。
[SWS_Dcm_01156] 如果 Xxx_GetSecurityAttemptCounter 已返回 E_NOT_OK,则尝试计数器应设置为相应安全级别的 DcmDspSecurityNumAttDelay 中配置的值。
[SWS_Dcm_01351] d 如果有任何 Xxx_GetSecurityAttemptCounter 操作
返回 DCM_E_PENDING 值,Dcm 应中断调用 Xxx_GetSecurityAttemptCounter() 以便在下一个 Dcm_MainFunction() 周期内恢复此调用链。
注意:当这些值存储在某些特定的非易失性存储器中时,可能会出现这种情况。
[SWS_Dcm_CONSTR_6076] 仅当 DcmDspSecurityUsePort 设置为 USE_ASYNCH_FNC 和 DcmDspSecurityAttemptCounterEnabled 时,DcmDspSecurityGetAttempt-CounterFnc 的依赖关系才应存在
设置为 TRUE。
[SWS_Dcm_01352] 如果第一次调用 DcmDspSecurityMaxAttemptCounterReadoutTime 中配置的 Dcm_MainFunction() 后的延迟有
已到达且尚未调用所有 Xxx_GetSecurityAttemptCounter(即,一个操作在前一个 Dcm_MainFunction() 循环中返回了 DCM_E_PENDING 状态),挂起的操作应通过调用 OpStatus 设置为 DCM_CANCEL 来取消。
[SWS_Dcm_01353] 在 [SWS_Dcm_01352] 的条件下,剩余安全级别的 AttemptCounters(尚未通过调用其 Xxx_GetSecurityAttemptCounter 获得)应使用相应 SecurityLevel 的 DcmDspSecurityNumAttDelay 中配置的值进行初始化。
[SWS_Dcm_01354 虽然不是所有 Xxx_GetSecurityAttemptCounter 操作都返回了最终状态并且操作链没有被取消,但条件NotCorrect (0x22) NRC 应返回到任何 SecurityAccess (0x27) 请求-种子子功能请求。
[SWS_Dcm_01355]一旦所有 AttemptCounter 值已成功或未成功检索(所有 Xxx_GetSecurityAttemptCounter() 操作已执行并返回最终的非 PENDING 错误值或操作链已被取消),如果至少有一个恢复的 AttemptCounter 值大于或等于为其对应的 DcmDspSecurityRow 配置的 DcmDspSecurityNumAttDelay,Dcm 应以 DcmDspSecurityDelayTimeOnBoot / DcmDspSecurityDelayTime 的较高值启动 SecurityDelayTimer
相应的 DcmDspSecurityRow。
[SWS_Dcm_01356]应考虑配置为0的定时器(DcmDspSecurityDelayTime,DcmDspSecurity-MaxAttemptCounterReadoutTime)
启动时立即超时,即没有延迟效果。
[SWS_Dcm_CONSTR_6074] DcmDspSecurityMaxAttempt CounterReadoutTime DcmDspSecurityMaxAttemptCounterReadoutTime 的依赖性
应为倍数且至少等于 DcmTaskTime。

4,会话状态处理:
管理会话状态。

会话:session,一般有三种,缺省会话(0x00, Default session)、编程会话(0x01, Programming session)、扩展会话(0x02Extended session)。每种会话下可以进行的诊断服务不同,根据实际需求由OEM自己定义。一般来说诊断(UDS)刷写功能需要在编程会话下进行,涉及到NVM关键存储数据的写功能需要在扩展会话下进行。根据实际需求可以自己定义会话,比如定义0x60(EOL session)专门用于EOL工厂下线处理

  • [SWS_Dcm_00022]DSL子模块应保存当前活动会话的状态。为了访问这个变量,DSL 子模块提供了以下接口:
    1)获取当前会话状态:Dcm_GetSesCtrlType()
    2)设置会话状态:DslInternal_SetSesCtrlType()
  • [SWS_Dcm_00034]在 Dcm 初始化期间,会话状态设置为值 0x01(“DefaultSession”)诊断会话进入缺省会话。
  • [SWS_Dcm_01062] 对 Dcm_ResetToDefaultSession 的调用允许应用程序将当前会话重置默认会话,并通过调用SchM_Switch__DcmDiagnosticSessionControl(RTE_MODE_DcmDiagnostic SessionControl_DCM_DEFAULT_SESSION) (invokes)调用 ModeDeclarationGroupPrototype DcmDiagnosticSessionControl 的模式切换。
  • 示例:超出速度限制自动终止扩展诊断会话
跟踪激活的非默认(缺省)会话。

缺省会话进入非缺省会话后,S3Server定时器就会开始计时(只要收到诊断请求报文就会清零),如果定时器超时(S3Server),DLS模块就会将会话状态切换到缺省会话状态。
允许修改时间。

  • [SWS_Dcm_00140] 每当非默认会话处于活动状态并且达到会话超时(S3Server)而没有收到任何诊断请求时,DSL 子模块应重置默认会话状态(“DefaultSession”,0x01)并调用模式切换ModeDeclarationGroupPrototype DcmDiagnosticSessionControl 通过调用 SchM_Switch_DcmDiagnosticSessionControl(RTE
    MODE_DcmDiagnosticSessionControl_DEFAULT_SESSION) 。
  • 注意:是BSW Scheduler Name Prefix S3Server超时定时器启动/停止处理如下:
  • [SWS_Dcm_00141]
    后续开始:
    完成任何最终响应消息或错误指示(Dcm_TpTxConfirmation:完成PDU的确认或错误指示)
    在不需要/允许响应消息(正面和负面)的情况下完成请求的操作。表示接收多帧请求消息时出错。(Dcm_TpRxIndication:错误指示)
    后续停止:
    多帧请求消息的开始(Dcm_StartOfReception:表示PDU接收开始)
    接收单帧请求消息。 (Dcm_StartOfReception:表示开始接收PDU)
    “S3Server 启动”是指重置计时器并从头开始计数。
5,诊断协议处理:
允许修改时序
  • [SWS_Dcm_00027]P2ServerMin, P2ServerMax, P2ServerMin, P2ServerMax, S3Server这些参数值将会影响DCM模块的诊断响应时序。
  • [SWS_Dcm_00143] P2min / P2min 和 S3Server 应设置为定义的值(defined values):P2ServerMin=0,P2ServerMin=0, S3Server = 5为固定值。协议参数影响诊断会话层时序,不会影响到传输层时序。当协议激活/活动时,可以通过以下方法修改其中一些定时参数:
    UDS 服务诊断会话控制 (0x10)
    UDS 服务访问时间参数 (0x83)
    DSL 子模块提供以下功能来修改时序参数:
    提供主动时序参数,
    设置新的时序参数。 仅在发送响应后才允许激活新的计时值。
处理不同的诊断协议。

DSL子模块需要处理不同的诊断协议。实际应用中一般都是使用DCM_UDS_ON_CAN协议。

有必要区分不同的诊断协议(例如 OBD、增强、诊断 …)。
[SWS_Dcm_01365]如果调用 API Dcm_GetActiveProtocol,Dcm 应在 ActiveProtocol 参数中返回活动 UDS 协议作为 Dcm_ProtocolType。
[SWS_Dcm_01366] 如果只启动 OBD 协议或没有协议启动并且调用 API Dcm_GetActiveProtocol,则 Dcm 应返回 ActiveProtocol 参数设置为 DCM_NO_ACTIVE_PROTOCOL。
注意:Dcm_GetActiveProtocol API 不提供有关运行 OBD 协议的信息。

管理资源-----里面的小节没看

由于资源有限,DSL应该考虑以下几点作为设计提示:
1)在Dcm模块中只允许使用和分配 一个诊断缓冲区,这个缓冲区随后用于处理诊断请求响应
2)NRC 0x78 (Response pending)响应的输出是通过一个单独的缓冲区完成的
3)支持分页缓冲处理

6,通讯模式处理:

DCM模块和ComM模块的交互由DSL子模块完成。ComM模块把每个通信通道(channel)的当前通信状态(No-com, Full-com, Silent-com)通知给Dcm模块。Dcm模块的诊断功能将会调用ComM模块的接口功能会阻止Ecu进入shutdown/sleep模式(ActiveDiagnostic ==’DCM_COMM_ACTIVE’时ECU必须保持唤醒状态,也就是不允许 进入shutdown/sleep)。

应用程序可以调用Xxx_SetActiveDiagnostic()接口通知Dcm模块ActiveDiagnostic的当前状态。

ActiveDiagnostic 状态表明了诊断请求是否应保持 ECU 唤醒
(ActiveDiagnostic ==‘DCM_COMM_ACTIVE’)
或诊断请求是否不应阻止 Ecu 关闭/睡眠
(ActiveDiagnostic ==‘DCM_COMM_NOT_ACTIVE’)

  • [SWS_Dcm_CONSTR_6027] 应用程序将通过调用 Xxx_SetActiveDiagnostic() 通知 Dcm 有关 ActiveDiagnostic 状态。
  • [SWS_Dcm_01069] 在 Dcm_Init 之后,Dcm 应将 ActiveDiagnostic 设置为‘DCM_COMM_ACTIVE’。
  • [SWS_Dcm_01070] 如果 Xxx_SetActiveDiagnostic() 以“假”调用,则 Dcm 将 ActiveDiagnostic 设置为“DCM_COMM_NOT_ACTIVE”。
  • [SWS_Dcm_01071] 如果 Xxx_SetActiveDiagnostic() 以“true”调用,则 Dcm 将 ActiveDiagnostic 设置为“DCM_COMM_ACTIVE”。
  • [SWS_Dcm_01142] 在开始传输之前,Dcm 应等待来自 ComM 的完全通信模式指示(调用 Dcm_ComM_FullComModeEntered)
    的诊断答案。等待的时间不应超过从收到请求的那一刻起计算的 P2ServerMax。
  • [SWS_Dcm_01143] d 如果 Dcm 由于 [SWS_Dcm_01142] 未能确认响应等待传输 (DCM_E_FORCE_RCRRP),则 Dcm 应触发 Det 错误DCM_E_FORCE_RCRRP_IN_SILENT_COMM。
  • 注意:在接收端,在分段传输的情况下,静默通信模式可能会导致请求丢失。
(完全/静默/无通信)。

No Communication:
ComM模块调用 Dcm_ComM_NoComModeEntered接口通知Dcm模块通信关闭。Dcm模块收到通知后就会Disable所有的诊断接收/传输。
Silent Communication:
ComM模块调用 Dcm_ComM_SilentComModeEntered接口通知Dcm模块通信静默。Dcm模块收到通知后就会Disable所有的诊断传输。
Full Communication:
ComM模块调用 Dcm_ComM_FullComModeEntered接口通知Dcm模块通信静默。Dcm模块收到通知后就会Enable所有的诊断接收/传输。
Diagnostic Activation State:
Dcm将所有网络的内部诊断状态通知ComM模块。网络上的诊断状态有两种选择。
在“活动”诊断状态下,Dcm正在处理来自该网络的一个或多个诊断请求,或者Dcm处于非默认会话中。
在“非活动”诊断状态下,Dcm处于默认会话,并且没有在该网络上处理诊断请求

当一个网络没有正在进行的通信时,Dcm会将诊断ac激活状态设置为’ inactive '。当网络上有诊断通信时,Dcm将诊断状态设置为“活动”。在任何非默认会话中,诊断状态保持为“活动”状态。通信状态也可以通过API Xxx_SetActiveDiagnostic来控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值