ARTICLE DETAIL

资讯详情

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

PREEvision与MATLAB协同开发AUTOSAR软件组件实战指南

PREEvision与MATLAB协同开发AUTOSAR软件组件实战指南 我最近刚走完一个完整的AUTOSAR软件组件开发项目从PREEvision里做架构设计到MATLAB Simulink里搭算法模型再到生成符合AUTOSAR规范的C代码整套流程亲测了一遍。说实话这条工具链里的坑比想象中多但打通之后效率是真的高。这篇就围绕PREEvision、MATLAB和AUTOSAR软件组件这三个关键词把我实际操作中的思路、步骤和踩过的坑全部摊开来讲。如果你正在做汽车电子控制器开发或者准备把Simulink模型整成符合AUTOSAR规范的软件组件这篇文章应该很对你的胃口。它既适合刚入门的嵌入式工程师快速建立整体认知也适合已经做了一阵子AUTOSAR开发但总觉得工具链不够顺手的同学对照排查。1. 先说清楚PREEvision、MATLAB和AUTOSAR软件组件到底各管哪一段1.1 AUTOSAR软件组件在整车开发里的位置AUTOSAR架构本身分了三层应用层、RTE运行时环境和基础软件层BSW。应用层里放的就是一个个软件组件也就是SWCSoftware Component。软件组件是一个原子的功能单元比如一个电池SOC估算算法、一个车窗防夹逻辑、一个热管理控制策略都可以封装成一个SWC。一个SWC包含几个核心要素端口Port用于对外交互端口上挂接口Interface定义数据格式组件内部有若干个Runnable运行实体每个Runnable绑定特定的事件触发方式比如周期触发、数据接收触发或模式切换触发。RTE负责把各个SWC之间的通信和调度真正跑起来。这个结构最核心的好处是解耦。算法开发可以完全不关心底层MCU用什么、CAN通信怎么实现、OS怎么调度只要你的SWC接口定义清楚了上层算法和底层BSW各干各的。这与传统手写单片机电控软件相比最大的差别就是“接口标准化”和“模块原子化”。1.2 为什么非得是PREEvision加MATLAB这套组合很多刚接触AUTOSAR的朋友会疑惑用PREEvision建了SWC好像就能自动生成描述文件为什么还要绕一圈MATLAB反过来也有做模型开发的人问MATLAB的AUTOSAR Blockset本身就能建SWC啊为什么还要用PREEvision我的理解是这两工具根本不在一个维度上。PREEvision是E/E架构设计工具除了软件组件设计它还管网络拓扑、通信矩阵、线束原理、ECU清单是系统工程层面的东西。你在PREEvision里干的活本质是在定义“这辆车或这个控制器的软件架构长什么样”。而MATLAB/Simulink是算法开发、仿真验证和代码生成的工具你在Simulink里干的活是怎么把某个算法用模型表达出来并生成嵌入式代码。所以典型的分工是PREEvision负责架构层面的SWC定义、端口接口设计、接口与信号的映射关系然后导出ARXML描述文件MATLAB拿到这个ARXML之后生成Simulink模型骨架你在这个骨架上填充具体的算法逻辑再一键生成符合AUTOSAR规则的C代码和更新后的ARXML。这套组合解决的最大问题是架构建模和算法开发之间的衔接鸿沟。没有工具链支撑的时候架构工程师定义了一套接口算法工程师又按自己的想法另搞一套到了集成阶段对不上要花大量时间手工改。用PREEvision和MATLAB打通之后ARXML就是双方共同的语言接口一致性问题在流程层面就基本消灭了。1.3 整条工具链的核心交换物ARXMLARXML是AUTOSAR XML的缩写它就是用来描述AUTOSAR模型的标准交换格式。无论是SWC的端口和接口还是数据类型、Runnable事件、内部行为统统以XML形式写在ARXML里。我建议你一开始就把ARXML当成工具链里的“中间货币”来理解。PREEvision导出的ARXML是给MATLAB看的“SWC需求规格”MATLAB代码生成时重新输出的ARXML是给集成工具用的“SWC最终描述”。整个开发流程中ARXML的一致性比模型长得好看重要得多。注意ARXML是有版本之分的不同AUTOSAR版本的Schema差别很大。PREEvision和MATLAB选用的AUTOSAR版本必须兼容否则导入导出时会有解析错误。后面我会专门展开讲版本问题。2. 开发前必须想明白的几件事2.1 软件组件架构设计接口先行而不是模型先行我见过不少团队拿到需求就开始在Simulink里拖模块等模型建得差不多了才想起来还要做AUTOSAR架构描述结果发现模型里的信号跟架构里定义的端口压根对不上工期全砸在修改模型接口上了。正确顺序是先在PREEvision里做SWC架构设计把端口、接口、Runnable、事件这些AUTOSAR元素定义清楚然后再到MATLAB里填充算法逻辑。这里的核心原则是“接口先行”。接口先行听起来简单实际做起来要约束自己。比如一个混动控制SWC你可能需要定义发动机扭矩请求、电机扭矩请求、电池SOC输入、车速输入等端口。定义的时候至少要明确这个端口是输入还是输出P-Port还是R-Port用的是Sender-Receiver接口还是Client-Server接口传输的数据类型是uint8、uint16还是float32。这一步做扎实了后面在Simulink里建模就变成了“填空题”。你在模型里每放一个Inport或Outport都能在架构里找到对应归属方向、类型、接口类型全都一一对应。反之如果架构没定明白后面每一步都会返工。2.2 数据类型与接口定义最容易踩坑的雷区AUTOSAR的数据类型体系比Simulink本地类型要复杂一些。从逻辑层到实现层至少有三层概念需要理解第一层是Application Data Type应用数据类型。它描述的是业务的逻辑语义比如“发动机温度”“车速信号”不关心在C代码里到底用几个字节表示。第二层是Implementation Data Type实现数据类型。它决定最终C代码里的基础类型是uint8还是sint16等。第三层是Compu Method和Data Constraint。前者定义物理值到原始值的换算关系比如线性换算或查表换算后者定义数值范围。很多人在第一次做ARXML互导时都会犯同一个错误只知道端口和接口忽略了Implementation Data Type与Simulink模型里的数据类型映射关系。PREEvision里定义的数据类型可能是uint8但你在Simulink模型里建了个double的Inport导入后不显式映射生成的代码接口就会和你预期的不一样。2.3 版本兼容性先核对AUTOSAR版本再动手版本兼容这个问题我建议放在项目启动第一天就核对清楚。AUTOSAR规范从4.x系列到Adaptive平台不断在演进Classic平台常用的版本有4.2.2、4.4.0还有更往后的R23-11等。PREEvision、MATLAB和底层的BSW配置工具对AUTOSAR版本的支持程度各有不同。我的经验是先确定集成工具链要求的版本再倒推PREEvision和MATLAB的配置。比如你的底层BSW配置工具要求AUTOSAR 4.2.2那么PREEvision在导出ARXML时就要选对应的版本MATLAB的AUTOSAR Blockset也要支持这个版本。可以简单整理一个常见组合关系工具/环境常见版本支持情况备注PREEvision支持多版本AUTOSAR导出通常在项目模板里设置导出时逐项确认版本选项MATLAB AUTOSAR BlocksetR2020b以后稳定支持4.2.2和4.4.0具体支持范围以Release Notes为准底层BSW配置工具EB tresos、DaVinci Configurator等各有支持矩阵向工具供应商确认支持版本提示别迷信“选最新版本一定没错”的说法。整个工具链是一个生态要保证的是每一个环节都认同一个版本而不是某一个工具用了最新版就万事大吉。3. 实际操作从PREEvision到MATLAB再到代码生成3.1 第一步在PREEvision中建立软件组件模型我用PREEvision做SWC设计的时候主要是在Software Architecture视图里操作的。新建一个软件组件之后第一步是给它起一个符合命名规范的名字比如Swc_BmsSocEstimation组件类型一般是Application SWC。接下来添加端口和接口。在PREEvision里你可以右键组件选择新建端口。端口分为两种提供型端口P-Port和需求型端口R-Port。P-Port表示组件对外提供数据或服务R-Port表示组件需要从外部获取数据或服务。比如一个SOC估算组件电池电压、电流、温度是输入应该建R-Port估算出来的SOC值是输出应该建P-Port。端口建完后就设置接口。S/R接口用于数据通信定义发送和接收的数据元素C/S接口用于服务调用定义操作和参数。大多数控制类SWC用S/R接口居多但如果你要封装一个诊断服务或者模式请求服务可能就要用C/S接口了。然后添加Runnable和事件。每个SWC内部必须有若干个RunnableRunnable本质上是一个个C函数实体将来要映射到Simulink里的Function。要给每个Runnable绑定触发事件最常用的是TimingEvent周期调用其次是DataReceivedEvent收到数据时调用和OperationInvokedEvent被C/S接口调用时触发。这些元素全部添加完之后PREEvision会做模型一致性检查重点看端口方向是否正确、接口是否绑定了有效的数据类型、Runnable是否有触发事件等。检查通过后就可以导出ARXML了。导出时注意选对AUTOSAR版本并且勾选包含Internal Behavior的描述因为MATLAB需要SWC的内部行为信息来生成模型骨架。3.2 第二步导出ARXML并导入MATLAB从PREEvision拿到ARXML文件后下一步就是把它导入MATLAB生成Simulink模型。这一步用到的工具是MATLAB的AUTOSAR Blockset。导入过程不是直接双击ARXML文件就完事了你要在MATLAB命令窗口执行对应的导入命令。我这里用的方式大致是% 创建AUTOSAR导入对象 importer arxml.importer(Swc_BmsSocEstimation.arxml); % 检查ARXML中的软件组件信息 impInfo importer.importInfo(); % 生成Simulink模型 importer.createComponentAsModel(Swc_BmsSocEstimation);导入完成后MATLAB会生成一个以SWC名字命名的Simulink模型。模型的顶层已经自动建好了Inport和Outport分别对应ARXML里定义的R-Port和P-Port。同时模型里还会自动生成Simulink Function或者触发子系统对应ARXML里定义的Runnable。这一步是整条工具链的“翻译”环节。PREEvision里的端口变成了模型的Inport/OutportRunnable变成了Model里的function或触发子系统数据类型映射关系也会同步进来。你可以在模型的Code Mappings视图里查看或修改这些映射关系。提示导入ARXML之前最好先在MATLAB里执行一遍AUTOSAR版本的兼容性检查看看当前MATLAB是否支持该ARXML文件使用的AUTOSAR版本。不然导入到一半报一堆schema validation error处理起来比较烦。3.3 第三步在Simulink里搭算法模型ARXML导入成功之后你已经有了一个“带骨架的模型”。接下来要做的是在这个骨架上填充算法逻辑。我习惯的处理方式是先看模型自动生成的结构顶层是端口Runnable对应的function是算法逻辑的入口。如果你的Runnable是周期调用的Simulink里通常对应一个函数模块你就在这个函数里实现算法主体如果Simulink建模风格采用的是Simulink Function那你就要在函数内部实现逻辑。举个例子假设SOC估算SWC里有三个输入端口电压、电流、温度和一个输出端口SOCRunnable名为Runnable_SOCEstimation。在Simulink里你会看到顶层有三个Inport和一个Outport还有一个名为Runnable_SOCEstimation的Simulink Function块。我就是在Function块内部搭建安时积分或扩展卡尔曼滤波等算法模型。这里要特别提醒一个容易忽略的点S/R接口的通信语义。AUTOSAR里S/R接口可以有不同的数据语义比如Data、Event、Group。如果接口定义的是Event语义那每次数据发送都是一次事件接收端触发DataReceivedEvent如果定义的是Data语义那么接收端读到的是最新值不保证每次都触发事件。在Simulink里建模时要注意和PREEvision里定义的接口语义保持一致否则集成测试时通信行为和你预期的不一样。3.4 第四步配置代码生成并得到AUTOSAR代码算法模型搭好并完成仿真验证之后就到了最激动人心的环节代码生成。要生成AUTOSAR风格的代码不能直接点默认的生成按钮需要做一些配置。首先要确认代码生成的目标系统文件是AUTOSAR相关的tlc文件。我通常会在代码生成配置里指定使用系统目标文件确保生成的代码包含RTE接口函数定义比如Rte_Read_xxx、Rte_Write_xxx等AUTOSAR标准API。生成的代码不是你手写的裸C代码而是嵌入了AUTOSAR通信层的C函数接口。其次要配置代码映射。Simulink模型里的每个Inport和Outport必须映射到AUTOSAR的端口和数据元素Simulink Function必须映射到Runnable。在AUTOSAR Blockset里这部分操作是在Code Mappings界面完成的。一个常见操作是打开Code Mappings后逐个检查映射项确保没有漏映射或错映射。配置完成后在Simulink里使用代码生成命令即可slbuild(Swc_BmsSocEstimation_model);生成完成后你会得到一批文件主要包括C源代码文件.c和.h、一个更新后的ARXML文件以及一些内部描述文件。其中ARXML文件包含了代码中实现的端口、Runnable、数据类型等完整描述这要交给集成工具去使用。3.5 第五步把生成的内容集成回完整工具链代码生成不等于项目结束。生成的SWC代码要真正在ECU上跑起来还需要和RTE、BSW、OS集成在一起。集成这一步通常在EB tresos、Vector DaVinci Configurator等工具里进行或者你可以在PREEvision的集成模块里做整体硬件-软件映射。集成时MATLAB生成的ARXML会提供SWC的完整描述集成工具读取这些信息后会把RTE层代码和BSW模块配置出来再和你生成的算法C代码一起编译。这个时候就能看到AUTOSAR平台“分层解耦”的好处了算法代码不直接操作寄存器也不直接调用CAN驱动所有数据收发都经过RTE标准APIBSW层的变化对SWC完全透明。从我实际跑过的项目来看整个流程最理想的节奏是PREEvision定义架构和接口MATLAB专注算法实现和验证ARXML作为两个环节之间的“标准交接文档”最终集成在专业BSW工具链里完成。这样每一环都能用上最顺手的工具也符合主流的AUTOSAR开发流程。4. 我实际踩过的一些坑以及排查方法4.1 ARXML导入报错多半是版本不匹配第一个经常把人气哭的问题是在MATLAB里导入PREEvision导出的ARXML一上来就报schema validation失败或者提示找不到某个类。这里最大的可能性就是AUTOSAR版本不匹配。PREEvision可能默认导出了较新的AUTOSAR版本描述而MATLAB的AUTOSAR Blockset默认只支持到某一版本范围。解决办法是在PREEvision导出时把AUTOSAR版本改成工具链共同支持的版本。另外也要注意PREEvision导出选项里有些字段是工具扩展的换个工具可能识别不了。遇到这种情况可以先用文本编辑器打开ARXML文件看看根节点的AUTOSAR标签里写的版本号是多少再去对照MATLAB的版本支持列表。4.2 数据类型对应不上Implementation Data Type才是关键还有一个让我当时排查很久的问题模型的Inport明明设置的是uint8生成的代码接口却成了double类型或者反过来ARXML里定义的uint16到了C代码里变成了unsigned short和另一个平台的类型冲突。根本原因在于应用数据类型和实现数据类型是两码事。在PREEvision里定义端口接口时你往往只注意了应用数据类型比如“冷却液温度”但C代码最终用的是实现数据类型比如uint8。MATLAB导入ARXML后Simulink模型里显示的可能是应用数据类型而代码生成时用的却是实现数据类型。解决办法是检查PREEvision里每个数据元素是否完整定义了Implementation Data Type并且在导入到MATLAB后在Code Mappings里核对每个端口和函数参数映射到的数据类型。如果你看到某个数据元素映射到了Simulink的double就手动改成对应的整数类型确保最终代码里是你期望的C类型。4.3 Runnable和事件配置混乱RTE生成的函数签名不好看如果你的Runnable在PREEvision里定义的是无参数函数比如void Runnable_SOCEstimation(void)那代码生成后RTE调用的就是标准的无参函数这没问题。但如果你希望Runnable接收参数比如传入当前电压、电流那就涉及C/S接口的操作参数映射了配置起来要小心。我踩过的坑是Simulink Function里定义了两三个输入参数但ARXML里对应Runnable的Function Prototype没有定义任何参数导致生成代码时函数签名不一致编译直接报错。排查思路还是在Code Mappings里逐个检查Runnable的参数映射确保模型里的函数参数和ARXML里定义的Function Prototype一一对应。4.4 模型与架构来回不同步的尴尬前面我一直强调“接口先行”就是因为模型和架构来回不同步的代价太大了。我之前有个项目架构工程师在PREEvision里给SWC增加了一个诊断状态输出端口但没及时通知我。我这边Simulink模型已经做完仿真验证了等做代码生成准备提交的时候才发现在RTE集成阶段输出端口对不上系统层面的诊断信号找不到源头。此后我养成了一个小习惯每次模型迭代前先重新对比ARXML和模型接口。AUTOSAR Blockset本身提供了一些同步校验功能你可以手动跑一下检查也可以在更新ARXML之前用工具的模型检查功能扫一遍确认端口、数据类型、Runnable映射没有漂移。4.5 常见问题速查表问题现象可能原因排查方式ARXML导入报schema validation errorAUTOSAR版本不匹配检查ARXML根节点版本调整PREEvision导出选项生成的C代码类型与预期不一致Implementation Data Type未定义或映射错误检查Code Mappings显式设置数据类型映射运行实体函数签名不对Simulink Function参数与ARXML Function Prototype不匹配在Code Mappings中核对Runnable参数映射模型接口与架构不一致型号迭代后未同步ARXML或PREEvision模型更新ARXML运行一致性检查代码生成后RTE调用不上Runnable事件配置错误检查PREEvision中Runnable触发事件类型编译时报Rte_Read/Rte_Write函数未定义没有正确配置RTE头文件路径或未生成RTE层在集成工具中重新生成RTE层检查宏定义还有一些更隐蔽的问题比如S/R接口的数据语义选错导致通信触发次数不对或者C/S接口操作超时时间配置太小导致调用失败这些就需要结合具体的BSW配置来排查了。总而言之遇到问题时优先怀疑接口定义和数据类型映射这两种原因占了AUTOSAR开发中大半的疑难杂症。我个人在实际操作中体会最深的一点是AUTOSAR开发最怕的不是工具不好用而是工具链之间的一致性失控。PREEvision、MATLAB、集成工具各自都有自己的模型表示方式ARXML是它们之间唯一的“公约数”。所以建议你在项目一开始就专门花一天时间把ARXML的版本、导出配置、导入配置、命名规范这些基础事项全部锁定下来后续开发会顺很多。最后再分享一个小技巧给SWC命名、端口命名、Runnable命名规范一定要定得仔细一些比如端口统一用Port_前缀、Runnable统一用Runnable_前缀这看起来是小事但在你同时维护十几个SWC的时候这些规范能帮你节省大量沟通成本。
返回列表