7.4 DSD

7.4.1 DSD功能概述

DSD 子模块负责检查传入诊断请求有效性(诊断会话/安全访问级别/应用程序权限的验证)并跟踪服务请求执行的进度。
[SWS_Dcm_00178] DSD 子模块应仅处理有效请求并拒绝无效请求。

DSD模块主要用于诊断服务分配、服务执行环境及条件,会从接收的数据来识别请求的服务类型(0x10、0x27、0x22),主要功能:
1)检查诊断服务:用于检查诊断服务执行的条件,如当前会话模式、诊断服务是否支持、安全访问等级。当判断条件不支持是会相应0x7F和具体的NRC否定响应码,通过后会由上一层处理服务(具体处理也可以给出否定响应)
2)汇总响应数据:将判断得到响应数据或者由DSP发送的响应数据发送给DSL,由DSL向外发送数据

7.4.2 使用场合

以下case是相关的,并在下面详细描述:
接收请求消息并发送肯定响应消息
接收请求消息并抑制肯定响应
接收请求消息并抑制否定响应
接收请求消息并发送否定响应消息
发送没有相应请求的肯定响应消息
分段响应

(1)接收诊断请求消息发送肯定响应消息

这是正常通信(“乒乓”)的标准用例。服务器接收诊断请求消息。 DSD子模块保证请求消息的有效性。在这个用例中,请求是有效的并且响应是肯定的。请求被转发到 DSP 子模块中的适当数据处理器。当数据处理器完成所有数据处理动作后,触发DSD子模块发送响应报文
如果数据处理器作为请求指示函数的一部分立即处理服务,则数据处理器可以触发该指示函数内部的传输(“同步”)。如果处理需要更长的时间(例如等待 EEPROM 驱动程序),数据处理器会推迟一些处理(“异步”)。响应挂起机制由 DSL 子模块覆盖。数据处理器显式地触发传输,但来自数据处理器的上下文。一旦收到请求消息,相应的 DcmPduId 就会被 DSL 子模块阻止(参见 [SWS_Dcm_00241])。在处理该请求的过程中,不能接收到其他相同协议类型的请求(例如,增强型会话可以通过OBD会话结束),直到发送相应的响应消息并再次释放 DcmPduId。

DSD模块接收到诊断请求信息后会校验其有效性(session, security)。这种场景下,数据都是有效的,同时会反馈积极响应DSD模块会将数据传递给DSP子模块下对于的服务处理器。当DSP子模块下的服务处理器完成了数据处理后触发DSD模块发送积极响应信息

如果数据处理器服务作为请求指示函数一部分 立即处理,则数据处理器可以在此指示函数(“同步”)中触发传输
如果处理需要较长的时间(例如等待EEPROM驱动程序),则数据处理器将延迟某些处理(“异步”)。DSL子模块包含响应挂起机制。数据处理器显式地触发传输,但是从数据处理器的上下文中触发的。

一旦接收到请求消息,相应的DcmPduId就会被DSL子模块阻塞。在此请求的处理过程中,不能再接收其他相同协议类型请求(例如,增强的会话可以通过OBD会话结束),直到发送相应的响应消息,并再次释放DcmPduId。

(2) 接收诊断请求信息抑制积极响应

这是前一个用例的子用例。在UDS协议中,可以通过在请求消息中设置一个特殊的位抑制正响应。这种特殊的抑制处理完全DSD子模块中执行。

(3)接收诊断请求信息抑制否定响应

功能寻址的场景下,DSD模块将抑制否定响应码为0x11,0x12,0x31,0x7E,0x7F的否定响应

(4)接收诊断请求信息传输否定响应信息

拒绝请求消息发送否定响应有许多不同的原因。如果诊断请求无效,或者请求在当前会话中不能执行DSD子模块将拒绝处理,并返回一个否定响应。

有许多理由拒绝执行一个格式符合请求message,例如,如果ECU或系统状态不允许执行。在这种情况下,DSP子模块将触发一个消极的响应,包括NRC提供额外的信息,也就是否定响应的原因

对于由多个参数组成的请求(例如,一个UDS Service ReadDataByIdentifier (0x22)请求有多个需要读取的标识符),则单独处理每个参数。每个参数都可能返回一个错误。如果至少一个参数成功处理,则此类请求会返回一个肯定响应

  • [SWS_Dcm_00827] DSD 子模块应按照 ISO14229-1 [2] 给出的顺序检查收到的诊断请求。如果其中一个计算失败,Dcm 将停止执行 NRC 检查序列,然后停止或不开始执行接收到的诊断请求,并最终传输计算失败的 NRC

(5)发送没有响应请求的肯定响应消息

UDS协议中包含两个服务,其中仅针对一个请求发送多个响应。通常,一个服务用于启用(和禁用)另一个服务的事件或时间触发传输,ECU在没有相应请求的情况下再次发送该服务。这些服务包括:

. 0x2A服务,周期传输诊断响应服务。

. 0x86服务,基于事件触发的响应服务。

UDS 服务 ReadDataByPeriodicIdentifier (0x2A)。 此服务允许客户端向服务器请求定期传输数据记录值,该服务器由一个或多个周期性数据标识符标识。
类型 2 = UUDT 消息在单独的 DcmTxPduId 上。

响应事件 (0x86)。 此服务请求服务器启动或停止 传输指定事件的响应
类型 1 = DcmTxPduId 上的 USDT 消息已用于正常诊断

这种处理特别由 DSL 子模块控制。 但是,DSD 子模块也提供了在没有相应请求的情况下生成响应的可能性

(6)分段响应(分页缓冲区)

在诊断协议中,一些服务允许交换大量的数据,例如UDS Service ReadDTCInformation (0x19)和UDS Service TransferData (0x36)。

在传统的方法中,ECU内部缓冲区必须足够大,以保存最长的数据消息要交换(最坏的情况),并在传输开始之前填充完整的缓冲区。

ECU中的RAM内存通常是一个关键的资源,特别是在较小的微型计算机中。在一种更节省内存的方法中,只填充部分缓冲区,传输部分缓冲区,然后再填充部分缓冲区,以此类推。这种分页机制只需要大幅减少的内存量,但需要定义良好的缓冲填 充反应时间

用户可以决定是否使用“线性缓冲区”或页面缓冲区进行诊断。

7.3 DSD模块和其他模块的交互

DSL模块接收到诊断数据后,DSD模块的服务就会被调用,DSD模块将会执行以下的操作:

1)委托DSP子模块或Dcm 外的外部模块处理请求。

2)跟踪请求处理。

3)将应用程序的响应发送给DSL子模块(传输功能)。
在这里插入图片描述
在这里插入图片描述

7.4 DSD模块功能描述

检查诊断服务标识符

DSL接收到诊断信息后 触发DSD模块去校验诊断信息ID有效性。DCM模块可以配置当前ECU支持多个诊断ID,不过一般情况下,一个ECU仅支持一个物理寻址ID和一个功能寻址ID,如果收到的诊断信息中的ID信息不是ECU配置好的物理/功能寻址ID,则DCM返回否定响应码NRC:0x11。

  • [SWS_Dcm_00084] 如果已配置(配置参数 DcmRespondAllRequest=FALSE),如果 Dcm 模块接收到包含服务 ID 的诊断请求,该服务 ID 在 0x40 到 0x7F 或 0xC0 到 0xFF 的范围内,则 Dcm 不应响应这样的要求。
    此范围对应于诊断响应标识符。
  • [SWS_Dcm_00192] DSD 子模块应分析(传入)诊断消息的诊断服务标识符(基于诊断消息的第一个字节),并应使用新接收的诊断服务标识符检查支持的服务。
  • [SWS_Dcm_00193] 在此检查期间,DSD 子模块应在“服务标识符表”中搜索新收到的诊断服务标识符。出于性能原因,可能需要使用“查找表”功能完成支持检查。在这个“服务标识符表”中,所有支持的 ECU 服务 ID 都是预定义的。
  • [SWS_Dcm_00195] DSL子模块应提供当前的“服务标识符表”
  • [SWS_Dcm_00195] 的基本原理:“服务标识符表”和有关支持服务的信息将在配置之外生成。可以配置多个服务标识符表以供选择。一次只能激活一个服务标识符表。
  • [SWS_Dcm_00196]为了检查,DSD子模块应扫描活动的“服务标识符表”以寻找新接收到的诊断服务标识符。如果支持该服务标识符并且如果配置参数 DcmDsdSidTabFnc(参见 ECUC_Dcm_00777)不为空,则 DSD 子模块应调用配置的服务接口(_)。如果配置参数为空,则Dcm调用内部实现的服务接口。
    如果诊断服务标识符未包含在“ServiceIdentifier Table”中,则不支持该标识符。
  • [SWS_Dcm_00197] 如果不支持新接收到的诊断服务标识符,DSD 子模块应向 DSL 子模块发送带有 NRC 0x11(不支持服务)的否定响应。
  • [SWS_Dcm_00198] DSD子模块应存储新收到的诊断服务标识符以供以后使用。
    例如:WriteDataByIdentifier(用于写入 VIN 号):
  1. DSL 子模块收到一条新的诊断信息。 (诊断消息 WriteDataByIdentifier = 0x2E、0xF1、0x90、0x57、0x30、0x4C、0x30、0x30、0x30、0x30、0x34、0x33、0x4D、0x42、0x35、0x34、0x31、0x33、0x2)
  2. DSL 子模块向 DSD 子模块指示具有“数据指示”功能的新诊断消息。在诊断消息缓冲区中存储诊断消息(缓冲区 = 0x2E,0xF1,0x90,…)。
  3. DSD 子模块使用确定的服务标识符(缓冲区 0x2E 的第一个字节)对传入的诊断消息执行支持的服务的检查。
  4. 传入的诊断消息存储在 Dcm 变量中
    Dcm_MsgContextType。
  • [SWS_Dcm_CONSTR_6047] d 在 DcmDsd-SidTabServiceId 中配置的服务标识符的 Id 在一个 DcmDsdServiceTable 内应是唯一的。
  • [SWS_Dcm_00732]对于_ 的第一次调用,opStatus 应设置为 DCM_INITIAL
  • [SWS_Dcm_00733] 当 _() 返回 DCM_E_PENDING 时,Dcm 不应接受进一步的请求(相同或更低优先级)。 Dcmin 内部超时处理(基于 RCR-RP 限制)可能会导致外部诊断服务处理的取消。
  • [SWS_Dcm_00735] d 在取消的情况下,API _ 再次调用,参数 opStatus 设置为 DCM_CANCEL

处理正响应抑制响应位

诊断报文的第二个字节的bit7如果置位1(suppressPosRspMsgIndicationBit = TRUE),DSD模块不用发送积极正响应(抑制正响应)。

  • [SWS_Dcm_00200] 如果“suppressPosRspMsgIndicationBit”为TRUE,DSD 子模块不应发送肯定响应消息。
  • [SWS_Dcm_00201] DSD 子模块应从诊断消息中删除“suppressPosRspMsgIndicationBit”(通过屏蔽该位)。
  • [SWS_Dcm_00202] Dcm 模块应通过参数 Dcm_MsgContextType 传输有关抑制正响应处于活动状态(层之间)的信息。
  • [SWS_Dcm_00203] 在 responsePending 的情况下,Dcm 模块应清除“suppressPosRspMsgIndicationBit”。
  • [SWS_Dcm_00203] 的基本原理:在所描述的情况下,需要最终响应(负/正)。
  • [SWS_Dcm_00204] Dcm模块只有在配置参数DcmDsdSidTabSubfuncAvailis为新接收到的服务标识符设置时才执行“suppressPosRspMsgIndicationBit”处理
    注意:“suppressPosRspMsgIndicationBit”处理需要独立于请求中的处理顺序来考虑(如 RoutineControl 服务)。
  • [SWS_Dcm_00204] 的基本原理:“suppressPosRspMsgIndicationBit”仅在服务具有子功能时可用。

校验功能—子目录没看

DSD模块将会对一个诊断请求做一下6个方面的校验,如果全都通过了才会继续处理诊断请求,否则返回对应的否定响应码

1)制造商许可的校验。实际项目中基本没有这个校验。

2)SID的校验。服务ID的校验,也就是是否支持当前接收到的诊断ID。

3)诊断会话校验。在诊断配置阶段,会预先定义每个诊断请求在什么会话下才支持。测试时,只有在支持的诊断会话下才会积极响应对应的诊断请求,否则返回NRC:0x7E的否定响应码。所以在诊断请求前,可以先通过0x10服务将诊断会话切换到需要的会话状态,同时通过0x3E服务维持诊断会话。

4)安全访问等级的校验。在诊断配置阶段,会预先定义每个诊断请求在安全等级下才支持。测试时,只有在支持的安全等级下才会积极响应对应的诊断请求,否则返回NRC:0x33的否定响应码。所以在诊断请求前,可以先通过0x27服务将安全等级切换到需要的安全等级。

5)供应商许可的校验。实际项目中基本没有这个校验。

6)服务ID的模式规则状态校验。如果DcmDSD模块引用的DcmDsdSidTabModeRuleRef模式规则不支持当前诊断ID服务或其子服务,则返回否定响应码。

检查格式及是否支持子服务

DSD模块将会检查接收到的诊断信息长度是否大于配置最小长度不满足则返回否定响应码NRC:0x13。DSD模块将会检查诊断信息的子服务是否支持,如果不支持则返回否定响应码NRC:0x12。

将诊断消息分发到DSP子模块

DSD子模块应为新接收的诊断服务标识符搜索DSP子模块的可执行功能,并调用相应的DSP服务解释器。

组装积极或者消极响应

DSP 子模块完成了请求诊断服务的执行(execution ofxxx),DSD 子模块将组装响应。
DSP服务解释器的执行可以有结果:
阳性结果或
阴性结果。
可以组装以下可能的响应:
积极响应,
负面回应,或
无响应(在抑制响应的情况下)。

开始传输诊断响应

  • DSD 子模块应将诊断(响应)消息(肯定或否定响应)转发给 DSL 子模块。

  • DSL 子模块应通过执行 DSL 传输功能将诊断**(响应)消息**(肯定或否定响应)进一步转发到 PduR 模块。DSL子模块在转发数据时会收到PduR模块的确认。

  • DSL子模块应将收到的来自PduR模块的确认(信息)发给DSD子模块。

  • DSD 子模块应通过内部函数 DspInternal_DcmConfirmation()确认发给 DSP 子模块。

  • [SWS_Dcm_00238]在没有发送诊断(响应)消息(响应抑制)的情况下,DSL子模块不应发送任何响应。在这种情况下,DSL子模块不会向DSD子模块发送数据确认,但DSD子模块仍会调用内部函数DspInternal_DcmConfirmation()。

  • [SWS_Dcm_00240] 如果Dcm已经完全处理了请求,DSD子模块应该通过调用DspInternal_DcmConfirmation()来完成诊断tic服务调度程序 (DiagnosticService Dispatcher )的一条诊断消息的处理。

  • [SWS_Dcm_00240] 的基本原理:DSP 子模块正在等待 DspInternal_DcmConfirmation() 功能的执行。所以它必须被发送,当没有提供数据确认时也是如此。总而言之,这意味着在以下任何情况下:
    积极响应,
    负面反应,
    抑制积极反应,和
    抑制的负面反应
    DSD 子模块将通过调用 DspInternal_DcmConfirmation() 完成(参见 8.10.3 DspInternal_DcmConfirmation)。

  • [SWS_Dcm_00741] DSD 子模块应使用 ServiceRequestNotification 接口在所有端口上调用操作 Xxx_Confirmation()(参见配置参数 DcmDsdServiceRequestManufacturerNotification 和 DcmDsdServiceRequestSupplierNotification)

  • [SWS_Dcm_00742] Xxx_Confirmation() 的调用应在 DspInternal_DcmConfirmation() 调用之后立即完成

  • [SWS_Dcm_00677] 如果操作 Indication() 返回值
    E_REQUEST_NOT_ACCEPTED,Dcm 模块不应发送任何诊断响应,并应结束当前的诊断请求管理。

  • [SWS_Dcm_00678] 如果 Indication() 操作返回值 E_NOT_OK,Dcm 模块应发送 NRC 值等于 ErrorCode 参数值的否定响应。
    DCM模块完成诊断操作后,DSD模块通过调用PduR模块的信息发送接口将诊断响应(积极响应或者否定响应)发送出去。


“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值