共计 1773 个字符,预计需要花费 5 分钟才能阅读完成。
1. AUTOSAR 架构与 DCM 模块定位
AUTOSAR 的分层架构中,诊断通信管理(DCM)模块位于服务层,直接对接 PduR 模块和 SW- C 应用层。其核心职责包括:

- 诊断请求 / 响应的协议处理(如 UDS/OBD)
- DID(Data Identifier)的寻址与访问控制
- 会话和安全状态管理
当 ECU 收到 0x22(ReadDataByIdentifier)请求时,数据流会经过:物理层→CAN 驱动→CAN TP→PduR→DCM→SW- C 的完整链路。
2. Dcm_ReadData 函数调用全解析
2.1 请求接收阶段
- PduR 通过调用
Dcm_StartOfReception和Dcm_CopyRxData将诊断请求 PDU 传递给 DCM - DCM 解析服务 ID(0x22)后触发
DspDataRead处理流程 - 模块内部校验会话状态(
DspSessionCheck)和安全等级(DspSecurityCheck)
2.2 DID 解析流程
- DID 匹配:遍历预配置的 DID 表(Dcm_DspData)进行二分查找
- 权限验证:检查当前会话是否允许访问该 DID(DcmDspDataReadPermission)
- 长度校验:确认请求数据长度与 DID 定义一致(Dcm_DspDataLength)
2.3 回调函数触发机制
通过 Dcm_ReadData 函数指针调用 SW- C 层实现的回调:
Std_ReturnType Dcm_ReadDataCallback(
uint16 did,
uint8 *data,
uint16 *length,
Dcm_OpStatusType opStatus)
{
/* 示例:读取引擎转速 DID 0xF120 */
if(did == 0xF120) {
*length = 2; // 2 字节数据
data[0] = GetEngineSpeed() >> 8;
data[1] = GetEngineSpeed() & 0xFF;
return E_OK;
}
return DCM_E_PENDING; // 异步处理标记
}
3. 关键代码实现
3.1 DID 配置表示例(符合 BSWMD 格式)
<DCM-DSP>
<DATA-IDENTIFIER>
<SHORT-NAME>DID_0xF120</SHORT-NAME>
<IDENTIFIER>0xF120</IDENTIFIER>
<LENGTH>2</LENGTH>
<READ-ACCESS>READ-ONLY</READ-ACCESS>
<DCM-READ-FUNCTION>Dcm_ReadDataCallback</DCM-READ-FUNCTION>
</DATA-IDENTIFIER>
</DCM-DSP>
3.2 异步处理实现(大数据量场景)
/* 在回调函数中触发异步读取 */
if(did == LARGE_DID) {StartAsyncReadProcess();
return DCM_E_PENDING;
}
/* 通过 Dcm_GetReadDataAsyncResult 查询状态 */
void Dcm_MainFunction() {if(AsyncReadComplete) {Dcm_ProvideReadDataAsyncResult(DCM_E_OK);
}
}
4. 性能优化策略
4.1 大数据量处理
- 分块传输:使用 0x3E(TesterPresent)保持会话
- 动态内存分配:通过
Dcm_SetDataBuffer预分配缓冲区
4.2 多核线程安全
- 使用 OS Spinlock 保护共享 DID 数据
- 避免在回调函数中使用全局变量
5. 常见问题排查
5.1 典型错误场景
- DID 未响应:检查 DcmDspData 配置是否包含该 DID
- NRC 0x31:确认会话状态≥默认会话
- NRC 0x33:安全等级不足时触发
5.2 超时处理
/* 在回调函数中设置超时检测 */
if(GetCurrentTick() - startTick > TIMEOUT_MS) {return DCM_E_TIMEOUT;}
6. 进阶思考
- 如何实现动态 DID(运行时修改 DID 内容)?
- 在多 ECU 系统中,怎样通过网关路由 DID 请求?
- 当 DID 数据需要 CRC 校验时,如何集成到现有流程?
实战总结
通过本文的流程拆解,开发者应能清晰掌握从诊断请求接入到数据回传的完整链路。关键点在于:正确配置 DID 映射表、实现可靠的回调函数、处理好异步场景。建议在真实 ECU 上通过 CANoe 发送 22 F120 请求,逐步调试观察数据流。
正文完
