ARTICLE DETAIL

资讯详情

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

AUTOSAR BSW实战:使用DaVinci Configurator配置基础软件模块

AUTOSAR BSW实战:使用DaVinci Configurator配置基础软件模块 在汽车电子软件开发领域AUTOSARAUTomotive Open System ARchitecture标准已成为实现软件可移植性、可扩展性和降低开发复杂度的基石。而Vector公司的DaVinci工具链则是实现AUTOSAR标准从理论到工程实践的关键桥梁。对于初次接触AUTOSAR的工程师而言面对DaVinci Configurator、DaVinci Developer等工具以及ECUC、BSW、RTE等海量配置项常常感到无从下手。本文旨在为嵌入式软件、汽车电子领域的开发者和配置工程师提供一个清晰的实战指南我们将聚焦于使用DaVinci Configurator进行基础软件BSW模块配置的核心流程。本文不会停留在概念介绍而是以一个典型的控制器ECU为背景带你完成从创建项目、配置操作系统OS、配置通信栈如CAN到生成代码的完整闭环。你将理解每个配置页签背后的设计意图掌握关键参数如任务周期、信号路由、PDU到信号映射的设置方法并学会排查配置不生效、代码生成失败等常见问题。最终你将能够独立完成一个具备基本通信和任务调度功能的AUTOSAR软件组件配置为后续集成应用层软件SWC打下坚实基础。1. 理解AUTOSAR架构与DaVinci工具链的角色在动手配置之前必须厘清AUTOSAR的分层架构以及DaVinci工具在其中扮演的角色。这能帮助你明白每一个配置动作发生在架构的哪一层最终影响了生成的哪些代码。1.1 AUTOSAR经典平台CP分层模型AUTOSAR CP将汽车ECU软件划分为三个主要层次从下至上依次是微控制器抽象层MCAL直接与硬件寄存器打交道提供统一的硬件访问接口如GPIO、ADC、CAN控制器驱动。这部分通常由芯片厂商提供DaVinci工具不直接配置MCAL但需要与其接口对齐。基础软件层BSW位于MCAL之上提供标准化的系统服务如操作系统、通信协议栈CAN LIN FlexRay Ethernet、内存管理NvM、诊断服务Dcm Dem等。DaVinci Configurator的核心工作就是配置这一层。运行时环境RTE作为BSW与应用层软件组件SWC之间的桥梁实现SWC之间以及SWC与BSW之间的通信。RTE的接口由DaVinci Developer等工具在配置SWC时定义并由DaVinci Configurator在集成阶段最终生成。应用层Application Layer包含实现具体车辆功能的软件组件SWC由OEM或Tier1使用DaVinci Developer等工具进行设计。1.2 DaVinci工具链的分工Vector DaVinci工具链是一套协同工作的软件集合DaVinci Configurator (CFG)本文的主角。它用于配置整个ECU的BSW模块和RTE。你通过图形化界面设置参数、连接服务最终生成BSW的配置代码C头文件和源文件以及用于集成编译的*.arxml描述文件。DaVinci Developer (DEV)用于设计应用层。开发者在此定义SWC的类型、端口Port、接口Interface和内部行为最终生成SWC的*.arxml描述文件。这个文件需要导入到DaVinci Configurator中以生成完整的RTE。DaVinci System Architect用于在整车层面进行系统设计定义ECU资源、SWC到ECU的映射、总线信号等输出系统级的*.arxml文件作为CFG和DEV的输入。对于配置工程师日常工作主要围绕DaVinci Configurator展开接收来自系统架构和SWC设计的输入文件完成BSW的详细配置。2. 环境准备与项目创建开始配置前需要确保工具和基础环境就绪。这里我们以配置一个带有CAN通信和基础任务调度的ECU为例。2.1 工具与依赖安装安装DaVinci Configurator从Vector官网获取安装包按照指引完成安装。注意选择与你的AUTOSAR版本如AUTOSAR 4.2.2, 4.4.0匹配的Configurator版本。获取ECU描述文件ECU Extract这是配置的起点。通常由系统架构团队提供是一个*.arxml文件包含了该ECU需要实现的SWC列表、需要的BSW模块、通信矩阵等信息。如果没有也可以在Configurator中从零创建一个“Empty ECU”。准备MCAL描述文件虽然不直接配置但BSW配置尤其是通信和I/O依赖于MCAL的接口定义。确保你拥有芯片对应的MCAL描述文件通常也是*.arxml格式。2.2 创建与导入DaVinci Configurator工程启动DaVinci Configurator开始我们的第一个项目。新建工程File - New Project。为工程命名例如Demo_ECU_Configuration并选择合适的工作空间路径。导入ECU Extract在项目浏览器视图中右键点击AUTOSAR根节点选择Import...-AUTOSAR XML(s)...。浏览并选择你的ECU Extract文件例如ECU_Extract_Demo.arxml。导入后你会看到BSW模块树和SWC列表被加载进来。导入MCAL描述同样通过Import功能导入MCAL相关的ARXML文件。这确保了EcuC、Port、Dio、Can等模块有正确的底层接口可供引用。完成导入后你的项目结构应该类似于下图在Configurator的“AUTOSAR”视图下AUTOSAR ├── EcuC (ECU配置根) ├── BswM (基础软件模式管理) ├── Com (通信服务层) ├── CanIf (CAN接口层) ├── Can (CAN驱动层) ├── Os (操作系统) ├── Rte (运行时环境) └── ... (其他模块如NvM, Dem, Dcm等)注意如果导入后某些模块显示为“灰色”或带有错误标记通常是因为缺少依赖的定义如数据类型。你需要根据错误提示继续导入缺失的定义文件这些文件可能包含AUTOSAR标准类型、供应商特定类型等。3. 核心BSW模块配置详解现在我们进入具体的配置环节。我们将配置三个最核心的模块操作系统Os、CAN通信栈Can, CanIf, Com以及ECU配置EcuC。3.1 操作系统Os配置Os模块负责任务调度、中断管理、警报和资源保护。这是系统实时性的基础。定位Os模块在项目树中展开AUTOSAR-Os。配置OsApplication一个OsApplication是一组共享资源的任务、中断和警报的集合。右键点击Os-OsApplication选择New。命名为App1。这里需要设置关键属性Trusted: 通常设为FALSE。StartupHook: 指定一个启动钩子函数可以为空。创建任务Task在刚创建的App1下右键Task-New。创建一个基本任务BASIC或扩展任务EXTENDED。Name:Task_10msPriority: 设为10数字越大优先级越高需根据系统设计设定。Activation:1表示每次就绪只执行一次。Autostart:TRUE系统启动后自动激活。Schedule:FULL可被抢占。最关键的是TaskBody这里链接到应用层或BSW需要周期性执行的函数。例如你可以链接到一个Runnable在RTE配置中生成。初期测试我们可以先创建一个空函数体占位。配置计数器Counter与警报Alarm要实现任务的周期性执行需要配置警报。首先创建一个硬件计数器OsHwCounter关联到底层硬件定时器在OsHwUnit中配置需要与MCAL的定时器驱动对应。然后创建一个软件计数器OsCounter将其HardwareCounter属性指向刚创建的OsHwCounter。最后在任务Task_10ms下创建一个Alarm。将其Counter属性指向软件计数器设置CycleTime为10单位取决于计数器精度例如毫秒并将AlarmAction设置为ACTIVATE_TASK并关联到Task_10ms。完成Os配置后你就定义了一个每10毫秒激活一次的任务框架。3.2 CAN通信栈配置CAN通信是车内网络的核心。AUTOSAR将其分层为Can(驱动) -CanIf(接口) -Com(服务)。配置顺序通常自底向上。3.2.1 Can驱动层Can配置配置CanController在Can-CanController下对应一个物理CAN控制器。设置其CanControllerBaudrate如500000表示500kbpsCanControllerId通常为0表示第一个CAN控制器。配置CanHardwareObjectCanHoh即CAN邮箱或缓冲区。右键Can-CanHardwareObject-New。需要为每个发送或接收的报文创建一个Hoh。CanHandleType:FULL或BASIC根据硬件能力选择。CanObjectType:RECEIVE或TRANSMIT。CanIdType:STANDARD或EXTENDED。CanControllerRef: 关联到上面创建的CanController。CanHohId: 硬件对象ID需唯一。3.2.2 Can接口层CanIf配置CanIf是驱动层与上层模块的适配层。配置CanIfCtrlCfg在CanIf-CanIfCtrlCfg下创建一个控制器配置通过CanIfCtrlCanControllerRef关联到Can层的CanController。映射Hoh在CanIf-CanIfHrhCfg(接收) 和CanIfHthCfg(发送) 下创建配置并通过CanIfHrhHohRef/CanIfHthHohRef分别关联到Can层创建的接收和发送CanHardwareObject。这一步建立了硬件对象与逻辑通道的映射。3.2.3 通信服务层Com配置Com层处理信号级的打包、解包、超时监控等。配置ComSignal这是最小的数据单元如车速、温度。在Com-ComConfig-ComSignal下新建。Name:VehicleSpeedComBitPosition:0(信号在PDU中的起始位)ComBitSize:16(信号长度单位bit)ComDataType: 选择对应的数据类型定义如uint16。ComTransferProperty:TRIGGERED或PENDING定义传输属性。配置ComIPdu协议数据单元对应一条完整的CAN报文。在Com-ComConfig-ComIPdu下新建。Name:PDU_VehicleInfoComPduDirection:SEND或RECEIVE。ComPduType:NORMAL。Length:8(标准CAN数据场长度字节)。最关键的一步在ComIPduSignalRef列表中添加刚才创建的VehicleSpeed信号。你需要指定该信号在PDU中的位置ComBitPosition。关联到CanIf在Com-ComConfig-ComIPdu中找到你配置的PDU设置其ComIPduHandleId。然后需要在CanIf模块中找到对应的CanIfTxPduCfg(发送) 或CanIfRxPduCfg(接收)创建一个条目并将其CanIfPduCanId设置为CAN报文ID如0x100并通过PduIdRef关联到Com层的PDUHandleId。这样就完成了从信号(Com) - PDU(Com) - 逻辑通道(CanIf) - 硬件对象(Can)的完整链路配置。3.3 EcuC模块与时钟、端口配置EcuC模块是ECU配置的容器管理时钟配置、引脚复用等。配置时钟Clock在EcuC-EcucPduCollection-EcucClockConfigSet下可以配置MCU的时钟源、PLL、分频器等生成时钟树。这部分配置需要严格参考芯片手册设置的频率将影响Os计数器的精度和通信波特率。配置引脚Port虽然MCAL由芯片厂商配置但EcuC需要引用这些配置。例如CAN的TX/RX引脚。在EcuC中你可以看到从MCAL ARXML导入的PortPin定义。你需要确保Can控制器配置中引用了正确的PortPin。4. 生成代码与集成验证配置完成后下一步是生成代码并将其集成到编译环境中。4.1 生成配置代码检查配置一致性在生成代码前务必执行一致性检查。点击菜单栏Project-Validate Project。工具会检查所有配置项的依赖、引用和参数是否有效。必须解决所有错误Error警告Warning可以根据实际情况判断是否处理。生成BSW代码右键点击项目根节点或AUTOSAR节点选择Generate BSW Code。DaVinci Configurator会根据你的配置生成以下内容C源文件和头文件位于ProjectDir/generated目录下包含了所有BSW模块的配置代码和初始化函数如Can_Cfg.c,Com_Cfg.c,Os_Cfg.c。RTE生成文件如果导入了SWC描述会生成RTE相关的文件。Linker脚本和Makefile片段如果工具支持。4.2 集成到编译环境生成的代码需要与MCAL代码、应用层代码一起编译。复制生成的文件将generated目录下的所有文件复制到你的项目源代码目录中。包含头文件路径在你的IDE或Makefile中添加生成代码的头文件路径.../generated和AUTOSAR标准头文件路径。调用初始化函数在你的main函数或启动代码中必须按照正确的顺序调用BSW模块的初始化函数。通常顺序是EcuM_Init-Os_Init- 各BSW模块初始化Can_Init,CanIf_Init,Com_Init...-Os_Start。具体的初始化调用图Init Callout可以在DaVinci Configurator中查看或配置。编译与链接完成上述步骤后进行编译。确保没有未定义的符号错误。4.3 运行验证与调试将程序烧录到目标ECU或仿真环境中运行。基础运行验证首先确保系统能正常启动Os任务能按预期调度。可以通过点灯或串口打印任务执行计数来验证。CAN通信验证发送验证在你的周期性任务如Task_10ms中调用Com_SendSignal或Rte_Write接口如果配置了RTE更新VehicleSpeed信号值。使用CANoe、PCAN等总线工具监听CAN ID0x100应该能看到周期性的报文且数据字段包含你设置的速度值。接收验证配置一个接收PDU和信号。在总线工具上向该CAN ID发送报文。在ECU端可以通过Com_ReceiveSignal或Rte_Read接口读取信号值并通过串口打印出来验证接收功能。日志与调试充分利用Det(Default Error Tracer) 模块。在配置中使能Det模块并在代码中关键位置如初始化失败、通信超时调用Det_ReportError。配置Det将错误信息输出到串口或内存是定位问题的重要手段。5. 常见问题排查与解决方案在实际配置过程中你几乎一定会遇到各种问题。下表列出了一些典型问题及其排查思路问题现象可能原因检查点与解决方案代码生成失败提示“Validation Error”配置存在不一致性或错误。1. 运行Validate Project查看具体错误描述。2. 常见错误模块引用缺失如Os任务未关联到OsApplication、参数超出范围、ARXML文件版本不兼容。3. 根据错误信息定位到具体配置项进行修正。程序编译失败提示未定义符号生成的代码未正确包含或初始化函数调用顺序/声明错误。1. 检查是否将所有generated下的.c文件加入了编译列表。2. 检查头文件包含路径是否正确。3. 核对main.c中调用的初始化函数名是否与生成的头文件中的声明一致。4. 确认MCAL库文件已正确链接。系统启动后卡死或运行异常Os配置错误如任务优先级冲突、堆栈溢出、中断配置错误。1. 检查所有任务的优先级是否唯一对于不可抢占的任务同优先级会导致问题。2. 检查任务堆栈StackSize是否设置过小。可以适当调大测试。3. 使用调试器检查程序卡死在哪个函数。CAN报文无法发送通信栈配置链路不完整或硬件配置错误。1.链路检查确认Com Signal-Com IPdu-CanIf TxPdu-Can Hoh的引用链完整无误。2.ID检查确认CanIfTxPduCfg中设置的CanId与总线上期望的ID一致。3.硬件检查确认CanController的波特率设置正确且对应的TX引脚配置在MCAL/Port已使能。4.函数调用确认在代码中正确调用了Com_SendSignal并随后调用了Com_MainFunctionTx。CAN报文能发送但无法接收接收配置错误或过滤器设置问题。1.链路检查确认Can Hoh(RECEIVE) -CanIf RxPdu-Com IPdu-Com Signal的引用链完整。2.过滤器检查CanIf中CanIfRxPduCfg的CanIdMask掩码设置确保它能匹配到发送的CAN ID。3.函数调用确认在代码中周期性调用了Com_MainFunctionRx。信号值解析错误如数值不对或字节序错乱ComSignal的位位置BitPosition、大小BitSize或数据类型DataType配置错误。1. 使用CAN工具解析原始报文数据对比期望值。2. 仔细核对ComSignal配置ComBitPosition是否从PDU的0位开始正确计算ComBitSize是否与信号定义匹配ComDataType的符号和大小端ComSignalEndianness是否正确。RTE接口生成失败或SWC无法通信DaVinci Developer生成的SWC描述文件ARXML未正确导入或RTE配置不完整。1. 在DaVinci Configurator中检查Rte模块下是否有内容。如果为空说明未导入SWC描述。2. 重新导入来自DaVinci Developer的*.arxml文件。3. 导入后需要在Rte模块中配置RteGenerator指定输出路径然后重新生成代码。6. 最佳实践与进阶方向掌握基础配置后遵循以下最佳实践能提升效率并避免陷阱。6.1 配置管理最佳实践版本控制将DaVinci Configurator工程文件.dpa以及所有导入的ARXML文件纳入Git等版本控制系统。每次重大变更前提交。模块化配置对于大型项目不要将所有配置堆在一个工程里。可以按功能域如动力、底盘、车身或BSW模块拆分不同的.dpa工程文件最后通过ARXML进行集成。使用模板Template对于多个ECU共享的通用配置如相同的Os设置、通信协议栈配置可以创建配置模板在新项目中导入减少重复工作。详细注释在DaVinci Configurator中为关键的配置容器和参数添加描述Description。这对于团队协作和后期维护至关重要。备份与对比定期备份工作成果。利用DaVinci工具自带的对比功能或第三方ARXML对比工具来分析和合并不同版本的配置变更。6.2 生产环境考量错误处理与监控务必完整配置Det、Dem诊断事件管理、Dcm诊断通信管理模块。在生产代码中对所有BSW API的返回值进行检查和处理。内存与性能优化合理设置CAN邮箱Hoh数量、深度避免资源浪费或溢出。优化Os任务周期和优先级确保最坏情况下的执行时间WCET满足截止期限。使用Com模块的信号组Signal Group和发送模式如DIRECTMIXED来优化总线负载。配置参数固化对于生产ECU许多参数如VIN、标定数据需要存储到非易失性存储器NVM中。需要正确配置NvM模块并建立NvM数据块与Rte或应用变量之间的映射关系。启动与关闭流程设计完整的EcuMECU状态管理和BswMBSW模式管理流程处理多种电源模式如RUN SLEEP WAKEUP下的模块初始化和反初始化。6.3 下一步学习方向当你熟练使用DaVinci Configurator进行基础BSW配置后可以深入以下领域深入通信栈探索CanTp传输层用于长信号传输CanNm网络管理用于总线睡眠唤醒以及Eth以太网相关模块EthIf,TcpIp,SoAd的配置。功能安全了解如何配置WdgM看门狗管理、Fim功能禁用管理等与ISO 26262功能安全相关的模块。自适应AUTOSARAP了解Vector的DaVinci工具链中关于AP的部分如DaVinci Adaptive Tools学习基于服务的通信SOME/IP和持久化Persistency等概念的配置。自动化脚本学习使用DaVinci Configurator的脚本接口如使用Python自动化重复性配置任务或批量修改参数提升团队效率。配置AUTOSAR软件是一个需要严谨和耐心的过程每一个参数都直接影响着生成代码的行为和最终ECU的功能。从理解架构开始通过一个最小可运行的通信与调度案例入手逐步扩展到复杂的网络管理和诊断功能是掌握DaVinci Configurator最有效的路径。记住遇到问题时系统地检查配置链路、查阅模块规范、并善用日志和调试工具是解决问题的关键。
返回列表