多层数据管理方案解决AUTOSAR CP Composition级别共享代码生成问题

描述

重要的事情放到前头说,本文提出的方法可解决:

AUTOSAR Composition 级别的代码生成问题

多模型代码生成共享代码问题

单元模型单独生成代码时和共享数据的耦合问题

在实际的项目中,我们经常会遇到大规模模型代码生成的共享代码问题,而且常常还会涉及到自定制存储类,AUTOSAR Composition,多层数据管理方案等内容。该问题是一类经典问题,基本上每个月都会有不同的用户以各种不同的场景和方式前来询问解决方案或建议,为了帮助大家更好的处理此类问题,本文提供了一种以多层数据管理方案为核心的解耦方式,类似的场景大家也可以尝试借用此方法。

本文基于 MATLAB R2022b 版本,用到的模型和代码链接可以在文末点击“阅读原文”获取。

以下是详细介绍。

第一步

构建用例场景

我们首先快速构建一个典型场景,新建了一个数据包  mySDCPackage:

代码

并使用 CSCDesigner 创建了如下所示的 Memory Section - MathWorks_CalPrm:

代码

以及 Storage Class - MathWorks_CalPrm_SC,该存储类使用上述创建的 Memory Section - MathWorks_CalPrm。通过该存储类约束的 Simulink Parameter 会生成到指定的 HCU_Prm.h 和指定名称的 .c 文件中(注意:Definition file 选 Instance Specific 以便后续可以单独配置 Parameter 要生成到哪个头文件):

代码

接着我们将名为ThrottlePositionControlComposition.arxml 的  AUTOSAR CP Composition arxml 导入到System Composer,重现架构,如下图所示:

代码

第二步

适用多层数据管理方案

这里为了方便解释,我们只选 Monitor(模型全名实为 ThrottlePositionMonitor),Controller 两个子模型为例,其中 Monitor 模型的数据存放在  Monitor_Unique.sldd 和 Monitor_Shared.sldd   中,Monitor_Unique.sldd 直接关联 Monitor 模型,Monitor_Shared.sldd 不直接关联模型而是被 Monitor_Unique.sldd 通过数据字典引用的方式进行引用。

Monitor_Unique.sldd 中存放的是  Monitor 模型所独有的数据,Monitor_Shared.sldd 中存放的是 Monitor 模型会用到,同时也会被其他模型所使用的共享数据,可认为是单元级别共享数据。SharedDD.sldd 中存放的则是共享程度更高的共享数据,可认为是系统级别共享数据。Controller 模型同理,不做赘述。

这样每个单元模型就形成了三层数据字典引用:Monitor.slx->Monitor_Unique.sldd->Monitor_Shared.sldd->SharedDD.sldd,后面我们会看到多一层“间接”就能起到解耦的作用,“间接”是软件工程中非常强大的解耦和抽象方式。上述描述有点拗口,大家可搭配下图帮助理解:

代码

接着,我们在 Monitor_Shared.sldd 中添加Monitor_Shared 参数定义,使用我们刚刚定义的数据包,接着设置存储类为MathWorks_CalPrm_SC,DefinitionFile 设置为 HCU_Prm_Monitor.c,Owner 设置为ThrottlePositionMonitor(模型名):

代码

   

各参数的设置如下:

在 Monitor_Unique.sldd 中添加名为Monitor_Unique 参数定义,存储类选MathWorks_CalPrm_SC,DefinitionFile设置为 HCU_Prm_Monitor.c,Owner 留空

在 Monitor_Shared.sldd 中添加名为Monitor_Shared 参数定义,存储类选MathWorks_CalPrm_SC,DefinitionFile设置为 HCU_Prm_Monitor.c,Owner 设置为 ThrottlePositionMonitor (即 Monitor 的模型名)

在 Controller_Unique.sldd 中添加名为Controller_Unique 参数定义,存储类选MathWorks_CalPrm_SC,DefinitionFile设置为 HCU_Prm_Controller.c,Owner 留空

在 Controller_Shared.sldd 中添加名为Controller_Shared 参数定义,存储类选MathWorks_CalPrm_SC,DefinitionFile设置为 HCU_Prm_Controller.c,Owner 设置为 Controller (即 Controller 的模型名)

在 SharedDD.sldd 中添加名为   GlobalSharedP 参数定义,存储类选   MathWorks_CalPrm_SC,DefinitionFile设置为 HCU_Prm_GlobalShared.c,Owner 的选择要特别注意:当前的 MATLAB R2022b 版本不支持 Owner 选为System Composer 的模型名,如果我们直接留空,那么每个用到 GlobalSharedP 参数的子模型都会生成一份  HCU_Prm_GlobalShared.c,显然也不合适,因此我们可以指定 Owner 为某个子模型,这样就可以临时绕过此限制,只生成一份  HCU_Prm_GlobalShared.c,这里我们选择Owner 为 Controller 模型

这里稍微解释下 Owner 的作用:此处指定的  Owner 后续会配合选项 “Use owner from data object for data definition placement”,在代码生成时,只有 Owner 模型生成代码时,此数据才会在代码里生成定义,其他模型即使用到此数据也不会生成此数据的定义。

代码

最后,让 Controller_Unique.sldd 引用Monitor_Shared.sldd,让 Monitor_Unique.sldd引用 Controller_Shared.sldd,形成如前图所示数据字典交叉引用。

最终,Controller_Unique.sldd 中的数据如下图所示:

代码

Monitor_Unique.sldd 中的数据如下图所示:

代码

                                                                                             

第三步

为数据对象明确 Owner

仅仅做到这一步的话,当我们对 Monitor 或者  Controller 单元模型单独生成代码时,这种交叉引用可能会导致 Monitor_Shared 和Controller_Shared 参数重复被生成,或者换句话说即参数的 “Owner” 是不确定的。

我们期望的是:当对 Controller 模型生成代码时,Controller_Shared 参数定义要生成到HCU_Prm_Controller.c 中,即其在代码中被当成 Exported,而 Monitor_Shared 参数即使在   Controller 模型中被使用,其在代码中却不生成定义,即其在代码中被当成 Imported。

要实现这一点,需要为 Monitor_Shared 和  Controller_Shared 参数设置 Owner(其所归属的模型名):

代码

 

代码

同时对 Monitor/Controller 模型生成代码的时候,记得勾选 Use owner from data object for data definition placement,这样Monitor_Shared 对象仅在 Monitor 模型生成代码的时候生成定义。

代码

两个模型的 Shared code placement 都设置为 Shared Location:

代码

第四步

在模型中交叉使用数据对象

如图所示,在 Monitor 模型中使用定义的参数,包括  Monitor_Unique, Monitor_Shared以及  GlobalSharedP:

代码

在 Controller 模型中使用定义的参数,包括   Controller_Unique, Monitor_Shared 以及  GlobalSharedP:

代码

第五步

代码生成

对 Controller 模型生成代码,虽然 Controller 模型中使用到了 Monitor_Shared 参数,但是该模型因为不是参数的 Owner,不会生成 Monitor_Shared 的定义,仅仅是引用:

代码

 

代码

最后借助 System Composer 提供的 AUTOSAR Composition 级别的代码生成功能:

代码

我们直接看生成的 zip 压缩包:

代码

其中 HCU_Prm.h:

代码

HCU_Prm_Controller.c:

代码

HCU_Prm_GlobalShared.c:

代码

HCU_Prm_Monitor.c:

代码

第六步

总结

至此,我们就实现了 Controller 模型和 Monitor 模型的数据解耦,且数据的定义各自生成到各自的子目录中,此方式的另一个好处就是无论Monitor_Shared.sldd 中的数据如何变化,无需再对Controller 模型生成代码,仅需要对 Monitor 模型重新生成代码,即可更新所需的定义文件(.c)和slprj/autosar/_sharedutils 中的声明文件(.h),大大节省了重复生成代码的时间。

当然,如果大家希望上述所有的参数定义都放到名为HCU_Prm.c(即与声明文件 HCU_Prm.h 同名)的文件中,则需要写个后处理脚本对代码进行综合处理。

最后, 欢迎大家在借助本文方法解决问题后在下面留言反馈,如果有更多实际项目中的困扰,也欢迎留言,我们会酌情推出更多类似的技术文章,与大家一起共同进步。

本文基于 MATLAB R2022b 版本,用到的模型和代码链接可以在文末点击“阅读原文”获取。

原  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分