ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AUTOSAR工程搭建实战:从DBC/CDD导入到Davinci Configurator配置全流程

AUTOSAR工程搭建实战:从DBC/CDD导入到Davinci Configurator配置全流程 把 AUTOSAR 工程从零搭起来而且还要把手里的 DBC 和 CDD 塞进去这事儿我干过不止一次。说真的第一次碰 Davinci Configurator 的时候我整个人是懵的——界面上密密麻麻的模块、上千个配置项跟以前在 Keil 和 CubeMX 里写单片机完全不是一个画风。但你只要熬过第一次完整流程搞清楚它其实是“按图索骥”的干活逻辑后面再配别的控制器无非就是换 DBC、换 CDD、重新生成一遍的事。这篇文章就是把我自己踩过的坑、用过的套路捋出来从新建工程开始到导入 DBC 配通信栈再到导入 CDD 把诊断栈激活最后生成代码跟 MCAL 对接。看完你至少能明白整条链路是怎么走通的以及每一步到底要核对哪些东西。1. 动手前先搞清楚Davinci Configurator 在整个 AUTOSAR 栈里干啥很多人上来就点“New Project”结果配到一半发现连“该填什么”都不知道。我的建议是动鼠标之前先把工具在整个 AUTOSAR 软件架构里的位置搞清楚这比什么都重要。1.1 一个工具链里的两个“Davinci”VECTOR 家的工具链里有两个长得像兄弟的工具Davinci Developer 和 Davinci Configurator。我见过不少新手把这两个搞混或者以为装一个就够了。简单说Davinci Developer 负责软件组件SWC和虚拟功能总线VFB层面的设计比如你系统里有哪些应用层组件、它们之间怎么连、Runnable 怎么映射到任务上而Davinci Configurator 负责的是基础软件BSW层面的配置包括 CAN 通信栈、诊断栈、存储栈、I/O、操作系统等。换句话说你从 DBC 里导入的报文和信号最终是要通过 COM 模块发给应用层 SWC 的你从 CDD 里导入的诊断服务最终也是要通过 DCM 和 DEM 进入应用层逻辑。所以 Configurator 是连接“通信/诊断硬件细节”和“应用层软件需求”的枢纽。整车厂给你 DBC 和 CDD目的就是让整车的通信行为和诊断行为统一到一个可执行配置里不然各控制器自己拍脑袋定义信号整车联调就是灾难。这个分工决定了你后面的操作如果你们的项目把软件组件通信也纳入 AUTOSAR你通常需要先在 Developer 里建模接口再在 Configurator 里把底层的 PDU 和 Signal 映射到这些接口上。如果项目比较小也可以只配 BSW应用层直接裸读写 COM 的信号反正最终都能跑。1.2 DBC 和 CDD 分别解决什么问题我再展开一点免得后面操作的时候不知道自己在干什么。DBCCAN Database描述的是整车 CAN/CAN-FD 网络上的通信矩阵哪个报文Frame由哪个节点发帧 ID 是多少里面包含哪些信号Signal每个信号在哪个字节、哪个比特位是 Intel 格式还是 Motorola 格式周期多少初始值多少。这些东西说白了就是“整车通信的交通规则”。没有 DBC你连帧 ID 和信号偏移都得手动一个个敲那真的是既费眼睛又容易错。CDDCANdela Diagnostic Description则是诊断规范文件由 Vector 的 CANdelaStudio 工具生成。它描述的是这个 ECU 支持哪些诊断服务比如 $10 会话切换、$22 读 DID、$2E 写 DID、$19 读 DTC、$14 清除 DTC各个 DID 的地址、长度、访问权限DTC 的数量和掩码安全访问算法诊断仪通信参数等等。CDD 导入 Configuretor 后DCM 模块会自动生成诊断服务的分发处理框架你能省掉巨量的手写诊断解析代码。如果用别的诊断工具生成的 ODX/PDX虽然也能转但 CDD 是 Vector 生态里的“母语”兼容性最好。1.3 装好工具、备好文件再开工不建议边配边下工具。我实际用的版本是 Davinci Configurator Pro 和 Davinci Developer配合 EB tresos 做 MCAL 配置。它们的 Licence 管理是独立的你至少要确保三个东西在手有效的配置工具 License且里面包含你要用的单片机支持包如果 License 不全某些安全或通信模块会被锁定点了没反应。可用的 MCAL 配置工具一般用 EB tresos也可以是供应商给的独立生成器以及对应的 MCAL 驱动代码包。一份干净的工程模板路径或者能用生成代码直接编译的编译器工程编译器我用过 GCC 和 Tasking都可以关键是链接脚本和启动文件要匹配你的芯片。另外文件夹路径千万别用中文也尽量别带空格。我踩过这个坑生成的代码里某些 makefile 会莫名异常后来发现是路径里有中文导致。工程目录建议放到纯英文路径下越简单越好比如D:\Autosar_Workspace\ProjectName这种。2. 新建工程的操作套路从选芯片到选模块走到这一步工具装好、License 激活、文件备好下面就是新建工程的具体操作。我这里写的步骤是基于我常用的 Davinci Configurator Pro 版本不同小版本界面可能有一点点差异但大逻辑跑不掉。2.1 新建工程的前置准备新建之前我强烈建议你把以下信息列成一份清单免得配置到一半回去翻芯片手册芯片具体型号比如 S32K344、TC397、RH850 之类不同芯片对应不同 MCAL 驱动架构。使用的通信外设几路 CAN、CAN-FD 是否支持、波特率设置车控上常见 500k、2M/5M 的 FD。网络管理模式是否需要 AUTOSAR NM、是否走 CAN 唤醒。诊断需求支持哪些诊断服务、DTC 格式是 UDS 还是 OBD读 DID 和安全等级。DBC/CDD 文件版本最好用整车厂最终冻结版不然改来改去会烦死。我见过很多新人上来直接新建结果到导入 DBC 那一步发现自己的芯片 CAN 通道数不够支撑整车的报文数量又得退回去改工程浪费时间。所以前置检查一定要做。2.2 新建工程的核心步骤打开 Davinci Configurator 后从主菜单选择新建工程然后按下面思路一步步走填工程名和存放路径。工程名建议跟 ECUID 挂钩比如VCU_BCM、BMS_Master这样以后导出 ARXML 给整车集成别人一眼能看出你是哪个控制器。选择 AUTOSAR 版本。现在主流是 4.2.2 和 4.4.0具体看你手里的 MCAL 和工具链支持哪个别盲目追新。同一个工程中途尽量不要切换 AUTOSAR 版本很容易出现生成的 RTE 与应用层接口不匹配。加载 ECU Extract如果整车厂有提供。有的项目会给一份系统级 ARXML里面已经包含了你这个控制器相关的通信矩阵和拓扑信息。如果有直接导入后面 DBC 的内容就能跟这个 ECU Extract 对齐省事很多。创建 ECU 实例。填 ECU ID这个名字要跟 DBC 里的节点名或者整车规范里的简称一致能少很多信号映射的麻烦。选择要配置的模块。新手先别全选按需求勾选。比如当前只做 CAN 通信和诊断那就勾 CAN Driver、CanIf、CanTrc、PduR、Com、Dcm、Dem、NvM、ComM、CanNm 这些。如果有 LIN 或 FlexRay 需求再相应增加。过程中工具会问你要不要生成模块清单和初始 ARXML全部确认生成就行。生成的初始工程里每个 BSW 模块都是“默认状态”大部分参数为空或带默认值你需要在后续配置里填。2.3 模块版本和依赖关系的提前判断勾选模块的时候要有一点“依赖意识”。比如你要用诊断必须要有 Dcm、Dem、NvM而且 Dcm 底层依赖 PduR 和 CanTp你要用 CAN 通信必须要有 Can、CanIf、PduR、Com如果是诊断报文还得分流到 Dcm你要用网络管理必须要有 CanNm、ComMComM 还回调 BusSM 状态。我的习惯是先画一张模块依赖草图再在配置工具里勾选。Davinci Configurator 在生成的时候会校验模块间依赖缺了会报错但你提前设计好后面少折腾。2.4 新建后马上要做的几件事不要一上来就导入 DBC/CDD先把工程骨架确认好。我会按这个顺序检查看生成的 BSW 模块清单里有没有被自动带入的不必要模块。如果有用不到的比如纯 CAN 项目却生成了 LinIf可以在模块列表里禁用掉减少生成代码量。确认“ECU 提取/系统约束”视图里本控制器的网络节点名是否正确。这直接关系到导入 DBC 后哪些报文归你管。配置时钟和通信波特率基础参数时先别动等 MCAL 集成时再统一对。Configurator 里的 CanController 波特率只是一个参考配置实际底层的波特率在 MCAL 的 Can 模块里设定两边必须一致不然通信起来全是错误帧。3. 导入 DBC把通信矩阵变成 CAN 通信栈的配置DBC 是通信配置的“源”导入 DBC 算是整个配置过程里最舒爽但也最需要小心的一步。工具能自动生成一大堆配置但这些自动生成的东西可能跟你手头应用层接口对不上后续必须检查。3.1 导入前先打开 DBC 看一眼别急着双击导入先用记事本或者 CANdb 打开 DBC 看一眼主要确认三件事波特率信息DBC 里的BS_:行记录了默认波特率比如BS_: 500000。这个值决定了后面 CanController 的初始化参数。节点定义BU_:行是节点列表。你要确认你负责的控制器节点名在列表里并且知道这个节点是哪些报文的发送方、哪些报文的接收方。报文和信号的数量级大致扫一眼BO_关键字后面的报文数量心里有个数后面核对的时候知道总量是多少。我有一个自己的小习惯导入 DBC 之前先用 Vector CANdb 或者脚本把 DBC 里的报文列表导成一个 Excel标注好“哪些报文是当前 ECU 发送”、“哪些是应接收”。等导入完 DBC我就拿这个 Excel 去对照工具里生成的 PDU/Frame 集合漏一条都能发现。3.2 DBC 导入到 Configurator 的具体操作在 Davinci Configurator 里通常在“Communication”相关的视图或者右键菜单里能找到Import DBC入口。操作步骤大概如下选择 DBC 文件路径确认 DBC 版本解析成功。工具会显示 DBC 里的所有报文和信号列表。选择目标模块。默认情况下DBC 导入会同时生成 CanIf、PduR、Com 三层配置Frame 对应 CanIf 层的接收/发送对象PDU 对应 PduR 的 PDU 条目Signal 对应 Com 模块的 IPDU 和信号组。选择需要映射的节点/ECU 视角。这一步是关键同一个 DBC 里有十几个节点你必须在导入向导里选中“我这个 ECU 是哪个节点”。有的版本支持通过 ECU Extract 自动判断手选也行。指定报文类型哪些是应用报文哪些是诊断报文0x7DF/0x7E0/0x7E8 这类 UDS 物理寻址和功能寻址哪些是网络管理报文0x500 的 NM 报文。工具一般能根据 ID 和命名猜但你要复核。诊断报文一般建议留给 Dcm/CanTp不走 Com。点击导入生成配置。工具会创建一堆 PDU、Frame、Signal 对象并且把它们关联到 CanIf、PduR、Com 模块的配置容器里。导入完成后建议立即做一次校验Validation看有没有红色的错误项。常见的错误包括某些信号在 DBC 里的数据类型跟 Com 模块不支持的类型冲突、同一 PDU 被绑定了多个发送方向等。3.3 导入后要核对的映射关系导入成功不代表配置正确。我把每次导入后必核对的内容整理成了表格照着查不会漏检查项核对内容常见问题Frame 与 PDU 映射CanIf 层每个发送/接收 Frame 对应的 CAN ID、DLC、FD 标志是否正确CAN ID 被扩展帧/标准帧搞错PDU 与 Signal 映射PDU 内信号的起始字节、长度、字节序Intel/Motorola与 DBC 一致大端信号起始位算错发送周期Com 模块中 IPDU 的传输周期是否设置是否与 DBC 的周期一致周期为 0 导致监控超时报错接收超时监控是否需要开启 Timeout 监控超时阈值是否设置超时监控没开丢报文无感知信号初始值/无效值Com_Signal 的 InitValue 是否合理默认值为 0但整车要求无效值是 0xFF诊断报文路由诊断 PDU 是否正确路由到 CanTp/Dcm而不是被 Com 层消费诊断报文进了 Com导致诊断仪未响应每次做完这些检查我基本就能放心进入下一步。如果你们项目用的不是 Configurator 的自动映射而是整车厂给的 ARXML那这些核对也适用——只不过来源从 DBC 变成了 ARXML 里的通信矩阵约束。3.4 通信栈里的关键参数配置DBC 导入后你还需要在模块配置里做一些细化。我挑几个高频且容易翻车的参数说一下。Com 模块是整个通信栈的“应用层门面”。在 Com 里你可以把 PDU 内的信号打包成组设置信号的发送模式周期/事件/混合。我实际项目里常做的事情是把整车所有周期报文设置好周期把某些事件触发信号比如按钮状态配上事件发送模式并且确保同一个 PDU 里既有周期信号又有事件信号时发送逻辑不会互相覆盖。尤其注意Com 模块里信号更新是有“内部缓冲区和 shadow buffer”之分的如果你在中断里直接读写 Com 信号又不加保护有一定概率读到旧值。PduR 模块是路由器扮演的是“分发中转站”的角色。DBC 导入后PduR 里会有大量 PDU 路由路径。你可以在这里加入网关功能比如把从 CAN0 进来的一路报文只通过 CAN1 转发出去。PduR 有个坑是路由路径的“源-目的”对应关系必须唯一而且一旦某个 PDU 被标记为“仅本机消费”它就不会再路由到其他总线。CanIf 模块处理的是具体硬件收发。导入 DBC 后CanIf 会根据 Frame 自动生成硬件通道绑定关系但你仍然需要检查每个 Frame 绑定的 CanController 是否和你 PCB 上的实际走线一致。比如你 DBC 里是 CAN1 的报文但硬件上这路报文接在 CAN2那你就得在 CanIf 里调整通道。CanTrcCAN Transport Layer一般是给诊断大报文用的如果你需要支持 ISO-TP 传输比如 UDS 的 $19 读一堆 DTC一定不要漏配。DBC 导入时如果自动生成了 CanTp 的连接你要检查源地址和目的地址——物理寻址 0x7E0/0x7E8 和功能寻址 0x7DF/0x7D9 都要配到。3.5 导入 DBC 时踩过的几个实坑我在几个量产项目里用这套流程配通信踩过一些坑写出来给大家避雷。坑一DBC 文件中某个信号名或报文名带空格或特殊字符。AUTOSAR 配置对象里很多名称不允许有空格但 DBC 是允许的比如某些供应商导出的报文名写成BMS_Status_ 1。导入时工具会自动清洗但清洗后的名字跟你应用层接口宏定义对不上。我的处理方法是先把 DBC 过一遍脚本把非法字符统一成下划线再导入。坑二同一个信号在多个 PDU 里出现。有的整车通信里同一个物理信号比如车速会在好几个报文里重复发送。这本身没问题但在 Com 层如果把这几个信号都映射到同一个应用层接口上就会产生写冲突。你需要在生成 RTE 之前确认这是两个独立的端口还是只保留其中一个来源。坑三DBC 导入后某些报文周期性为 0。有的 DBC 写报文周期时只写了触发方式没有指定具体周期值。导入后 Com 里这个 IPDU 的 TransmissionPeriod 是 0这时候如果应用层没有显式触发报文就永远发不出去。我曾经因为这个原因联调时发现某个报文消失查了半天最后在 Com 里给它补上了周期。4. 导入 CDD让诊断栈在工程里跑起来通信配通了下面就是诊断。CDD 导入到 Davinci Configurator 里主要作用是把 CANdelaStudio 里定义的诊断规范直接映射到 Dcm 和 Dem 模块的配置容器里。导入后Dcm 会自动生成一套基于回调的诊断服务分发表加上你填的底层函数就能和诊断仪通信。4.1 一份合格的 CDD 文件长什么样一个 CDD 文件本质上是一个 XML 容器里面包含诊断仪和 ECU 之间的寻址规则物理/功能寻址 ID。诊断服务的会话类型默认会话/编程会话/扩展会话以及各服务允许在哪些会话里执行。DID 列表及读写权限、长度、数据格式。DTC 列表以及伴随的故障掩码、老化计数等参数。安全等级和安全访问算法Seed Key的入口定义。例程控制RoutineControl和下载请求RequestDownload所需的 DIDs 范围、内存地址定义等。我自己看 CDD 的方式比较朴素先打开诊断需求文档再打开 CDD 里对应的服务/ DID / DTC一行行对。别嫌麻烦诊断这玩意错一个 DID 就得返工。4.2 CDD 导入到 Configurator 的步骤导入入口通常在 Dcm 模块配置里选择Import CDD或类似菜单。操作步骤在模块树里展开 Dcm找到导入入口。选择 CDD 文件工具会解析出里面的诊断定义。勾选要导入的服务和 DID。如果你只想用 CDD 里的部分 DTC也可以只勾选需要的 DTC 集合但实际项目中我一般全量导入然后删除不需要的。确认诊断 PDU 的路由目标。CDD 导入通常需要一个已经存在的诊断通道它会自动把诊断请求 PDU如 0x7E0和响应 PDU如 0x7E8绑定到 Dcm 模块的 Rx/Tx 适配器上。导入后立即校验。Dcm 模块里会生成一堆 ConfigSet你要确认服务 IDSID没有重复、DID 范围没有重叠、DTC 的编号格式跟需求表一致。导入完成后我一般会生成一个“诊断服务矩阵”Excel 表把 CDD 里的服务和生成后的宏/回调函数名做对照。后面写底层处理函数的时候拿着这张表填回调就行不容易糊。4.3 诊断栈涉及的几个关键模块CDD 导入后诊断栈的配置不只是 Dcm 单个模块的事它还牵扯到下面几个模块的联动。DcmDiagnostic Communication Manager是诊断栈的核心。它解析诊断请求根据请求的 SID 分发到对应服务处理器。Dcm 配置里最重要的是“诊断服务表”DiagnosticService以及每个服务的“会话/安全等级条件”。DemDiagnostic Event Manager负责 DTC 记录、老化、快照和扩展数据。CDD 导入后Dem 里通常会生成与 DTC 对应的 Event 定义你需要把应用层上报故障的接口函数和这些 Event 关联起来。注意 Dem 的配置错误很隐蔽常见的是 Event 优先级和老化次数设置不对导致某些故障无法被记录。NvMNon-Volatile Memory Manager提供掉电保存的 DTC、老化计数器、快照数据等功能。你需要在 NvM 里为 Dcm/Dem 的数据块预留存储否则诊断数据一断电就丢。CanTp是诊断传输层。如果 DBC 导入时已经自动绑定了诊断 PDU 到 CanTp那你只需要确认 CanTp 的分段发送参数比如最大单帧长度、帧间隔时间。如果没绑定需要在 CanTp 里手动添加 Channel并配置源地址/目的地址。ComM是通信管理器。诊断一般要在网络可用的状态下进行所以 ComM 的配置里通常会有“诊断模式”的 PN 请求。如果你没有配置 ComMDcm 也能跑但会出现“诊断仪叫醒总线但网络层没起来”之类的问题。4.4 CDD 导入后必须检查的事项导入 CDD 并不代表万事大吉我每次导入诊断文件后必查以下几点诊断会话配置默认会话是不是 NonDefault 会话能否正确切换扩展会话里能执行的写服务是不是足够。安全访问算法看 CDD 里安全级别有几级Seed 和 Key 的长度以及配置生成的 Dcm。 Confirmation 的回调函数是否对应到你实际写的 SeedKey 算法。DID 属性DID 的读写权限、DataFormat、长度长度是否和诊断需求表一致。这里最容易被忽略的是 DID 的“数据对象定义”有的 DID 是单字节有的是一整块数据。CDD 导入后容易把长度解析差一个字节导致诊断仪读出来长度不对。DTC 的 aging 和 debounce如果 CDD 里你的 DTC 配置了复杂的防抖策略而 Dem 里没有完全导入那实际故障可能不会按预期记录。我遇到过一次特别折腾的问题DTC 导入后诊断仪能读到故障码但清除故障码失败。后来查了半天发现是 NvM 的数据块没有开启 WriteAll导致 Dem 写入 DTC 状态位时被卡住了。类似这种“跨模块”问题光是盯着 Dcm 看永远看不出来。5. 生成代码、集成 MCAL打通最后一步配置工具里画了一堆表格最终必须落到能编译、能烧录、能跑的 C 代码。Davinci Configurator 的代码生成和 MCAL 集成是整个流程里最“手工”的环节因为工具链之间虽然有集成插件但真正干活的时候还是要自己理清楚文件关系。5.1 从 Configurator 导出 BSW 代码在 Davinci Configurator 里点击生成Generate Code后通常会在工程目录下生成一个输出目录里面按模块拆分成头文件和源文件比如Can/、CanIf/、PduR/、Com/、Dcm/、Dem/、NvM/等目录每个目录下有*.h、*.c和*.arxml三类东西还可能会有Rte_*相关的文件如果关联了 Davinci Developer。生成完代码不要急着一股脑全塞进 Keil 或 Tasking 工程。我通常按模块把生成文件拷贝到项目工程里的BSW/目录保持目录结构与工具输出一致避免后续增量更新时丢文件。另一个重要点是生成代码里有大量需要“用户填写”的桩函数Stub。比如 Dcm 模块里Dcm_Appl_*、Com 模块里的Com_App_*回调以及 Dem 模块里应用层上报故障的Dem_ReportErrorStatus调用。这些桩函数的实现通常在应用层工程里你需要确认编译器能正确链接到它们。5.2 与 EB tresos / MCAL 的集成方法MCAL 一般由芯片原厂或 Tier1 提供常见的是 EB tresos 工程生成。MCAL 提供的是最底层驱动比如 CAN 控制器寄存器级操作、SPI、EEPROM、Port、Mcu、GPT 等。Davinci Configurator 生成的 BSW 是“上层驱动”它的 Can_Write、Can_Read 等函数最终会调用 MCAL 的 API。实际集成时有一个固定套路先用 EB tresos 新建 MCAL 配置工程选择芯片型号配置 MCU 时钟、CAN 波特率、Port 复用、中断优先级等。生成 MCAL 代码后把 MCAL 代码目录挂进编译工程。把 Davinci Configurator 生成的 BSW 代码目录也挂进编译工程。在工程里把中断服务函数的入口接上比如Can_Controller0_TxInterrupt、Can_Controller0_RxInterrupt要在Vector.irq或者芯片的中断向量表里注册。统一协调两个工具生成的文件名冲突。比如有些芯片厂家也会提供一份Can.h跟 AUTOSAR 标准接口的Can.h同名你需要把 MCAL 的接口头文件路径放在前面或者做一层重命名。折腾完这一圈你才能进入编译环节。第一次编译大概率报错一堆别慌大部分是路径没加全、宏开关没对齐、或者某个目标平台的编译选项差异。5.3 编译前必须过的“三查清单”我先说结论AUTOSAR 集成阶段90% 的问题都出现在“配置参数不一致”上而不是 C 语言本身。所以我烧录之前必做如下检查查模块开启情况确认你没有把某个 BSW 模块设置为生成代码但配置里又保留了它对应的 PDU 路由或信号引用。这种情况在编译阶段会出现未定义符号但错误信息可能指向莫名其妙的函数。查中断映射CAN 收发中断、定时器中断是否与 MCAL 配置一致。如果中断没有注册现象通常是“CAN 报文一直在接收队列但应用层永远看不到”。查文件编码有些工具生成的源文件默认是 UTF-8 with BOM而你的编译器对 BOM 不友好会导致第一个文件编译报错。建议统一转成 UTF-8 without BOM。这些听起来琐碎但每一个我都在项目里真实遇到过而且排查起来往往比配配置更耗时。6. 新手最容易踩的坑与排查实录终于到了我最想写的部分。下面这些坑不是我查文档查出来的是真实敲过代码、抓过波形、盯过调试器换来的。6.1 DBC 导入后Can 报文发不出去现象DBC 导入成功Com 里信号配置看起来都对但程序跑起来以后CAN 总线上一帧报文都没有。排查思路网上很多人第一反应是查 CanIf 和 Com但我建议先从底层往上查。先看 MCAL 的 Can 模块有没有被调度调用起来比如 Can_MainFunction_Write 有没有被执行再看 CanIf 有没有把 PDU 放到 Can 的硬件队列里。我发现一个特别高频的原因Com 模块的 IPDU 传输周期没有配置或者配置成了事件发送Direct但应用层没有调用 Com_SendSignal 触发。DBC 导入时 Com 的发送模式不一定总能自动带出需要手动确认。另外还要检查一个冷门但关键的点Com 模块的ComGeneral里是否开启了ComSignalSupport。如果这个开关没开即使你在配置里能看到信号生成的代码也可能不包含真正的信号更新函数。6.2 CDD 导入后诊断仪发服务请求没响应现象诊断仪连上 CAN发送 $22 读 DIDECU 完全没反应总线上一帧响应都没有。排查思路先确认诊断请求报文是不是进来了。这种问题很大概率出在 PduR 的路由配置上Dcm 的接收 PDU比如 0x7E0没有正确连接到 CanTp 和 PduR。另一个常见原因是诊断请求 PDU 被 Com 模块接收了导致 Dcm 根本看不到数据。解决办法是在 DBC 导入时明确标记诊断报文不要让工具把它们归到 Com 的应用报文集合里。再有就是字节序问题。CDD 里的诊断请求是“报文流”而 Dcm 在处理时按字节数组来解析。如果你的 CDD 里定义了复杂的 DID 数据结构而 CAN 总线上报文大小端和 CDD 的DataFormat不一致Dcm 解析后就会得到乱码导致服务匹配不上。这种问题调试时用 CANoe 的诊断窗口能看得更清楚。6.3 生成代码后编译报错重复定义现象代码生成后编译时报multiple definition而且指向的是某个通用头文件里的宏定义或者全局变量。这种情况大多是因为你把两个工具生成的代码混放在同一个目录导致同名头文件被包含两次。比如 MCAL 里的Can.h和 BSW 层的Can.h不一定是同一个文件。我的处理方式是把 MCAL 和 BSW 分成两个独立 Include 路径并且控制 Include 顺序先 MCAL 后 BSW 或者反过来按项目的实际依赖来。另外AUTOSAR 的全局常量通常都在Std_Types.h、Compiler.h这些公共头文件里如果这些头文件出现了两个版本一份来自工具 A一份来自工具 B那报错就更多了。我建议统一指定一份“平台公共头文件”让两边都依赖它不要各带各的。6.4 排查故障的调试小技巧这里分享一个我用得很顺的调试流程特别是通信和诊断这种“看不见摸不着”的模块先用 CANoe / PCAN 的真机回环在 Windows 上把 DBC 导入 CANoe手动发送 DBC 里定义的报文观察 ECU 是否应答。这一步能快速判断你的收发配置方向有没有反。利用工具生成的CanIf_Cfg.h和Com_Cfg.h里的宏开关调试阶段把CANIF_DLC_CHECK、COM_TIMEOUT_ENABLE等宏打开工具会生成更详细的状态检查代码有助于定位收发异常。在线看信号如果条件允许可以在代码里周期性地把 Com 收到的某个原始信号值通过调试器输出。这个方法尤其适合判断“信号有没有进到应用层”——注意应用层看到的是不是全 F以此判断是接收失败还是解析失败。看 Dcm 的状态等级Dcm 里有个状态变量比如Dcm_DcmMainState调试时单步执行看它是在等待请求、解析请求还是已经发出响应。只要这个状态对了服务处理流程基本就没大问题。6.5 别怕返工版本管理一定做好我最后想多说一句工程习惯上的事。AUTOSAR 配置流程里最忌讳的就是改了配置但不做版本记录然后找不到之前能正常工作的那套配置参数。我的习惯是每完成一个阶段如新建工程、导入 DBC、导入 CDD、生成代码就导出一份 ARXML 和代码包打上标签。后面出了问题可以直接用上一版本的配置对比差异排查效率翻倍。用 Git 做版本管理的同时也要把工具生成的中间文件纳入管理。很多人为了省空间把生成代码忽略掉结果换机器后重新生成代码发现生成出来的跟之前不一样了。除非你完全信任工具链的确定性否则建议生成代码也一起提交至少保留一份“可复现”的构建组合。7. 从能配通到配得好一点个人体会最后说点实在的。很多人觉得把 DBC 和 CDD 导入工具、生成代码、编译通过这事儿就算完了。但真正交付过项目的人会知道能配通只是第一步。你做出来的 ECU 要能在整车上跟其他几十个控制器正常通信要能通过诊断仪读故障、刷写程序那才是真的过了关。我到现在的习惯是每次拿到新版 DBC 或 CDD都会先花半小时做差异对比而不是直接导进去验证。对比结果出来心里有数了再导入生成至少能少走很多弯路。这个习惯帮我挡下过好几次因为整车通信版本升级导致的兼容问题。另外遇到问题不要一头扎进细节里找原因先退一步看依赖关系是不是成立。AUTOSAR 配置几乎都是模块间的联动错误单独看一个模块永远是正常的。理清依赖、逐层验证比干瞪眼强太多。这套流程看着繁琐但你认真跑完一遍就能感受到它在规模化软件开发里的价值。以后项目要从 CAN 升级到 CAN-FD或者加入以太网 SOME/IP配置思路依然是相通的只是换一套 DBC/Cdd 和模块组合而已。
返回列表