AUTOSAR DCM模块读取DID的完整函数调用流程解析与实战指南

1次阅读
没有评论

共计 1773 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

1. AUTOSAR 架构与 DCM 模块定位

AUTOSAR 的分层架构中,诊断通信管理(DCM)模块位于服务层,直接对接 PduR 模块和 SW- C 应用层。其核心职责包括:

AUTOSAR DCM 模块读取 DID 的完整函数调用流程解析与实战指南

  • 诊断请求 / 响应的协议处理(如 UDS/OBD)
  • DID(Data Identifier)的寻址与访问控制
  • 会话和安全状态管理

当 ECU 收到 0x22(ReadDataByIdentifier)请求时,数据流会经过:物理层→CAN 驱动→CAN TP→PduR→DCM→SW- C 的完整链路。

2. Dcm_ReadData 函数调用全解析

2.1 请求接收阶段

  1. PduR 通过调用 Dcm_StartOfReceptionDcm_CopyRxData将诊断请求 PDU 传递给 DCM
  2. DCM 解析服务 ID(0x22)后触发 DspDataRead 处理流程
  3. 模块内部校验会话状态(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. 进阶思考

  1. 如何实现动态 DID(运行时修改 DID 内容)?
  2. 在多 ECU 系统中,怎样通过网关路由 DID 请求?
  3. 当 DID 数据需要 CRC 校验时,如何集成到现有流程?

实战总结

通过本文的流程拆解,开发者应能清晰掌握从诊断请求接入到数据回传的完整链路。关键点在于:正确配置 DID 映射表、实现可靠的回调函数、处理好异步场景。建议在真实 ECU 上通过 CANoe 发送 22 F120 请求,逐步调试观察数据流。

正文完
 0
评论(没有评论)