尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Classic AUTOSAR工具链实战指南:从ARXML到固件生成

Classic AUTOSAR工具链实战指南:从ARXML到固件生成 Classic AUTOSAR这套标准十多年来一直是汽车嵌入式软件的地基。无论你是搞应用层算法还是碰底层驱动最终都绕不过那套庞大的开发工具链。我最早接触它的时候整个人是懵的——文档数百页工具界面满是缩写看起来处处都要配置却又不知道从哪一步开始。后来完整做了几个项目回头再看才敢说自己是初识这个领域。这篇东西就写给刚进入车载软件领域、对Classic AUTOSAR开发工具链还处于听过名字、没见过全貌状态的朋友。我会结合自己实际折腾过的工具和踩过的坑把这些工具到底管什么、典型流程怎么走、刚上手时会遇到什么问题尽量用大白话讲清楚。它不会让你立刻变成配置大师但能让你在打开那些工具时心里有一张完整的地图。1. 一个只见森林不见树木的起点工具链到底管哪些事刚接触Classic AUTOSAR时第一个坎往往不是AUTOSAR标准本身有多大而是搞不清标准、工具链、芯片这三者的关系。AUTOSAR是一套标准它规定软件模块怎么划、接口怎么定、通信怎么走但它不直接提供可运行的代码。你的ECU上电之后跑的东西靠的是工具链生成的基础软件BSW和运行时环境RTE代码再加上你自己的应用代码最后被编译成一个hex文件烧进芯片。工具链就是标准落地的翻译器。把这个翻译器再拆开看日常项目接触最多的是三类工具。第一类是配置与代码生成工具负责把AUTOSAR模块配置成你想要的形态——比如你要几路CAN、每个报文ID是多少、哪个SWC往哪个端口发数据这些都被画进一个名叫ARXML的XML文件里。ARXML全称是AUTOSAR XML相当于整个项目配置的数据库。之后工具读取这个文件生成相应的C代码包括RTE代码、通信栈代码、诊断栈代码、NvM存储栈代码等。第二类是编译与链接工具这部分跟普通嵌入式开发区别不大只是目标芯片往往很硬核AURIX、S32K、RH850这些车规级MCU对编译器版本和License都有严格限制。第三类是验证与调试工具用于把hex烧到芯片上跑起来后通过调试器或者CAN工具观察信号对不对。但这只是字面理解。真正让工具链成为链的是这些工具之间必须共享同一份ARXML配置数据。你在配置工具里改一个CAN报文的DLC长度生成的代码、诊断说明文档、甚至后续测试用的仿真数据库都得跟着变。如果某个环节没有同步就会出现代码看着对跑起来全错的诡异现象。我后来经常跟人这样解释把工具链想成一条流水线——上游是系统工程师绘制的通信矩阵和软件架构中游是AUTOSAR配置工具把它转化成一段段C代码下游是编译器把这些C代码连同你的应用逻辑和底层驱动封装成固件。任何一环出问题整条流水线都会卡住。1.1 刚入门时我对工具链最大的两个误解误解一工具链能自动生成所有代码所以我基本不用动手写代码。实际上AUTOSAR配置工具生成的只是骨架和BSW模块代码应用层SWC的Runnable内部逻辑、某些复杂的自定义驱动、复杂驱动CDD都需要手写。RTE生成的只是调度框架——什么时候调用哪个Runnable、数据怎么从Runnable传进传出——但函数体里面的算法还是自己的。误解二AUTOSAR就是一套工具。实际上AUTOSAR在工程语境里对应的是整套标准和规范各家工具链对标准的实现各有差异。同一个ARXML文件用Vector的DaVinci Configurator打开和用ETAS的ISOLAR打开界面、校验规则、默认值可能完全不一样。这也是很多工程师从一家工具切换到另一家时非常痛苦的原因——标准统一了工具的实现却各有各的脾气。当年我在第一个项目里就被这个现实教育过。拿着别人给的ARXML去配置工具里打开结果工具直接报出来几百条error排查了一天才知道是AUTOSAR版本不一致个别元素的写法在新版本里已经被调整过。版本兼容性这个问题后面细说它真的是新手最容易忽视、又最致命的一环。1.2 工具链在项目生命周期中其实有三个身份如果只把工具链当成代码生成器那对它的理解就太浅了。我经历过几个项目之后发现工具链在项目里同时扮演三个角色。第一个身份是配置管理工具。项目的通信矩阵、诊断规范、存储映射、标定参数最终都会汇总到ARXML里。这些文件要纳入版本管理每一次更改都要能追溯否则到了整车联调阶段一个信号方向的改动就可能引发连锁问题。很多公司为此会搭建专门的ARXML工程库确保不同ECU团队之间的配置变更互相可见。第二个身份是代码生成工具这个大家最熟悉。它生成RTE和BSW模块的源代码质量直接决定后面集成调试的工作量。生成代码的可读性、模块划分的清晰度、对目标编译器适配的完善度都是选择工具链时的重要指标。第三个身份是兼容性仲裁者。芯片厂商提供MCAL底层驱动但MCAL要能在你的BSW工程里被调用必须遵循AUTOSAR定义的接口规范。配置工具在这里充当翻译官把芯片厂家提供的MCAL包导入再把你在界面上勾选的配置翻译成对MCAL的初始化调用和读写接口。没有这一步BSW和MCAL就是两张皮编译链接根本过不去。明白这三个身份之后再去看工具链那些眼花缭乱的菜单你会稍微有些头绪——它们不是在随机罗列模块而是在帮你完成配置管理、代码生成、标准整合这三件不同性质的事情。2. 从上电到跑起来一段代码在Classic AUTOSAR工具链中的旅程为了把工具链讲得具体我习惯用一条实际的信号路径来串起整个过程。假设现在要做一个简单的控制功能某个传感器引脚的电平代表一位开关状态应用层SWC读到这个状态后通过CAN发送给其他ECU。听起来很简单但在Classic AUTOSAR里它要经过一串工具链环节才能跑起来。2.1 配置阶段先在ARXML里画图第一步不是写代码而是在配置工具里做系统级设计。打开工具后你会看到若干个编辑器软件组件设计器、通信设计器、诊断设计器等每个编辑器负责一类配置内容。要做的事情包括定义一个SWC给它命名——比如叫 BrakeSensing_SWC给这个SWC添加端口Port比如一个输入端口接收开关状态一个输出端口对外发送到CAN消息。在AUTOSAR里这不是简单画一根线一个端口要绑定一个接口Interface接口里定义数据元素DataElement或者事件、操作这套概念在工具里都有对应的可视化编辑区。还要定义RunnableRunnable是SWC内部的一个个可调度函数比如读取传感器状态的那个函数会绑定到一个10ms周期的定时事件上。通信矩阵也要在这个阶段定义清楚。CAN ID是多少、报文发送周期多少、字节排列怎么排、信号从第几位开始、占多少位这些参数要么在通信数据库工具里设计好再导入要么直接在主流的配置工具里维护。最终它们都会进入ARXML。这个阶段产出的ARXML是整条工具链后续工作的输入。虽然你只是在界面上拖拖拽拽填表单但最终生成的XML可能上万行。不要指望手写它也不要在没有充分理解模块依赖关系的时候随手改XML里的某个值那大概率会把配置改坏。2.2 生成阶段RTE和BSW是怎么长出来的配置完成后配置工具会做一致性校验然后开始代码生成。生成的内容按模块分主要有两大类。一类是RTE。RTE生成后会提供一堆宏和API比如Rte_Read_BrakeSensing_SWC_inputPort_Data()这样的函数。你在应用层SWC的手写代码里就是通过这类API去读取端口数据的。RTE内部会再把这次读请求路由到底层BSW、I/O抽象层或其他SWC对应用开发者来说RTE屏蔽了芯片底层和通信栈的具体实现细节你不需要知道数据是从寄存器来还是从CAN帧里拆出来的。另一类是BSW模块代码包括通信栈Can、CanIf、PduR、Com、诊断栈Dcm、Dem、存储服务NvM、Fee、RTE底层的调度表等等。每个模块的生成代码一般分两类一类是模块自身的源代码另一类是配置文件——通常是Can_Cfg.h、Com_Cfg.h这样的头文件里面存有该模块的参数配置值。生成之后这些代码还只是工程的一部分。你需要把这堆文件和芯片厂商的MCAL库、自己的应用代码一起在编译器的IDE工程里拼起来。这里有一个容易踩的坑生成目录和手写目录要分离不要把生成代码和手写代码混在同一层目录里否则后面重新生成时会互相覆盖又难查。2.3 集成阶段手写代码和生成代码的边界很多人第一次拿到生成代码会觉得无从下手哪里能改哪里不能动我建议把这条边界牢牢记住——所有生成代码都可以看、可以读、可以通过配置参数影响它的行为但不要手动修改生成文件。为什么因为RTE和BSW的源文件在每次代码生成后都会被重新覆盖你改了也是白改下次生成就没了。需要调整行为时回到配置工具里改ARXML再重新生成这才是可持续的玩法。那手写代码放在哪两种常见方式。应用层SWC对应的C文件配置工具会生成模板你在模板预留的位置填写Runnable的函数体这些位置通常有保护标记重新生成代码时不会被覆盖。另一种是CDD复杂驱动或一些特殊适配逻辑这些不属于标准BSW模块的范畴需要自己写完整驱动并做好与RTE或BSW模块的接口适配。这条上电到跑起来的路径走下来你就明白工具链在沿途每个位置都伸了一只手配置阶段帮你录入需求生成阶段把需求转换成代码集成阶段提供手写代码的插槽。整个过程用一句话概括——把设计意图一步步机械地变成可执行的C代码。工具链做得越顺你手动补窟窿的时间就越少。3. 主流工具链的脾气对比DaVinci、ISOLAR、Tresos怎么选工具链供应商有不少但工程上最常见的是Vector、ETAS、Elektrobit这三家。当然东软的NeuSAR、普华基础软件等国产解决方案近几年上车也不少在一些快速迭代的项目里表现不错。不过国际主流项目里三家老牌厂商依然占据大头。它们的特点差异明显。Vector DaVinci Configurator Pro配合DaVinci Developer使用在传统OEM和头部Tier1里占有率最高整体生态完整从配置到测试链路顺畅ETAS ISOLAR在博世体系里用得很多流程上更贴近AUTOSAR方法论大规模项目里的变体管理做得比较深EB tresos则在MCAL集成和BSW定制方面用得多不少芯片厂商的MCAL参考工程直接基于EB工具来做。维度Vector DaVinciETAS ISOLAREB tresos所属厂商VectorETASElektrobit传统强项全链路工具协同诊断测试生态好方法论贴合度高变体管理强MCAL与BSW底层集成成熟上手难度中等模块多但引导好偏高对AUTOSAR理论要求高中等接近嵌入式工程师习惯典型用户传统OEM、Tier1博世体系、大型Tier1底层软件团队、芯片方案商配套生态CANoe、CANape、Diva等INCA、AUTOSAR Authoring芯片厂商参考工程3.1 三家的共同前提AUTOSAR版本与芯片绑定问题选工具链之前先得想清楚两个硬约束。第一个硬约束是芯片厂商的MCAL包支持哪个AUTOSAR版本。车规MCU的MCAL库通常由芯片厂自己提供MCAL库的接口版本必须与BSW工具链能生成的版本匹配。版本不匹配会出现大量编译错误——最常见的现象是某个接口函数的参数个数和类型对不上。别指望配置工具能自动降级处理通常只能选择升级MCAL版本或者迁移工具链版本代价都很大。第二个硬约束是编译器兼容性。每家工具链通常只保证和某几个编译器版本能配合工作比如TASKING、GHS、IAR。选型时一定要去查官方兼容矩阵。有些公司因为目标芯片是AURIX TC3xx顺手选了TASKING但如果BSW工具链生成的代码里用了某些TASKING不支持的语法扩展编译也会卡很久。这两个约束决定了你不能只挑好用的工具而要先看目标芯片生态里哪家工具链被支持得最好。很多时候是芯片先定工具链跟着再定而不是反过来。3.2 按团队背景和项目阶段来选如果团队之前都在用CANoe做测试Vector系工具链会顺手很多。DaVinci的数据和CANoe的数据库能无缝对接通信矩阵导入导出都很方便可以大大减少从通信矩阵到配置数据的转换时间。如果项目涉及复杂的诊断功能Vector的Diva和CDD工具链配套完整在诊断测试环节能省不少力气。ETAS ISOLAR比较大的优势是对AUTOSAR标准流程的贴合度更高适合从零开始严格按照标准推进的项目。但它对配置人员的AUTOSAR基础要求更高新手初期会觉得门槛偏陡很多操作背后的概念没有理解清楚的话容易在配置界面里迷失。EB tresos在我看来更嵌入式程序员一些。它生成的BSW代码结构相对清爽MCAL和BSW可以在一套工具里维护。如果团队主要做底层软件没那么多SWC设计需求EB可能是更务实的选择。遇到问题时EB的生成日志也更像程序员熟悉的那种风格定位问题相对容易。另外这些年出现了一些简化工具链的尝试比如开源社区用Python脚本直接生成RTE和BSW配置的教程也有在线AUTOSAR开发环境的探索。对学习而言这些轻量方案能帮你理解工具链底层逻辑。不过工程量产项目我依然建议用商业工具为主认证和维护成本摆在那里省不得。4. 第一次完整构建从ARXML到可烧录固件的动手记录这一节我把自己实际动手跑通一次最小工程的过程摊开来记录。工具厂商的菜单名可能不同但思路是通用的。4.1 我习惯的最小工程骨架我给自己规定的最小可执行工程包含五部分。ARXML项目文件可以是空的或模板的系统配置里面至少包含一个ECU实例。MCAL源码包芯片厂商提供的包含各驱动的源文件和配置文件模板。编译工程我常用的是AURIX TC3xx系列开发板编译器用TASKING或HighTec看芯片厂商的参考工程而定。一个SWC模板包含一个TestSWC里面写一个周期自增计数器并通过一个CAN报文发出去。配置工具工程把上述文件导入配置工具。学习阶段建议先别碰诊断和E2E保护把最简I/O到CAN跑通再逐步加模块。否则配置项太多出错时根本不知道是哪一环引起的问题。4.2 实际操作流程五步跑通第一步建好ARXML工程把芯片型号和编译器信息填进配置工具导入MCAL包让工具做适配。第二步在工具里配置MCU时钟、Port引脚、CAN控制器和收发器。这一步要对照原理图特别留意引脚冲突。有人在这里凭感觉选了一个功能引脚结果该引脚同时复用了别的外设编译没问题运行时功能就不正常。第三步配置CAN通信栈包括Can、CanIf、PduR、Com。定义一个CAN报文和一个信号把TestSWC的输出端口映射到这个信号。映射时注意数据长度和初始值的设置很多新手在这里漏掉初始化导致报文发出去是乱码。第四步生成RTE和BSW代码。这一步最容易遇到校验报错比如信号位长和数据类型不匹配、缓冲区大小不够、波特率不在MCU支持范围内。校验过程比较磨人但它是配置工具的安全网宁可在这一步多花时间也别带着错误进入编译阶段。第五步把生成的代码放进编译工程编译、烧录用CAN工具看数据。我在第一次跑通这个流程时前前后后花了三天其中一半时间在查莫名其妙的问题——后来发现是编译器版本和工具链要求的不完全一致导致有链接报错。4.3 解决看起来配置对了跑起来就是不对排除编译问题之后更麻烦的是配置对了、编译过了、但信号不对的问题。这类问题往往让人抓狂因为你在配置工具里看到的参数值似乎都合理跑起来却不按预期走。我碰到过最典型的一次配置了一个周期10ms的CAN报文实际量到的报文周期是20ms。查了半天配置项最后发现是Com模块的周期调度依赖RTE系统的时钟节拍而那个节拍被配置成了20ms。Com里写的是10ms但底层counter精度跟不上实际只能按20ms发。这种问题靠看代码很难定位得从工具配置到底被哪个底层节拍驱动的角度去查。遇到这类问题我的建议是别急着改代码。先在配置工具里查目标模块的运行时依赖它依赖哪个定时器、哪个counter、驱动周期是多少。然后把配置值手工算一遍看看算出来的实际行为是否符合预期。AUTOSAR工具链最怕的不是配置项多而是配置项之间存在隐藏依赖——一个参数改了另一个模块的行为跟着变。养成每次生成代码后都打开生成的Cfg头文件检查关键数值的习惯很多玄学问题会提前暴露。5. 必须知道的几个工具链隐藏坑与思考方式5.1 生成代码的重复生成问题配置工具生成代码默认是全量生成也就是说每次点击生成整个RTE和BSW的源文件都会被重新生成。如果团队里有人在生成之前手动改过某些C文件重新生成之后改动全没了。所以项目里一定要做好规范手写代码要么放在SWC模板的保护段里要么放在单独的目录不进入生成目录。保护段看起来长这样只是一个示意/* BEGIN: protected region: user code */ static uint16_t my_counter 0; /* END: protected region: user code */工具在重新生成时会保留这两个标记之间的内容。但要注意不是所有模块都有保护段机制尤其是BSW的配置文件几乎都是全量覆盖所以底层改动要格外谨慎。在我的经验里比较好的工程习惯是每次生成前先提交一次当前代码生成之后再diff一下看看工具改动影响了哪些文件。如果你完全没有手动改过生成目录diff应该只新增不修改一旦出现修改了已有文件的记录就要多留个心眼。5.2 ARXML合并冲突多人协作的真实折磨另一个很实际的坑是ARXML合并。传统上AUTOSAR配置工具是单机文件式的一个ARXML文件几万行一个团队的多个成员同时改同一个ECU配置极易出现冲突。这个冲突不像Git合并文本那样容易解决因为ARXML里的ID引用是交叉的——一个模块的参数可能在文件里的好几个位置被引用自动合并工具很容易把逻辑引用链拆断。就算手动能拼回去也容易引入隐藏的语义错误编译能过运行之后行为却是错的。我经历过的项目是这样规避的模块分人、文件分块。不同的人负责不同的BSW模块生成独立的ARXML片段最后通过工具导入合并。这样做冲突会少很多但需要有一个人负责全局配置集成和依赖关系梳理否则各模块之间的接口参数——比如RTE与Com的PduId映射——极易对不上。如果你所在的公司还没有这套流程建议早点建起来。不然到了系统联调阶段天天在解决为什么你的配置覆盖了我的参数这类问题真的很消磨士气。5.3 把工具链当帮工而不是标准最后想分享一点思维层面的体会。很多人一上来就抱着我要严格按照AUTOSAR标准来做的心态结果被工具链的各种边界条件摩擦得体无完肤。我更推荐反过来把工具链当成功强大的代码生成器先搞明白它生成什么、怎么组织、哪些参数你可以改然后回头去理解AUTOSAR标准的条文你会发现很多概念变得好懂了。比如RTE会生成Rte_Read、Rte_Write这类API你天天用但未必想过它为什么存在。因为AUTOSAR要让SWC不感知底层硬件所以应用代码只能通过RTE的API来交换数据。工具链把这些API全部实现出来让编译器在编译期去检查你对端口的访问是否合法等于在编译期就拦掉一层通信配置错误比运行时再去排查要省事得多。另外工具链的日志和生成报告值得认真看。很多新手点完生成就关掉日志窗口等编译报错再回头查。其实配置工具在生成阶段就会输出警告信息比如某信号未连接、某模块存在无效参数。这些警告往往是最早的问题信号越早处理成本越低。我自己的习惯是每次生成之后先扫一遍全部warning能当场消掉就消掉不要欠着欠着欠着就忘到底哪些warning是什么时候冒出来的了。最后再分享一个小经验初学Classic AUTOSAR工具链别追求一下子把所有概念弄明白也别只迷信厂商的官方培训。找一个实际的芯片开发板搭一个最简的CAN通信工程从配置到生成到烧录完完整整跑通一次。工具链这东西看十遍文档不如亲手生成一次、出错一次、解决一次。等到你能看着生成的代码反向推导出配置界面里的某个设置对应到代码里的哪个参数你对Classic AUTOSAR工具链才算是真正入了门。
返回列表