源码如下【免费】AUTOSAR-DEM源码资源-CSDN下载AUTOSAR_DEM理论篇如下AUTOSAR CP故障诊断协议栈DEMDTC理论篇-CSDN博客1. 引言AUTOSAR CP 的诊断协议栈DCM DEM FiM功能完善、体系严谨是汽车电子行业的标杆。但在实际项目中尤其是电机控制器、BMS、VCU等资源敏感或非 CAN 诊断优先的场景完整部署 AUTOSAR 诊断栈往往显得笨重需要复杂配置工具大量代码生成对 UDS、会话管理、安全访问等非核心功能依赖不强因此我们选择只聚焦 DEMDiagnostic Event Manager手写一个轻量级、可移植、易理解的故障管理内核命名为 DSMDiagnostic State Manager / DIMDiagnostic Information Manager。本文不涉及 AUTOSAR 工具配置重点记录从理解故障管理本质、重构现有代码到工程移植、验证扩展的全过程核心突出模块结构设计与逻辑梳理。2. AUTOSAR 诊断协议栈回顾模块拆分核心逻辑AUTOSAR 将诊断功能拆分为 DCM、DEM、FiM 三个独立模块核心逻辑是基于各模块的变更频率差异实现解耦降低维护成本三个模块的职责与特性如下三者协同逻辑清晰DCM 守住通信入口DEM 管理故障数据FiM 管控应用行为。结合项目需求我们仅聚焦 DEM 核心能力DCM 与 FiM 预留扩展接口后续按需轻量补充。3. 代码整体架构事件直驱型DSM 模块基于项目遗留代码改造原始代码采用事件直驱架构核心逻辑为“故障事件触发 → 状态更新 → 计数处理 → DTC 记录”具体结构如下采用功能组 组内偏移两级索引功能组故障大类如通信故障、硬件故障共约 26 个组内偏移每个大类下的子故障总计 109 个状态存储使用位域数组每个功能组对应一个 16 位整数调用方式上层通过宏传入功能组和偏移宏展开后调用底层处理函数。内部流程授权检查设置检测标志位累加故障计数器增量值可配置若计数器达到阈值设置记录标志位记录 DTC 并保存冻结帧更新全局故障等级恢复流程类似递减计数器归零时清除记录标志。优点内存紧凑、执行快缺点可读性差、索引计算复杂、不易扩展4.核心架构从两级索引到线性 FaultID原代码采用功能组Function 组内偏移Type的两级索引方式约 26 个功能组共 109 个故障。状态存储使用位域数组每个功能组对应一个 16 位整数。这种设计内存紧凑但存在明显缺点索引计算复杂需要依赖偏移表可读性差不易扩展上层调用需要知道功能组和偏移两个参数重构思路将所有故障线性编号为 0 ~ N-1FaultID状态数组大小缩减为(N15)/16个 16 位整数。通过 FaultID 直接计算组索引FaultID 4和位偏移FaultID 0x0F无需偏移表。配置数据如计数器增量、减量、失效模式、DTC 编号等原本就按全局索引排列重构后直接使用 FaultID 访问完全不变。状态数组分为四类检测状态当前是否检测到故障记录状态是否已确认为历史故障授权状态是否允许检测该故障记录忽略状态特殊场景使用所有状态操作通过宏封装上层无感知。5.、主要技术难点与解决方案难点1两级索引向线性索引的重构问题原代码中大量宏和函数依赖 FunctionType修改范围大易出错。解决先定义 FaultID 枚举然后统一修改所有状态访问宏将Function, Type替换为faultId并在宏内部计算组索引和位偏移。配置数组索引直接使用 faultId。函数接口也相应简化。难点2NVM 存储依赖问题原代码调用 NVM 写入接口目标工程中 NVM 驱动尚未完成。解决提供空实现函数NvM_SetRamBlockStatus仅作占位不执行实际写入。同时保留 NVM 数据结构后续可无缝对接真实驱动。难点3中断保护缺失问题原代码在修改状态数组时使用了中断挂起/恢复宏目标工程未定义。解决将相关宏定义为空若确认不会发生并发访问或适配 RTOS 临界区接口。难点4魔法数字泛滥问题代码中直接使用255、0xFFFF、0x01等数字可读性差。解决全部替换为有意义的宏如DIM_u8FAULT_CNT_MAX、DIM_u16TIMESTAMP_IGN_INVALID、DIM_u8DTC_SS_REQUIRED等。6、后续扩展DSM 模块预留了 DCM 和 FiM 的扩展接口后续若需要支持 UDS 诊断或功能抑制可快速补充无需重构核心逻辑6.1 轻量接入 DCM当前 DSM 已具备 DTC 存储、状态管理能力DCM 只需做“薄层映射”将 UDS 服务接口映射到 DSM 现有接口无需实现完整 UDS 协议栈核心映射关系如下UDS 服务 ID服务名称映射到 DSM 的接口0x19ReadDTCInformation读取 DSM 中的 DTC 列表、状态字、冻结帧数据0x14ClearDiagnosticInformation调用 DIM_vidClearFault() 或单个 DTC 清除接口0x22ReadDataByIdentifier读取实时故障状态、计数器值、全局故障等级6.2 轻量接入 FiMFiM 无需实现复杂的抑制策略只需建立“functionId → faultId”的映射表提供统一的功能权限查询接口应用层通过接口判断功能是否可执行避免散落大量 if 判断六、项目结果最终我们成功将 DSM 模块移植到 工程中编译通过无链接错误。通过模拟故障注入直接调用检测接口可以验证故障检测状态位正确置位计数器按配置增量累加达到阈值后记录位置位DTC 被存入 NVM 数据结构内存中冻结帧数据被捕获全局故障等级随失效模式计数器动态变化从 DEM 原理角度看我们实现了事件去抖通过计数器和可配置增量/减量实现类似 DEM 的 debouncingDTC 状态管理维护了 TestFailed、Pending、Confirmed 等状态位快照存储支持冻结帧FF1的锁定、复制和 NVM 管理老化机制通过老化周期计数器支持 DTC 自动清除框架已预留未实现的部分UDS 接口、复杂老化策略、多快照可根据后续需求轻量补充不影响当前使用。这个轻量化 DEM 内核已满足项目对故障记录、等级输出和功能抑制的需求且代码清晰、可移植性强为后续接入 DCM 或 FiM 留出了清晰的扩展点。