4. 诊断通信管理DCM
诊断通信管理(Diagnostic Communication Manager,DCM)位于AUTOSAR基础软件的服务层,是UDS诊断服务在ECU内部的“总调度台”。它向上承接诊断仪通过CAN、CAN FD、DoIP或LIN发来的请求,向下调用诊断事件管理(DEM)、功能抑制管理(FIM)、内存管理(NvM)以及各应用软件组件的诊断回调。DCM的核心职责可以概括为四件事:会话管理、服务分发、安全访问、状态机协同。理解这四者的关系,是掌握AUTOSAR诊断通信的关键。
一、DCM在AUTOSAR中的位置与数据流
DCM并不直接操作总线驱动,它通过PDU Router与下层通信栈交互。诊断请求从总线进入PduR,经DCM的DSL(Diagnostic Session Layer)、DSD(Diagnostic Service Dispatcher)和DSP(Diagnostic Service Processing)三层处理后,再返回响应。下图展示了DCM内部三层结构及其与外部模块的关系。
二、诊断会话管理:从默认会话到扩展会话
UDS定义了多种诊断会话,最常用的是默认会话(0x01)、编程会话(0x02)和扩展会话(0x03)。ECU上电后自动进入默认会话,此时只允许执行少数基础服务,如读取故障码、读取数据流。当诊断仪发送 10 03 请求切换到扩展会话后,DCM的DSL层会更新当前会话状态,并通知DSD层重新计算服务权限。
会话切换不是简单的变量赋值,它涉及三个动作:校验目标会话是否受支持、更新会话状态并启动S3定时器、触发会话变更回调。S3定时器默认为5000ms,若在S3超时前没有收到任何诊断请求,DCM会自动回退到默认会话,防止ECU长期停留在高权限状态。
会话切换的典型请求与响应:
请求: 10 03 // 切换到扩展会话
肯定响应: 50 03 00 32 01 F4
- 50: 服务肯定响应
- 03: 当前会话为扩展会话
- 00 32: P2Server_max = 50ms
- 01 F4: P2*Server_max = 5000ms
请求: 10 02 // 切换到编程会话
否定响应: 7F 10 22 // 条件不满足,需先安全访问
三、服务分发:DSD如何路由诊断请求
DSD层是DCM的“交通枢纽”。它根据请求中的SID(Service Identifier)查找配置表中对应的服务处理函数,并在分发前执行权限检查。权限检查包含两个维度:当前会话是否允许该服务、当前安全等级是否满足该服务要求。
以 0x27 安全访问服务为例,其子功能 0x01 请求种子在扩展会话下即可执行,但 0x02 发送密钥则要求会话正确且种子已请求。DSD通过配置表将SID、子功能、会话掩码、安全掩码绑定在一起,形成一张可裁剪的服务权限矩阵。
| SID | 服务名称 | 默认会话 | 扩展会话 | 编程会话 | 安全等级要求 |
|---|---|---|---|---|---|
| 0x10 | DiagnosticSessionControl | 允许 | 允许 | 允许 | 无 |
| 0x11 | ECUReset | 允许 | 允许 | 允许 | 无 |
| 0x14 | ClearDiagnosticInformation | 允许 | 允许 | 允许 | 无 |
| 0x19 | ReadDTCInformation | 允许 | 允许 | 允许 | 无 |
| 0x22 | ReadDataByIdentifier | 允许 | 允许 | 允许 | 无 |
| 0x27 | SecurityAccess | 禁止 | 允许 | 允许 | 无 |
| 0x2E | WriteDataByIdentifier | 禁止 | 允许 | 允许 | 等级1 |
| 0x31 | RoutineControl | 禁止 | 允许 | 允许 | 等级1 |
| 0x34 | RequestDownload | 禁止 | 禁止 | 允许 | 等级2 |
| 0x36 | TransferData | 禁止 | 禁止 | 允许 | 等级2 |
| 0x37 | RequestTransferExit | 禁止 | 禁止 | 允许 | 等级2 |
四、安全访问:种子与密钥的挑战应答
安全访问服务 0x27 采用“请求种子—发送密钥”的挑战应答机制。诊断仪先发送 27 01 请求种子,ECU生成一个随机数作为种子返回;诊断仪用预置算法对种子运算得到密钥,再通过 27 02 发送给ECU;ECU用相同算法验证密钥,验证通过后解锁对应安全等级。
安全等级通常分为Level 1和Level 2。Level 1用于写入标定数据、执行例程控制;Level 2用于刷写下载。安全等级具有会话绑定和超时回退特性:当会话从扩展会话回退到默认会话时,已解锁的安全等级自动失效;安全访问本身也有一个定时器,超时后需要重新解锁。
常见误区:把安全访问算法硬编码在应用层,导致不同项目移植时反复修改DCM配置。正确做法是将种子生成和密钥校验封装为DCM的安全访问回调函数,算法参数通过配置或标定量管理,DCM只负责流程调度。
五、会话与安全状态机设计
将会话状态和安全等级放在一起看,DCM实际上维护了一个二维状态空间。会话维度有默认、扩展、编程三个状态;安全维度有锁定、Level 1解锁、Level 2解锁三个状态。两个维度并非完全正交:编程会话通常要求先进入扩展会话并完成Level 2解锁,才能通过 10 02 切换。
设计状态机时需要明确以下转移条件:
- 上电初始化:进入默认会话,安全等级为锁定。
- 会话切换请求:校验目标会话合法性,合法则更新会话并重置S3定时器。
- S3超时:从扩展/编程会话回退到默认会话,同时清除安全等级。
- 安全访问成功:在当前会话下解锁对应等级,启动安全超时定时器。
- 安全超时:安全等级回退到锁定,但会话保持不变。
- ECU复位:所有状态回到上电初始值。
在AUTOSAR配置中,这些状态转移通过DcmDspSessionRow、DcmDspSecurityRow等容器描述。每个会话行定义会话ID、P2时间、P2*时间;每个安全行定义安全等级、种子大小、密钥大小、失败尝试次数上限。DCM在运行时根据这些配置自动完成状态迁移和权限判定,应用层只需实现具体的服务处理逻辑。
工程建议:在集成阶段,用CANoe或诊断脚本覆盖“默认→扩展→安全解锁→写入→回退”的完整路径,并专门测试S3超时和安全超时的边界值。状态机最容易出问题的地方不是正常流程,而是超时回退后残留的权限状态。
综上,DCM通过DSL管理会话、DSD分发服务、DSP执行处理,并以配置表驱动会话与安全状态机。掌握这三层结构和二维状态空间,就能在AUTOSAR项目中正确配置DCM、定位诊断权限问题,并为后续的刷写与标定功能打下基础。