1. DSL:诊断服务层
模块负责确认诊断数据流的请求与响应。确保诊断计时以及诊断状态的切换。
1.1 处理诊断请求
-
PduR来的数据传递到DSP主要通过调用接收和Copy数据的函数实现。
当收到诊断请求时,PDUR调用Dcm_StartOfReception()和Dcm_CopyRxData()函数将收到的诊断请求数据放置在DCM模块的Buffer中,然后PDUR调用Dcm_TpRxIndication()函数通知Dcm模块接收到了新的诊断请求。
-
与Tester保持Alive。
ECU接收到对应的报文 (SID:0x3E Sub: 0x80) , ECU对该报文不会发到DSP
1.2 处理诊断响应
收到发送数据时,PDUR会将数据诊断请求数据从DSL的发送Buffer中Copy到PDUR的发送Buffer中,具体后续处理由CAN的协议栈进行处理。
保证对测试人员的响应时间
-
周期性传输
对应的服务ReadDataByPeriodicldentifier (0x2A), UDS提供的“ReadDataByPeriodicldentifier (0x2A)”服务,用于向由一个或多个periodicDataldentifiers标识的ECU请求定期传输数据记录值。
-
ResponseOnEvent(ROE)传输
对应的UDS服务ResponseOnEvent (0x86), 通过UDS Service ResponseOnEvent (0x86),测试人员可以请求ECU启动或停止传输由指定事件发起的响应。当注册一个事件进行传输时,测试者也指定相应的服务来响应(例如:UDS service ReadDataByldentifier 0x22).
-
分段响应
在某些情况下,例如在例程执行的情况下,应用程序需要立即请求一个NRC 0x78(响应等待),该请求应立即发送,而不是仅仅在到达响应时间之前(P2ServerMax分别为P2*ServerMax)。
当Dcm模块调用一个操作并得到一个错误状态DCM_E_FORCE_RCRRP时, DSL子模块将触发NRC 0x78(响应等待)的负响应传输。这个响应需要从一个单独的缓冲区发送,以避免覆盖正在进行的请求处理。
-
应用程序触发ResponsePending响应
当需要响应诊断请求时,DSL模块通过调用PduR_DcmTransimit()和Dcm_CopyTxData()将数据传递至PDUR模块,其中PduR_DcmTransimit()函数只是传递长度信息、地址信息,数据是通过Dcm_CopyTxData()函数传递至PDUR模块,当数据传输成功后,PDUR模块通过Dcm_TpTxConfirmation()函数告知DCM数据接收成功。
1.3 管理安全等级
-
管理安全级别
DSL提供Dcm_GetSecurityLevel()、DslInternal_SetSecurityLevel()两个函数分别用于获取当前的安全等级和设置安全等级。
对于配置层面而言,DSL菜单主要是配置诊断帧,包括物理寻址和功能寻址,单次通信的最大buffer、时间参数、包括回复0x78(诊断请求已收到且有效服务器正在执行请求服务-等待响应)的时间和为了防止诊断服务异常,允许0x78的最大次数。
-
处理Key和Seed
1.4 会话状态处理
-
管理会话状态处理当前激活的Session以及设置新的Sesstion
-
缺省会话(0x00, Default session)
-
编程会话(0x01, Programmingsession)
-
扩展会话(0x02,Extended session)。
-
-
管理权限状态分为权限模式和默认的模式
-
跟踪活动的非默认会话
-
允许修改时间
1.5 诊断协议处理
-
处理不同的诊断协议
-
处理设置诊断协议服务Table,根据UDS或者OBD链接到不同的诊断协议
-
设置不同服务协议的优先级
-
支持优先级抢占机制
-
并行处理OBD和UDS协议,可以忽略优先级和抢占机制
1.6 通信模式处理
DCM模块和ComM模块的交互由DSL子模块完成。
ComM模块把每个通信通道(channel)的当前通信状态(No-com, Full-com, Silent-com)通知给Dcm模块。
Dcm模块的诊断功能将会调用ComM模块的接口功能可能会阻止Ecu进入shutdown模式(ActiveDiagnostic ==’DCM_COMM_ACTIVE’时ECU必须保持唤醒状态,也就是不允许 进入shutdown/sleep)。
-
处理通信要求(Full/Silent/No)
ComM会通知DCM当前的通道, DCM会进行模式的请求, 避免通信进入Sleep;在Silent和NO下, DCM禁止通信
ComM模块调用 Dcm_ComM_NoComModeEntered接口通知Dcm模块通信关闭。Dcm模块收到通知后就会Disable所有的诊断接收/传输。
ComM模块调用 Dcm_ComM_SilentComModeEntered接口通知Dcm模块通信静默。Dcm模块收到通知后就会Disable所有的诊断传输。
ComM模块调用 Dcm_ComM_FullComModeEntered接口通知Dcm模块通信静默。Dcm模块收到通知后就会Enable所有的诊断接收/传输。
-
No Communication
-
Silent Communication
-
Full Communication
-
-
指示活动/非活动诊断
-
启用/禁用所有类型的诊断传输
在DSL里面可以配置多路诊断通道,假设诊断ID有2个以上,通过DcmDslProtocolRows容器实现。
2. DSD:诊断服务调度
DSD负责接收网络上的诊断请求,并转发到对应的数据处理模块。接收响应数据并将数据传递给DSL模块,在由DSL模块发送到网路。
-
检查诊断服务:用于检查诊断服务执行的条件,如当前会话模式、诊断服务是否支持、安全访问等级。当判断条件不支持是会相应0x7F和具体的NRC否定响应码,通过后会由上一层处理服务(具体处理也可以给出否定响应)
-
汇总响应数据:将判断得到的响应数据或者由DSP发送的响应数据发送给DSL,由DSL向外发送数据
3. DSP:诊断服务处理
DSP负责处理诊断服务请求。