Autosar诊断实战系列24-Dem与BswM在ECU运行期间究竟擦出了哪些火花

本文深入探讨了Autosar中Dem与BswM的交互,包括在ECU运行期间的初始化、Shutdown过程中的工作内容,以及相关的配置开发,如ESH_DemInit Rule和Dem_Shutdown处理规则。Dem初始化涉及预初始化和初始化两个阶段,而Shutdown期间则着重于数据存储和Event的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在本系列笔者将结合工作中对诊断实战部分的应用经验进一步介绍常用UDS服务的进一步探讨及开发中注意事项, Dem/Dcm/CanTp/Fim模块配置开发及注意事项,诊断与BswM/NvM关联模块的应用开发及诊断capl测试脚本开发等诊断相关实战内容。
Autosar诊断实战导读快速链接:Autosar诊断实战系列导读
Autosar全模块实战专栏快速链接:AutoSar实战进阶系列导读

本篇我们一起学习下Dem与BswM间擦出了哪些火花即两个模块之间有哪些交互?主要内容如下:
在这里插入图片描述

1. Dem与BswM交互内容先睹为快

下图为Dem与BSW其他模块的交互,在图中我们可以看到Dem与模式管理模块的交互主要体现在上下电期间,涉及的接口主要有三个,针对Vector 协议栈而言:

1) 在EcuM的EcuM_AL_DriverInitZero阶段会先调用Dem_PreInit()进行预初始化;
2) 在BswM的状态机切换WakeUpToRun

### 关于 Autosar UDS 实战案例应用实例 #### 1. UDS 诊断服务 $11 的实现方式 为了使软件开发工程师能够更深入地了解如何实际运用 UDS 诊断服务,在此提供有关 UDS 诊断服务 $11 (Routine Control) 的具体实现方法以及相应的示例代码[^1]。 ```c // 示例 C 代码片段用于展示 UDS Routine Control 请求处理逻辑 void handleRoutineControlRequest(uint8_t *request, uint8_t requestLength){ // 解析请求数据... switch(request[2]){ case START_ROUTINE: startDiagnosticRoutine(); break; case STOP_ROUTINE: stopDiagnosticRoutine(); break; default: sendNegativeResponse(INVALID_REQUEST); return; } } ``` 上述代码展示了针对不同命令字节的操作响应机制,通过解析传入的数据帧并依据特定条件调用相应函数来启动或停止诊断程序。这有助于开发者构建自定义的 ECU 应用层功能以支持标准 UDS 协议中的例行控制操作。 #### 2. 基于工作实践的经验分享 除了理论上的讲解外,还结合了实际工作经验介绍了更多实用技巧和技术细节。这些内容涵盖了诸如 Dem/Dcm/CanTp/Fim 模块配置及其在项目实施过程中需要注意的地方;同时也涉及到了 BswM 和 NvM 这两个重要基础软件模块诊断系统的交互关系,并给出了具体的 CAPL 测试脚本编写指南以便验证所设计的功能是否满足预期需求[^2]。 #### 3. 复杂诊断流程示例 下面的例子说明了一个较为复杂的场景——即利用多种不同的 UDS 服务组合起来完成一项任务:向电子控制单元内部存储新的变体信息的同时记录当前时间戳作为版本号的一部分。此类多步骤事务通常需要精心规划各个阶段之间的依赖性和顺序安排才能确保整个过程顺利完成而不发生冲突或其他异常情况[^3]。 ```python def update_ecu_variant_info(new_variant_data): """ 更新ECU内的变体信息并向其写入日期 参数: new_variant_data -- 新版变体的具体描述字符串 返回值: bool 类型的结果表示更新成功否 """ try: # 发送读取现有变体ID的服务请求 current_id = read_existing_variant_identifier() # 构造新变体条目结构体对象 variant_entry = create_new_variant_entry(current_id + 1, datetime.now(), new_variant_data) # 将新建好的变体项序列化成二进制流准备传输给目标节点 binary_blob = serialize_to_binary(variant_entry) # 执行安全校验算法确认待发送的内容无误后再继续下一步骤 perform_safety_check(binary_blob) # 向指定地址空间内写入经过编码后的原始字节数组 write_memory_at_address(0x7E00, binary_blob) return True except Exception as e: log_error(e) return False ``` 这段 Python 风格伪码概括了一套完整的业务逻辑链路,从获取旧有状态到最终提交更改均有所体现。值得注意的是这里采用了分步式的编程思路使得每一步都可以独立测试从而提高了整体可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Autosar汽车电子进阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值