前言
AUTOSAR Dcm模块的分享分为Dcm模块概念详解和Dcm模块配置及代码分析,具体的项目实战请关注本号的后续文章,本篇为Dcm模块下的DSD子模块概念详解篇。
正文
3.3 诊断服务调度层(DSD)
3.3.1 DSD功能概述
DSD模块主要用于诊断服务的分配、服务执行环境及条件,会从接收的数据识别请求的服务类型(0x10、0x27、0x22),主要功能:
1)检查诊断服务:用于检查诊断服务执行的条件,如当前会话模式、诊断服务是否支持、安全访问等级。当判断条件不支持是会相应0x7F和具体的NRC否定响应码,通过后会由上一层处理服务(具体处理也可以给出否定响应)
2)汇总响应数据:将判断得到的响应数据或者由DSP发送的响应数据发送给DSL,由DSL向外发送数据
3.3.2 使用场景
1)接收诊断请求信息传输积极响应信息
DSD模块接收到诊断请求信息后会校验其有效性(session, security)。这种场景下,数据都是有效的,同时会反馈积极响应。DSD模块会将数据传递给DSP子模块下对于的服务处理器。当DSP子模块下的服务处理器完成了数据处理后会触发DSD模块传输积极响应信息。
如果数据处理器将服务作为请求指示函数的一部分立即处理,则数据处理器可以在此指示函数(“同步”)中触发传输。如果处理需要较长的时间(例如等待EEPROM驱动程序),则数据处理器将延迟某些处理(“异步”)。DSL子模块包含响应挂起机制。数据处理器显式地触发传输,但是从数据处理器的上下文中触发的。
一旦接收到请求消息,相应的DcmPduId就会被DSL子模块阻塞。在此请求的处理过程中,不能再接收其他相同协议类型的请求(例如,增强的会话可以通过OBD会话结束),直到发送相应的响应消息,并再次释放DcmPduId。
2)接收诊断请求信息抑制积极响应
这是前一个用例的子用例。在UDS协议中,可以通过在请求消息中设置一个特殊的位来抑制正响应。这种特殊的抑制处理完全在DSD子模块中执行。
3)接收诊断请求信息抑制否定响应
功能寻址的场景下,DSD模块将抑制否定响应码为0x11,0x12,0x31,0x7E的否定响应。
4)接收诊断请求信息传输否定响应信息
拒绝请求消息并发送否定响应有许多不同的原因。如果诊断请求无效,或者请求在当前会话中不能执行,DSD子模块将拒绝处理,并返回一个否定响应。
有许多理由拒绝执行一个格式符合的请求message,例如,如果ECU或系统状态不允许执行。在这种情况下,DSP子模块将触发一个消极的响应,包括NRC提供额外的信息,也就是否定响应的原因。
对于由多个参数组成的请求(例如,一个UDS Service ReadDataByIdentifier (0x22)请求有多个需要读取的标识符),每个参数被单独处理。每个参数都可能返回一个错误。如果至少一个参数被成功处理,这种请求将返回一个正响应。
5)没有接收诊断请求发送积极响应
UDS协议中包含两个服务,一个请求发送多个响应。通常,一个服务用于启用(和禁用)另一个服务的事件或时间触发传输,ECU在没有相应请求的情况下再次发送该服务。这些服务包括:
. 0x2A服务,周期传输诊断响应服务。
. 0x86服务,基于事件触发的响应服务。
6)分段响应
在诊断协议中,一些服务允许交换大量的数据,例如UDS Service ReadDTCInformation (0x19)和UDS Service TransferData (0x36)。
在传统的方法中,ECU内部缓冲区必须足够大,以保存最长的数据消息要交换(最坏的情况),并在传输开始之前填充完整的缓冲区。
ECU中的RAM内存通常是一个关键的资源,特别是在较小的微型计算机中。在一种更节省内存的方法中,只填充部分缓冲区,传输部分缓冲区,然后再填充部分缓冲区,以此类推。这种分页机制只需要大幅减少的内存量,但需要定义良好的缓冲填充反应时间。
用户可以决定是否使用“线性缓冲区”或页面缓冲区进行诊断。
3.3.3 DSD模块和其他模块的交互
DSL模块接收到诊断数据后,DSD模块的服务就会被调用,DSD模块将会执行以下的操作:
1)委托DSP子模块或Dcm 外的外部模块处理请求。
2)跟踪请求处理。
3)将应用程序的响应发送给DSL子模块。
3.3.4 DSD模块功能描述
3.3.4.1 检查诊断服务标识符
DSL接收到诊断信息后触发DSD模块去校验诊断信息ID的有效性。DCM模块可以配置当前ECU支持多个诊断ID,不过一般情况下,一个ECU仅支持一个物理寻址ID和一个功能寻址ID,如果收到的诊断信息中的ID信息不是ECU配置好的物理/功能寻址ID,则DCM返回否定响应码NRC:0x11。
3.3.4.2 处理正响应抑制响应位
诊断报文的第二个字节的bit7如果置位1(suppressPosRspMsgIndicationBit = TRUE),DSD模块不用发送积极正响应(抑制正响应)。
3.3.4.3 校验功能
DSD模块将会对一个诊断请求做一下6个方面的校验,如果全都通过了才会继续处理诊断请求,否则返回对应的否定响应码。
1)制造商许可的校验。实际项目中基本没有这个校验。
2)SID的校验。服务ID的校验,也就是是否支持当前接收到的诊断ID。
3)诊断会话校验。在诊断配置阶段,会预先定义每个诊断请求在什么会话下才支持。测试时,只有在支持的诊断会话下才会积极响应对应的诊断请求,否则返回NRC:0x7E的否定响应码。所以在诊断请求前,可以先通过0x10服务将诊断会话切换到需要的会话状态,同时通过0x3E服务维持诊断会话。
4)安全访问等级的校验。在诊断配置阶段,会预先定义每个诊断请求在安全等级下才支持。测试时,只有在支持的安全等级下才会积极响应对应的诊断请求,否则返回NRC:0x33的否定响应码。所以在诊断请求前,可以先通过0x27服务将安全等级切换到需要的安全等级。
5)供应商许可的校验。实际项目中基本没有这个校验。
6)服务ID的模式规则状态校验。如果DcmDSD模块引用的DcmDsdSidTabModeRuleRef模式规则不支持当前诊断ID服务或其子服务,则返回否定响应码。
3.3.4.4 检查格式及是否支持子服务
DSD模块将会检查接收到的诊断信息的长度是否大于配置的最小长度,不满足则返回否定响应码NRC:0x13。DSD模块将会检查诊断信息的子服务是否支持,如果不支持则返回否定响应码NRC:0x12。
3.3.4.5 将诊断消息分发到DSP子模块
DSD子模块应为新接收的诊断服务标识符搜索DSP子模块的可执行功能,并调用相应的DSP服务解释器。
3.3.4.6 组装积极或者消极响应
当DSP子模块完成了重新请求的诊断服务的执行时,DSD子模块将组装响应消息。
3.3.4.7 开始传输诊断响应
DCM模块完成诊断操作后,DSD模块通过调用PduR模块的信息发送接口将诊断响应(积极响应或者否定响应)发送出去。
DSL子模块应将收到的来自PduR模块的确认转发给DSD子模块。
DSD子模块应通过内部函数DspInternal_DcmConfirmation()将确认转发给DSP子模块。
在没有发送诊断(响应)消息(抑制响应)的情况下,DSL子模块不发送任何响应。在这种情况下,没有数据确认从DSL子模块发送到DSD子模块,但DSD子模块仍将调用内部函数DspInternal_DcmConfirmation()。
如果Dcm已经完全处理了请求,DSD子模块应该通过调用DspInternal_DcmConfirmation()来完成诊断tic服务调度程序的一条诊断消息的处理。
DSP子模块正在等待DspInternal_DcmConfirmation()功能的执行。所以它必须被发送,也是在没有数据确认提供。总之,这意味着在下列任何情况下:
.积极响应
.否定响应
.抑制积极响应
.抑制否定响应
DSD子模块将通过调用DspInternal_DcmConfirmation()来完成。
推荐阅读
Autosar架构下的模块详细设计及代码实现–基于配置的编程方法
CANoe工具使用(1)-实现CAN通道的收、发、录、回放报文
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号
原文始发于微信公众号(汽车电子嵌入式):AUTOSAR 通信服务-Dcm子模块DSD详解