DCM是什么
DCM全称Diagnostic Communication Manager,它位于AUTOSAR基础软件的服务层,它的主要作用是为开发和生产阶段提供与诊断仪交互的诊断服务。
DCM模块可以保证诊断数据流的正确性,管理诊断状态,比如会话状态和安全访问等级状态。DCM会检查某个诊断请求是否被支持,以及在当前的会话状态和安全访问等级下下该诊断请求会不会被执行。
DCM在AUTOSAR中的位置
DCM模块在AUTOSAR架构中的位置如下图:
DCM模块独立于网络总线,也就是说DCM不区分接收到的诊断请求是来自于CAN总线还是LIN总线,抑或是Flexray总线,所有与总线有关的处理都在PDUR模块完成。DCM模块从PDUR接收诊断报文,然后在DCM内部完成检查和处理。在这个过程中DCM将会与其他BSW模块或SWC(通过RTE)进行交互,以获得需要的数据或者执行相应的命令。DCM最终会收集并整合信息,最后发送响应报文给PDUR模块。
DCM包含的子模块
为了合理的分配DCM的各项任务,DCM被划分为如下三个子模块:
- DSL(Diagnostic Session Layer):处理诊断请求和响应的数据流,监督和管理诊断协议时序,管理会话和安全访问状态。
- DSD(Diagnostic Service Dispatcher):检查诊断请求的有效性(诊断ID是否支持、会话状态、安全等级),把有效的诊断请求委托给DSP,并追踪诊断请求的处理
- DSP(Diagnostic Service Processing):检查诊断请求格式以及诊断子服务是否支持,获得需要返回的数据或者执行需要被调用的函数(调用SWC的函数写数据到NVM,调用DEM的服务获得DTC状态)、填充response的数据
DCM各个子模块及其他软件模块之间的交互
下面利用一张图来厘清DCM各个子模块之间的关系,以及与其他软件模块的交互关系。
现在通过诊断仪发送一条配置车辆识别码(VIN)的诊断命令,看一下DCM的整个处理流程。
- 首先这条诊断报文(0x2E, 0xF1, 0x90, ......)会经由PDUR传送到DSL,DSL会先确认当前是否有其他诊断请求正在处理,如果没有将会把该诊断请求发送给DSD模块。
- DSD模块收到0x2E的诊断报文后,会先判断服务ID 0x2E在不在当前的Service Identifier Table中,如果不在将会拒绝该请求(一般情况下ECU都是支持0x2E服务的,这里只是举例子),如果该服务ID在Service Identifier Table中,接下来要判断当前的诊断会话(从DSL获取)是否为扩展会话,以及当前的安全访问状态是否允许0x2E写入。如果所有检查通过,则会把该诊断请求委托给DSP模块。否则将会拒绝该诊断请求,并通知DSL发送响应的负反馈到PDUR。
- DSP收到0x2E的诊断请求后,会先检查请求的格式,比如总的报文长度是否符合定义,以及诊断子服务0xF190是否支持。如果校验通过则调用APP层相应的SWC的函数,把VIN数据写入到NVM。然后准备正响应报文并发送给DSD,DSD再发送给DSL,最后通过PDUR发送到相应到网络总线上。