ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

AUTOSAR Dem模块从原理到实战:DTC读不到、去抖配置与踩坑指南

AUTOSAR Dem模块从原理到实战:DTC读不到、去抖配置与踩坑指南 简介本资源为Vector AUTOSAR Components中DemDiagnostic Event ManagerBSW模块的完整工程实现包面向汽车电子软件工程师、AUTOSAR初学者及ECU诊断功能开发人员用于快速理解与集成AUTOSAR标准诊断事件管理机制。资源共359个文件涵盖349个头文件.h、2个ARXML配置文件含Dem_bswmd.arxml等、1个C源文件Dem.c、4个Makefile*.mak、1个PDF配置说明文档、1个JAR生成工具及1个LIC授权文件压缩包大小11.49MB。已有298人学习下载表明其在实际项目配置与代码集成中具备较高参考价值。用户可直接获取符合AUTOSAR 4.x规范的Dem静态实现代码、标准化配置描述arxml、配套编译脚本与详细配置指南尤其适合开展DTC管理、事件触发、过滤逻辑及IF接口实现等诊断核心功能的移植与调试工作。 某个下午我接到一个现场支持电话客户那边说量产车上有个DTC报不出来。仪表上的故障灯已经亮了用CANoe的Diagnostic控制台发19 02去读已确认故障码响应里却什么都没有。后来反复排查发现问题出在Dem模块的去抖阈值配置上故障条件成立后的确上报了但持续时长不够计数还没达到确认阈值就被人为中断了。这个案例其实很典型。很多人第一次碰AUTOSAR诊断开发最先接触到的BSW模块就是DemDiagnostic Event Manager诊断事件管理器。它处在AUTOSAR服务层是所有诊断事件状态的管理中枢。车上任何一个传感器、控制器、通信链路的异常最终都要通过它变成可以被诊断仪读到的DTCDiagnostic Trouble Code诊断故障码。但Dem不像DCM那样直接跟总线打交道也不像NvM那样干底层存储的脏活累活它是一个纯粹的中间管理者——谁有故障都来上报诊断仪要读状态从它这里取。正因为这种性质它很容易被轻视一旦配置不好问题又非常隐蔽。这篇文章我打算结合Vector的工具链主要是DaVinci Configurator和CANoe把Dem从原理到配置再到踩坑经验完整过一遍。适合正在上手AUTOSAR诊断开发、或者已经写了一些SWC和BSW代码但总是被DTC相关问题卡住的工程师。内容不会太教科书都是实际项目里用得到的东西。1. Dem在AUTOSAR架构里到底管什么先厘清职责边界1.1 一个类比Dem是诊断事件的台账管理员在AUTOSAR服务层里模块很多DCM、Dem、NvM、FIM、Com、Nm新人在看架构图时很容易一脸懵因为不知道应该把Dem放在哪个位置。我的理解方式是把它类比成公司的台账管理员。DCM是前台接待员负责接收外部诊断仪发来的请求并回话Dem是后台管台账的人谁上报了故障就记录什么状态NvM是档案室的保管员负责把重要信息持久化保存FIM是门卫需要时决定某个功能是否允许工作。这样一拆就很清楚了Dem管的是事件状态而不是诊断通信也不是存储介质。它内部的逻辑是接收事件报告由SWC或其他BSW模块上报然后完成去抖、状态更新、老化、存储请求等一系列管理动作最后为DCM提供查询和清除接口。通常写应用层的人只需要调用Dem_SetEventStatus把故障状态告诉它就行写BSW和集成的人则需要把Dem的存储和DCM的请求路径全部打通。这里有个很关键的认识Dem本身不产生DTC它只负责“管理”。外界的故障状态是别人告诉它的它做的只是根据配置规则决定这个故障如何被确认、被记录、被清除。如果上层应用没有正确上报Dem再完善也没用反过来如果上层上报正确但Dem配置不对也会出现前面说的那种“故障灯亮了诊断仪什么都读不到”的情况。1.2 Dem的上下游接口关系从接口角度看Dem的上游是事件上报者。大部分情况下是SWC通过RTE调用Dem_SetEventStatus例如设置一个事件为DEM_EVENT_STATUS_FAILED或DEM_EVENT_STATUS_PASSED也可以是其他BSW模块直接调用。下游则有两个主要方向一个是向DCM提供诊断响应能力比如DCM收到0x19服务时会调用Dem接口读取DTC状态另一个是向NvM发起非易失存储请求因为DTC状态位和冻结帧数据需要在掉电后保留。可以用一张简单的接口关系表来看交互对象方向典型接口说明SWC / 上层模块上报事件状态Dem_SetEventStatus、Dem_SetOperationCycleState应用层把故障状态告诉DemDCMDem被DCM调用Dem_GetDTCStatusOfDTC、Dem_GetDTCSnapshot、Dem_ClearDTCDCM解析UDS请求后从Dem取数NvMDem调用NvMDem_NvramWrite、Dem_NvramRead回调将DTC状态、快照、老化数据持久化FIM事件状态被FIM订阅Dem_GetEventStatus等根据事件状态抑制或恢复功能有一个容易忽略的点Dem本身并不会直接操作Flash它只是把需要存储的数据交给NvM。如果NvM的Block配置没有为Dem分配足够的存储空间或者Dem和NvM的接口没有生成那么启动时调Dem_Init就可能报错或者DTC状态上电就丢。这也是后面排查故障时优先级最高的检查项之一。2. Dem的核心数据对象DemEvent、去抖、存储位与DTC状态的关系2.1 DemEvent和DTC是两回事很多从OSEK或者非AUTOSAR诊断栈转过来的人最容易把DemEvent直接等同于DTC。但AUTOSAR里这两个概念是分开的。DemEvent是配置里定义的一个诊断事件ID它是内部逻辑使用的标识DTC是符合诊断规范如UDS或OBD的故障码是外部诊断仪能看到的值。一个DemEvent通过DTC数值属性映射到DTC一个DTC也可以对应多个DemEvent。举个实际例子发动机控制器的“水温传感器对地短路”和“水温传感器对电源短路”在诊断仪上可能是两个不同的DTC在ECU内部也可能是两个DemEvent。但UDS标准里一个DTC还可以对应多个事件组用于OBD的IUPR等监测。AUTOSAR用DTC和多个Event映射来支持这种一对多的关系。配置时就要特别注意你面对的是一个Event的故障信息还是一个DTC级别的汇总信息。如果在做诊断规格定义时没有把Event和DTC的映射关系理清楚后面配置很容易把Event绑错DTC最终导致19 04读快照时张冠李戴。还有一个容易出现歧义的点DemEvent有“Event ID”在Vector DaVinci中通常用DemConf_DemEvent_XXX来标识。代码里调用Dem_SetEventStatus时第一个参数就是这个Event ID。它和DTC的数值没有直接关联只是配置内部的一个句柄。很多工程师在调试时看到DTC数值是0x012345就想去代码里搜索这个数字是搜不到的但搜索DemConf_DemEvent_XXX就能找到对应的配置。2.2 去抖DebounceDTC不误报的核心机制去抖是整个Dem里最贴近控制理论的部分。它的目的是过滤掉短时扰动避免一个只有几十毫秒的干扰信号直接置位DTC。AUTOSAR定义了两种主要的去抖策略基于计数器Counter-based和基于时间Time-based。基于计数器的Debounce策略实际在代码里就是一个累加和递减过程。每个DemEvent配置一个DebounceCounterMinimum和DebounceCounterMaximum。当故障条件成立例如应用层调用Dem_SetEventStatus(Failed)计数器向某个方向累加条件不成立时向另一个方向递减。只有计数器达到配置的DebounceThreshold时才真正将事件置为Confirmed。这种策略适合那些可以频繁采样的信号比如CAN超时、传感器电压超范围。基于时间的Debounce策略则更简单可以理解成一个计时器故障条件持续超过设定的时间后触发确认。它适合那些采样频率低、或者一次判断就足够可信的监测项。两种策略的选择不是拍脑袋决定的得看这个故障信号本身的特性。如果一个信号是连续量比如电压、电流、温度可以高频采样用计数器策略更稳如果一个信号是离散事件比如碰撞信号、挡位信号用时间策略可能更合适。这里给个实际经验去抖阈值不是越小越好。我见过一个客户把某事件的时间去抖设成100ms结果整车在冷启动时因为电源波动仪表上总会误报一个“控制器内部故障”。后来把阈值调到600ms误报就消失了。这个参数需要结合信号本身的意义和客户对误报率的要求来定量产前最好用实测数据回归一遍而不是拍脑袋写一个值。2.3 DTC状态位Dem对外输出的八位寄存器UDS的DTC状态位是理解Dem输出的关键。标准DTC状态字节共8个bit位名称含义典型置位时机bit0testFailed当前测试失败应用层报告Failed且去抖未完成的中间态bit1testFailedThisOperationCycle本操作循环内测试失败事件在当前操作循环里曾失败bit2pendingDTC待定故障事件曾被检测到但尚未确认bit3confirmedDTC已确认故障去抖计数/计时达到阈值bit4testNotCompletedSinceLastClear自上次清除以来测试未完成清除DTC后还没跑完一个测试周期bit5testFailedSinceLastClear自上次清除以来测试失败清除后事件失败过bit6testNotCompletedThisOperationCycle本操作循环内测试未完成当前循环还没完成检测bit7warningIndicatorRequested请求点亮警告指示器故障满足点亮MIL灯等条件Dem内部维护这些状态位并根据事件上报、去抖结果、清除请求、老化结果来更新。比如事件最初上报时可能只是testFailed位置1此时诊断仪用19 02读取“已确认故障码”是读不到的只有confirmedDTC也被置位后19 02才返回。AUTOSAR中DTC状态位是用DemDtcStatusBitStorage配置的可以选择bit-wise或byte-wise存储。bit-wise省空间但处理复杂byte-wise直观且不同状态位不互相覆盖。对现代MCU来说容量通常不是大问题我一般倾向于byte-wise排查时也容易对照状态位。3. 从故障发生到DTC上报Dem运行时的完整数据流3.1 第一步事件上报整个流程的起点是某个监测逻辑判断出异常。比如MCU的一个ADC通道检测到水温传感器电压超过4.8V应用层会调用Dem_SetEventStatus(DemConf_DemEvent_WaterTempSensorShort, DEM_EVENT_STATUS_FAILED)。这里要区分几个概念一个Event的状态上报分为FAILED、PASSED、PREFAILED、PREPASSED等。通常一个典型事件处理是先报PREFAILED或FAILED再经过去抖流程确认。AUTOSAR里的PREFAILED和PREPASSED本质上是为了支持一些需要“预扫描”的监测逻辑。比如某个测试在操作循环的最初阶段还没完成此时上报PREFAILED不等于真的失败它只是告诉Dem一个中间状态。这种细节在实际项目里特别容易让新手困惑——为什么我调用了Dem_SetEventStatus(FAILED)DTC并没有立刻确认因为它还要走后面那几步。3.2 第二步去抖与状态更新Dem收到报告后根据该Event配置的DebounceStrategy更新计数器或计时器。达到阈值后Dem内部将该Event的confirmedDTC位置1并触发后续的存储和指示器逻辑。同时根据配置决定是否设置warningIndicatorRequested位。这里还有一个容易被忽略的机制Dem的去抖计数器和DTC状态位是两个独立的存储对象。去抖计数器的值在未达到阈值前是不公开的但特定的DTC状态位如pendingDTC和testFailed会先置起来让外部诊断仪可以看到“这个故障发生过但还没确认”。这也是为什么有时20 02读不到但19 01能读到状态位的原因。3.3 第三步存储与快照事件确认后Dem并不会马上每次都去NvM里查——那样太慢。它通常先把数据缓存在RAM中同时通过Dem_NvramWrite请求把DTC状态、去抖计数、老化计数、快照数据等交给NvM。这里要提到UDS里的Qualifier和Record概念19 04读取DTC快照记录时DCM会调用Dem来取这些数据。每个DemEvent可以关联几个DataElement用来记录故障发生时的环境数据比如电压、车速、水温、里程。有一个值得特别提醒的点如果应用层没有把环境数据通过Rte_Write之类的接口喂给Dem那么19 04读回来的快照数据就会是全0或全F很多人会误判为存储错误。实际上配置没问题、NvM也没问题就是数据源没接。3.4 第四步诊断仪读取诊断仪发送UDS 0x19服务比如19 01读DTC状态、19 02读已确认DTC、19 04读快照信息。DCM解析请求后调用Dem接口获取数据然后格式化响应。注意此时如果DTC已经通过老化被清除了确认状态19 02就不会再返回它如果只是pendingDTC但未confirmed19 02也不返回。很多“为什么读不到DTC”的问题八成是状态位还没走到该被读取的那一步。CANoe里调试时最直观的方式是打开Diagnostic Console直接发UDS请求看响应字节。但响应字节只是结果想看Dem内部状态还得配合调试器或者CANoe里的CAPL脚本去读Dem的内部变量。这一步对于定位问题是决定性的。3.5 第五步清除与老化诊断仪发送UDS 0x14服务ClearDiagnosticInformation时DCM调用Dem_ClearDTCDem会清除指定DTC或所有DTC的状态位、快照数据等同时按配置保留例如老化计数和就绪状态。老化Aging则是另一种自动清理机制一个Confirmed DTC在连续若干个操作循环中不再出现故障其确认状态会被清除老化计数器减一直至降到0。操作循环OperationCycle这个概念很多新手会忽略。它可以是点火开关的一次OFF到ON也可以是ECU的一个Sleep-Wake周期。配置OperationCycle时要注意和系统休眠唤醒逻辑对齐否则会出现“明明没故障启动几轮后DTC却自动消失了”或“永远不老化”的问题。有些项目里整车休眠不是通过KL15断电而是通过网络管理报文此时OperationCycle的边界就要用网络管理的状态来定义不能简单依赖电源状态。4. 用Vector DaVinci配置Dem从空工程到生成代码4.1 配置前的准备ECU Extract与工具链Vector的AUTOSAR工具链主要用两件套DaVinci Developer负责应用层软件组件SWC设计DaVinci Configurator负责BSW配置与生成。在配置Dem之前通常会先拿到一个ECU Extract文件从整车AUTOSAR描述里提取出的本ECU通信矩阵和诊断数据里面已经定义了DTC清单、诊断服务使能信息等。用DaVinci Configurator载入这个文件会看到Dcm和Dem配置项可能已经有了一部分预设值。但要注意这些预设值只是把DTC的“元数据”导进来了具体每个Event的去抖方式、存储策略、NvM关联仍需要手动逐项配置。第一次打开DaVinci Configurator的Dem配置界面时界面左侧是一棵很大的配置树里面的参数数量可以轻松上百。千万别想着一口气全看懂先按优先级处理。4.2 核心配置项逐一看在实际工程里Dem配置项非常多但有四个方向是逃不开的。第一个是DemGeneral模块级参数。重点看DemDtcFormatDTC格式通常用3字节的UDS格式DemDtcStatusBitStorage决定状态位存储方式DemInitMonitor控制初始化时是否允许监控。还有一些参数影响存储布局比如字节序、对齐方式需要和诊断规格书对齐。第二个是DemConfigSet中的DemEvent。每新增一个诊断事件都要新增一个DemEvent条目绑定DTC编号配置Debounce策略和相关阈值配置EventStatus存储是否需要NvM。这里最容易出错的是DTC数值的格式UDS里DTC是3字节高字节是DTC高字节但在配置界面里可能显示为0x012345这样的整数。如果从Excel翻译规格书时看错位数DTC数值就会错。第三个是DemDataElement用于定义快照和扩展数据。每条DataElement要绑定一个DemEvent并设置长度、字节序、存储属性等。这块的设计应该提前在诊断规格书阶段做好到配置阶段只是照搬。第四个是DemNvData配置哪些数据需要写入NvM。通常对应DTC状态、去抖计数、老化计数和快照数据。这里要重点关注是否给足够的NvM Block以及NvM Block的属性是否满足掉电保存的要求。4.3 配置流程和代码生成配置顺序一般是这样先导入ECU Extract然后在DemConfigSet里添加Event再配置DataElement和NvData最后把Dem相关的NvM块对接到NvM配置里。全部完成后执行Generate按钮生成代码。生成后的Dem代码会出现在BSW模块的文件夹中比如Dem.c、Dem_Cfg.c、Dem_Cfg.h等与应用层代码一起参与编译。有一个经验生成代码后不要手动修改生成文件。AUTOSAR工具链生成的代码和配置是强关联的一旦手动改了下次重新生成时就会丢失而且这种丢失很难发现。如果需要定制逻辑正确做法是在Dem模块提供的回调函数里做扩展或者把定制逻辑放到SWC里。4.4 用CANoe做早期验证配置完生成代码之后建议尽早用CANoe建立诊断仿真验证。Vector的CANoe自带Diagnostic Console可以模拟诊断仪发送UDS请求配合CAPL脚本还能模拟应用层上报事件。比较快的验证路径是先用CAPL调用Dem_SetEventStatus接口的仿真实现来模拟一次故障然后在CANoe里用19 01看DTC状态位变化、19 02看是否返回、19 04看快照数据。如果状态位正常走完说明Dem配置基本可用。这里有个小细节如果在一个完整ECU项目里用CANoe仿真时Dem_SetEventStatus是直接调用生成的BSW代码还是通过RTE调用取决于工程里是否集成了RTE生成的通信文件。如果只是做BSW集成测试可以直接调用Dem_SetEventStatus如果做的是应用层联合仿真要走RTE的接口路线。两者看到的现象可能略有差异但状态位演变的逻辑是同一个。5. Dem与DCM、NvM、FIM的交互接口逻辑和状态位演变5.1 Dem和DCM谁服务谁很多人会搞混DCM和Dem的边界。DCM是诊断通信管理器管的是服务层的请求解析和响应。它知道UDS的0x19、0x14、0x85等服务但并不知道具体的DTC细节。当收到0x19服务时DCM要调Dem接口去拿DTC信息当收到0x14服务时DCM要调Dem接口去清除当收到0x85服务ControlDTCSetting时DCM还会调Dem的启用和禁用控制。所以Dem对DCM来说就像一个数据提供方。DCM不会自己维护DTC状态它只是把Dem产生的状态翻译成诊断协议里的字节回给诊断仪。如果你发现DCM能正常响应但响应内容不对比如DTC数量为0问题大概率在Dem侧而不是DCM侧。这个边界理解起来很简单但实际项目里经常有人把DCM配置里的DTC列表和Dem的Event列表搞混。DCM里配置的DTC列表只是告诉DCM这个ECU支持哪些DTC而Dem里配置的是每个DTC对应的诊断事件、去抖和存储逻辑。两者的DTC集合需要一致否则会出现DCM能解析请求但Dem查无此DTC的情况。5.2 Dem和NvM存储不能靠脑Dem的存储机制离不开NvM。在AUTOSAR里NvM通过NvM_Write和NvM_Read请求服务来完成数据的非易失存储。Dem需要NvM的Block来存DTC状态、快照、扩展数据。这些Block一般会被配置成CRC计算、冗余存储等属性具体取决于项目对数据完整性的要求。最典型的配置问题是给DemEvent配了DataElement但没在NvM里对应创建足够大小的Block或者Block大小小于Dem需求导致烧录后CRC校验失败DTC状态上电就丢。这个问题在开发阶段不容易发现因为RAM里数据是正常的一旦整车断电重启就原形毕露。还有一个NvM启动时序的问题NvM在BSW初始化阶段会经历一轮读操作把非易失数据从Flash读到RAM。Dem在NvM完成读取之前如果被请求读取DTC状态可能拿到的是空数据。配置BSW调度时要保证Dem和NvM的初始化顺序合理特别是多核ECU里两个模块可能不在同一个核上需要额外的核间同步机制。5.3 Dem和FIM故障状态如何抑制功能FIMFunction Inhibition Manager在很多项目里和Dem会配合使用。它可以订阅某个诊断事件的状态当事件进入Confirmed或Passed等状态时抑制或恢复某个功能。例如“碰撞信号”这个事件确认后FIM会抑制高压下电功能车辆恢复正常后复位事件又会解除抑制。从实现角度看FIM主要通过Dem的接口或直接读取Dem内部状态来获取事件信息。配置时要确保Dem的Event能被FIM模块的抑制条件引用到同时注意这两个模块的初始化顺序和任务执行顺序避免在Dem初始化之前FIM就开始查询。实际项目中FIM经常会配合安全相关功能使用。如果FIM查询事件状态时由于Dem还没初始化返回了错误值可能会错误抑制一个安全功能这种问题在实车上是很难接受的。所以在做BSW集成时一定要检查RTE生成后的Task Mapping确保Dem的状态更新任务在FIM的评估任务之前执行。6. Dem实战中最容易踩的坑排查思路与调试方法6.1 坑一19服务读不到DTC——先看状态位这个坑最常见而且很多工程师一上来就怀疑DCM没有正确响应。实际上如果DCM可以正常响应比如成功响应0x59但返回的DTC列表为空要把排查重点放在Dem的状态位上。用CANoe或调试器查看DemEvent当前的状态位是testFailed置位了而confirmedDTC没置位还是pendingDTC已经置位但confirmedDTC没有如果只有testFailed说明此事件正处于去抖中或去抖未达到阈值如果确认了但仍读不到可能是配置的DTC数值不对或诊断仪请求的是19 02而事件状态只满足19 01。这种排查思路虽然简单但能过滤掉一大批初级问题。6.2 坑二快照数据总是全0或全F这个坑一般出在DataElement配置或应用层数据没有写入。检查方向有两个一是配置中该Event关联的DataElement是否确实有来源比如通过Dem_SetDataElement接口写入或通过RTE和SWC连接的Port喂入二是NvM块大小和属性是否匹配。如果NvM读回的数据无法通过校验Dem可能直接丢掉了存储数据导致快照读不出来。另外如果只是调试阶段也可以在CAPL里模拟写入一些快照值验证DCM和Dem的19 04路径是否完整。这种方法可以把问题快速定位到“是配置没配对”还是“是存储路径有问题”。6.3 坑三DTC重启后就丢这类问题十有八九是NvM块没有正确关联或者Dem的存储模式没有配置成永久存储。去配置里看两个地方是否给这个Event配置了NvData块并且该NvM块是否在系统初始化后能完成一次读操作Dem的存储条件是否设置了仅在Confirmed后进行存储如果事件在确认前ECU就掉电可能什么都没来得及存。这种情况下用示波器抓一下ECU供电掉电时序会很有效确认ECU是否在掉电前有足够时间执行NvM写入。AUTOSAR的NvM写入是异步的如果掉电太快写操作来不及完成数据就会丢。有些项目会加掉电检测电路在电压跌落时给MCU留出十几毫秒的时间做紧急NvM存储Dem的掉电存储就依赖这扇窗口。6.4 坑四去抖参数不合适导致误报或漏报误报通常表现为故障灯在不该亮的时候亮、诊断仪能读到异常DTC漏报通常表现为该故障已经出现但还没被记为Confirmed。这两个都回到Debounce配置。排查方法是系统性地调整阈值在实际台架或整车上采集故障信号的真实持续时间分布再反过来确定阈值。比如某电压类故障在冷启动时有多条500ms级别的瞬态毛刺如果阈值设为300ms大概率会误报设为800ms则能滤掉多数瞬态。项目里应该把这个过程的测试和确认记录成一份简单的“去抖参数确认表”标好每个事件的最长瞬时噪声持续时间与最终阈值之间的余量。6.5 坑五诊断仪只能读本ECU读不到其他ECU这个往往是网络管理配置的问题不算Dem本身的锅但症状经常被误归到Dem头上。如果诊断仪发出的是19 02服务目标ECU响应了但应用层一直觉得故障没存在此时需要确认故障事件上报的源是否真的在有故障时调用了Dem_SetEventStatus以及内部状态机是否允许上报。比如DTC控制在0x85禁用状态下事件即便真实发生Dem也不会更新它的确认状态。排查时可以通过CANoe的CAPL脚本设置一个Debug变量在事件上报函数里加断点观察。如果应用层确实没调用那就是应用层的问题如果调用了但Dem状态没变那就回到Dem配置和去抖逻辑上继续查。6.6 调试Dem时的效率工具CAPL自动化脚本最后分享一个我在实际调试Dem时很常用的技巧在CANoe里创建一组sys变量来模拟事件状态通过CAPL脚本触发Dem_SetEventStatus然后定时读取Dem内部的状态位把DTC状态变化过程打印出来。这样每次配置变更后只需要运行同一个脚本就能快速回归验证所有事件的配置是否正确。这个脚本的核心逻辑很简单就是遍历配置里的所有事件依次上报Failed等一段时间再读取状态位。如果某个事件在配置里漏配了去抖阈值或者NvM块这个脚本就会立刻暴露问题。尤其是在项目周期后半段DTC数量动辄上百个时手动一个一个测不现实自动化脚本几乎是必须的。我自己调试Dem的经验是不要等到整车上电才验证越早做配置级验证越省时间。很多问题在配置阶段就能通过状态位推演发现撑到实车上再排查定位成本会翻好几倍。本文还有配套的精品资源点击获取
返回列表