软件开发有两种方法:自上而下和自下而上。自上而下就是从整体出发去设计各个模块和模块间的接口,要求架构设计人员对产品功能非常清楚;自下而上就是从一个一个模块出发去设计,进而组成一个整体。自下而上可能会带来冗余代码过多和模块间接口乃至整体架构变动较多的情况,但当一个产品处于摸索阶段时,一般只能采用这种方法。
对于Autosar下的Simulink开发而言,自上而下就是设计好arxml然后导入Simulink,自下而上就是将Simulink生成的arxml导入Autosar开发工具,进而与其他SWC的接口进行连接。
1 arxml导入Simulink
1.1 arxml.importer
将模块的arxml、接口和数据类型定义的arxml拷贝到matlab当前工作区或者其所在文件设为matlab的工作路径,然后调用命令arxml.importer导入arxml文件生成对象。
如在ASW.arxml定义了模块信息,在SRInterface.arxml定义了SWC的接口信息,而接口引用的数据类型定义在Platform_Types.arxml和PlatformBase_Types.arxml,则命令为:
ar=arxml.importer({'ASW.arxml','SRInterface.arxml','Platform_Types.arxml','PlatformBase_Types.arxml'})
导入模型接口和数据类型的arxml。
1.2 createComponentAsModel
调用createComponentAsModel根据导入的arxml对象生成Simulink模型。如在ASW中定义了一个周期性的runnable,则命令为
createComponentAsModel(ar,'/ASW/MBD_SWC','ModelPeriodicRunnablesAs','AtomicSubsystem')
最终生成的Simulink模型为
当然我们还可以使用诸如updateModel 、updateAUTOSARProperties(用autosar中的属性来更新模型信息)等命令来根据arxml对模型进行更新修改等。
2 Simulink生成arxml导入Autosar工具
2.1在Mode Settings的Code Generation中的Code Generation选择autosar.tlc。
2.2在AUTOSAR Code Generation选择适合自己的AUTOSAR版本。
2.3在Code Interface选择AUTOSAR Dictionary来建立Interface和Port。
2.4选择Individual Element Code Mappings将输入输出与建立的AUTOSAR ports进行映射。
2.5生成代码时也会生成arxml文件,将arxml文件拷贝到AUTOSAR工作目录下即可出现interface/port/swc。
3 Simulink在非Autosar下开发
3.1 调用底层C语言编写的驱动
Simulink在非AUTOSAR模式下开发时,可以选用c caller来与底层驱动进行交互(老版的可以通过Legacy Code Tool)。本文选用c caller来进行说明。
在Mode Settings中的Siumlation Target的Header file包含要使用的函数所在的头文件,同时由于我们只是使用接口来生成代码,因此Undefined function handling选择Use Interface Only。
最后生成的代码如下。
3.2 数据一致性的问题
假如两个Simulink模型的输入输出有连接,且数据类型为非原子,那么需要注意了,假如这两个模型是在两个任务中,那么极有可能出现数据一致性的问题。这个问题的解决要不就是在设计阶段进行规避,如这种情况下两个模型放在一个任务中(顺序执行),要不就是通过C语言加锁来避免,即两个模型不直接使用对方的接口。