本文以一个简单的示例说明如何通过Isolar设计的SWC arxml导入到simulink中生成模型,并指定simulink生成的代码带内存分区信息。本文创建的SWC叫做ECAS_Sensor_SWC, 主要作用是对传感器信号进行处理和传递给后级SWC使用。
1. solarAB修改PlatformBase_Types.arxml文件
对IsolarAB AUTOSAR_Platform/BaseTypes(定义位于PlatformBase_Types.arxml)下面的基础数据类型添加如图所示NativeDeclaration属性。
添加完成后浏览Isolar工程下的PlatformBase_Types.arxml文件可以看到数据类型定义下多出了NativeDeclaration属性, 该属性为导入Simulink必要属性。
2. 创建必要的ImplementationDataTypes
创建ImplementationDataTypes请使用前缀IDT_, 同时新建一个DataTypes.arxml, 之后将所有DataTypes, ComputeMethods都放入该文件。
将ImplementationDataTypes类型设置为VALUE, 并选择对应的BaseType(这里有3个,需确定选择的定义位于Platform_BaseType.arxml)。
3.创建必要的Interfaces
创建Interface请使用前缀SRI/CSI, 同时新建一个Intefaces.arxml, 之后将所有Interface都放入该文件(至少是ASW所需的)。
4.为SR Interfaces添加必要的数据元素
5.对Component进行建模
这里以ECAS_Sensor_SWC为例, 每个SWC的描述文件(arxml)保持独立,名字保持默认。
创建Port, 其中RequestPort加前缀RP_,ProviderPort加前缀PP_。
创建如图所示的两个Runable。
创建对应Runable的Event。
指定Runable的DataAcess。
6.将Arxml导入Matlab并自动创建Simulink模型
首先新建一个工作文件夹, 并将工作区设置为该文件夹。
在该文件夹下新建一个子文件夹Arxml。
将Isolar工程下的PlatformBase_Types.arxml, Platform_Types.arxml, DataType
s.arxml, Intefaces.arxml, 以及XX_SWC.arxml放入该文件夹。
其中XX_SWC.arxml描述了SWC的名字, Port, Runable, Runable触发事件, Port引用的Inteface, 以及读写的DataElement等信息。
而Intefaces.arxml则是对Intefaces即其数据元素的具体描述, 同时数据元素的变量类型描述位于PlatformBase_Types.arxml文件, 这里的Platform_Types.arxml暂时没用到。
在工程根文件夹下创建一个.m函数, 方便自动生成模型,里面添加代码:
function CreateModefromArxml(modeName)
arxmlDir = './Arxml/';
platformTypeArxmlPath = strcat(arxmlDir,'Platform_Types.arxml');
platformBaseTypeArxmlPath = strcat(arxmlDir,'PlatformBase_Types.arxml');
interfaceArxmlPath = strcat(arxmlDir,'Interfaces.arxml');
dataTypeArxmlPath = strcat(arxmlDir,'DataTypes.arxml');
modeArxmlPath = strcat(arxmlDir,'SwComponentTypes_',modeName,'.arxml');
ar = arxml.importer({platformTypeArxmlPath,platformBaseTypeArxmlPath,interfaceArxmlPath,dataTypeArxmlPath,modeArxmlPath});
names=getComponentNames(ar);
createComponentAsModel(ar,names{1,1},'ModelPeriodicRunnablesAs','FunctionCallSubsystem');
end
将各个arxml中头部的AUTOSAR_00047改为AUTOSAR_00042, 因为2019b最高识别的AUTOSAR版本为4.2。
使用时直接在对话框输入CreateModefromArxml(‘ECAS_Sensor_SWC’);
生成的模型.slx如图所示。其中各种Autosar定义和Mapping都已经自动生成。
如果有接口修改, Compnent重定义, 数据类型重定义等只需通过替换对应的arxml文件, 并通过自定义的Function UpdateAutosarMode更新模型即可, 其.m代码如下:
function UpdateAutosarMode(modeName)
arxmlDir = './Arxml/';
platformTypeArxmlPath = strcat(arxmlDir,'Platform_Types.arxml');
platformBaseTypeArxmlPath = strcat(arxmlDir,'PlatformBase_Types.arxml');
interfaceArxmlPath = strcat(arxmlDir,'Interfaces.arxml');
dataTypeArxmlPath = strcat(arxmlDir,'DataTypes.arxml');
modeArxmlPath = strcat(arxmlDir,'SwComponentTypes_',modeName,'.arxml');
ar = arxml.importer({platformTypeArxmlPath,platformBaseTypeArxmlPath,interfaceArxmlPath,dataTypeArxmlPath,modeArxmlPath});
open_system(modeName);
updateModel(ar,modeName);
end
将工作区生成的DataTypes保存到DataTypes.mat, 这样重新开启Matlab只用点击这个文件就会自动加载数据类型定义(通过arxml生成), 否则下次重新打开Matlab会丢失如IDT_Temperature的定义, 只能通过重新使用CreateModefromArxml生成。
7. 为Simulink模型创建自定义Storage class
命令行输入:
demoPath = ‘\toolbox\simulink\simdemos\dataclasses’;
cd([matlabroot,demoPath]);
将该文件夹整体复制到自己的工程目录。将工程目录下该文件夹改名。
修改Signal.m和Parameter.m中的如下段:
替换成MyAutosarPackage
命令行输入:
cscdesigner(‘MyAutosarPackage’);打开如下界面。
删除掉默认的Custom Storage Class和Memory Section。添加如图所示几个Memory Section。
其中CONST_UNSPECIFIED来存放所有未通过SwAddrMethod指定的rodata段, CODE用来存放所有未通过SwAddrMethod指定的code段, VAR_CLEARED_UNSPECIFIED用来存放所有未通过SwAddrMethod指定的bss段, VAR_INIT_UNSPECIFIED用来存放所有未通过SwAddrMethod指定的data段。
这里的未通过SwAddrMethod指定的段是指生成代码时无法通过SwAddrMethod分配的段, 比如Chart的内部状态记录/延迟相关变量, 不包括在Runbable里的SWC内部函数等。
为了举例我们在模型中新建一个Memory模块。
该模块关联的变量生成在default storage,无法做Memmap。
展开Code Generation, 点击Package右边的Refresh package list选项。
选择我们创建的MyAutosarPackage。
进行如设置,再次生成代码。
该变量已经分配好了内存分区, 可以通过ECAS_Sensor_SWC_MemMap.h进行实际编译时的段地址指定。
同样封装一个SWC内部使用的函数。
在未做上述设置前, 生成的CODE并未指定内存分区。
配置后再次生成该函数已经分配在了对应的CODE区, 可以通过ECAS_Sensor_SWC_MemMap.h进行实际编译时的段地址指定。
下面是其他一些对模型的设置:
未做说明的设置可按照生成模型时的默认配置。
8.为Simulink模型指定SwAddrMethod
Runable Body等如果不指定SwAddrMethod,并不会生成在通过Code Generation->Memory Section指定的Default内存段。
打开AUTOSAR Dictionary, 新建一个如图所示的SwAddrMethods->CODE。
在底部Code Mapping处选中一个Runable, 并在右侧Property Inspector中的SwAddrMethod选项修改为CODE, 同理其他Runable都修改。
可以看到新生成的Runable已经分配到了对应的CODE段。
在AUTOSAR Dictionary, 新建一个如图所示的SwAddrMethods-> CALIB_UNSPECIFIED, 用来指定标定变量。
在Mode Workspace中新建一个Simulink.Parameter, Param_0,并在模型中使用它。
在底部Code Mapping处选中该Param, 修改为ConstantMemory,并在右侧Property
Inspector中的SwAddrMethod选项修改为CALIB_UNSPECIFIED, 勾选Const == TRUE, Volatile == TRUE, 同理其他标定变量都同样修改。生成的代码如下图所示。
在AUTOSAR Dictionary, 新建一个如图所示的SwAddrMethods-> MEASURABLE_CLEARED_UNSPECIFIED, 用来指定测量变量。
在Mode Workspace中新建一个Simulink.Signal, Moni_0,并在模型中使用它。
在底部Code Mapping处选中该Signals, 修改为StaticMemory,并在右侧Property Inspector中的SwAddrMethod选项修改为MEASURABLE_CLEARED_UNSPECIFIED, Volatile == TRUE, 其他测量变量都同样修改。生成的代码如下图所示。
9. 总结
导入arxml生成Simulink模型时需要导入必要的DataType,Interface, SWC信息。
对生成代码指定内存分区主要分为两类, 一类是需要通过SwAddrMethod指定的(Runable, 标定测量变量), 另一类保持默认的Default设置, 但是需要设计
MemoryPackage(Storage class)以更改default storage位置,最终要求生成的代码中所有变量, 代码都包含在宏:文章来源:https://www.toymoban.com/news/detail-845264.html
#define %<AUTOSAR_COMPONENT>_START_SEC_%<MemorySectionName>
#include "%<AUTOSAR_COMPONENT>_MemMap.h"
#define %<AUTOSAR_COMPONENT>_STOP_SEC_%<MemorySectionName>
#include "%<AUTOSAR_COMPONENT>_MemMap.h"
中间。
这样可以通过Cobara脚本生成的%<AUTOSAR_COMPONENT>_MemMap.h实现编译链接时对具体内存段在hex文件中和下载时地址的指定, 这样做的好处是便于进行分段更新(Bootloader)以及配置OS级别的内存保护。文章来源地址https://www.toymoban.com/news/detail-845264.html
到了这里,关于IsolarAB导出arxml到Matlab/Simulink生成模型并配置内存分区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!