为数据元素和函数类别配置默认的C代码生成
通过指定跨模型的数据元素类别和函数的默认配置,减少为C代码生成准备模型的工作。应用默认配置可以节省时间并降低在代码中引入错误的风险,特别是对于生成多实例代码的大型模型和模型。
您必须已设置示例环境,如中所述搭建示例环境。
搭建示例环境
将这些外部源文件和头文件从
matlabroot /工具箱/ rtw / rtwdemos
到一个可写的工作文件夹。这些文件定义并声明生成的代码使用的外部数据类型和数据。文件 描述 exDblFloat.h
定义项目数据类型别名为double, DBL_FLOAT
。万博1manbetx动态仿真模块®使用PreLoadFcn
为模型指定的回调函数来解析此头文件并创建相应的万博1manbetx仿真软件。AliasType
对象。exInDataMem.c
包括 exInDataMem.h
并定义变量ex_input1
。exInDataMem.h
包括 exDbFloat.h
并声明变量ex_input1
。exInDataLut.c
exInDataLut.c
包括exInDataLut.h
并定义变量ex_input2
,ex_input3
,ex_input4
。exInDataLut.h
包括 exDbFloat.h
并声明变量ex_input2
,ex_input3
,ex_input4
。exCodeDefs.sldd
数据字典 rtwdemo_configdefaults.slx
模型的例子。 打开示例模型的副本
rtwdemo_configdefaults
。在应用程序库中,打开嵌入式编码器应用程序。
配置数据的默认代码生成
这个例子展示了如何使用Code Mappings编辑器来指定模型数据的代码生成需求。该模型使用多个执行速率,并配置为单实例使用。
本例假设数据的代码生成需求如下:
使用项目类型定义
DBL_FLOAT
在头文件中定义exDblFloat.h
。获取数据元素
ex_input1
来自头文件exInDataMem.h
。数据用于计算存储在内存中的值,然后用于类的if-else条件开关块。获取数据元素
ex_input2
,ex_input3
,ex_input4
来自头文件exInDataLut.h
。数据用于查找表表1
而且表二
。从头文件导入模型的数据
exInDataMem.h
而且exInDataLut.h
是类型的DBL_FLOAT
,一个项目标准。参数
K1
必须可调以启用校准。数据存储
模式
定义模型中共享的数据。Logical Operator块写入数据存储,Rate Transition块从数据存储读取数据。数据元素
X
控件的延迟单位延迟块。存储模型内部的数据,比如延迟
X
,在一段内存中标注internalDataMem
。将输出数据声明导出到头文件
exSysOut.h
和定义exSysOut.c
。在生成的代码中,按照表中指定的方式命名表示输入和输出的变量,以便它们与外部头文件和定义文件中的变量名称相匹配。
尽管模型使用一些数据的单个实例,但示例配置默认设置以演示不同类型的映射。当您向模型中添加块时,新的数据元素将获得默认的代码生成映射。
为根导入配置默认设置
指定声明输入数据的外部头文件。四个根导入中的三个从头文件中声明的变量中读取输入exInDataLut.h
。将该头文件设置为默认值。
开放模式rtwdemo_configdefaults。将副本保存到可写位置。
打开嵌入式编码器应用程序。
在C代码选项卡上,选择代码接口>默认代码映射。这将打开代码映射编辑器数据默认值选项卡。
在数据默认值选项卡,扩大导入和输出。然后,选择港口。
将存储类设置为
ImportFromFile
。单击图标和设置头文件来
exInDataLut.h
。
配置模型参数的默认设置
为您希望可调的模型工作区参数配置默认设置。
在代码映射编辑器中,单击数据默认值选项卡。
在数据默认值选项卡,扩大参数。
在这一行模型参数,点击文字
'Auto'将被内联
。“模型配置参数”对话框打开到代码生成>优化窗格。集默认参数行为来可调
。应用更改并关闭对话框。在“代码映射”编辑器中,的右侧文本模型参数现在读Auto是可调的
。类的存储类,可在生成的模型参数代码中包含全局变量定义和声明模型参数类别
ExportedGlobal
。
为内部数据定义内存段
定义一个存储单元延迟的内存部分X
,模型内部的数据。
通过选择打开嵌入式编码器字典代码接口>嵌入式编码器词典。
在左窗格的“嵌入式编码器字典”中,单击记忆的部分。
点击创建。
在表的新行中,命名新的内存部分
internalDataMem
。还设置:之前的声明来
启动INTERNALDATA
发布声明来
#pragma end INTERNALDATA
语句包围来
变量组
关闭字典。
有关更多信息,请参见通过插入Pragmas控制数据和函数在内存中的位置。
配置内部数据的默认设置
为内部数据设置包含内存部分的默认代码生成配置internalDataMem
。
在代码映射编辑器中,单击数据默认值选项卡。
在数据默认值选项卡,扩大信号。
选择类别信号、状态和内部数据。
单击图标和设置记忆的部分来
internalDataMem
。
配置根输出端口的默认设置
为生成的代码写入输出的变量指定默认的外部头文件和定义文件。
在代码映射编辑器中,单击数据默认值选项卡。
在数据默认值选项卡,扩大导入和输出。
选择类别外港。
将存储类设置为
ExportToFile
。单击图标和设置头文件来
exSysOut.h
而且定义文件来exSysOut.c
。
将默认配置应用于单个数据元素
除非显式地将各个数据元素映射到替代存储类设置,否则Code Mappings编辑器假定元素的存储类为汽车
。当数据元素的存储类为时汽车
,代码生成器可能为了优化目的而消除或更改相关代码的表示。如果不可能进行优化,代码生成器将应用模型默认配置。
要避免优化并强制代码生成器使用默认配置,请将单个元素的存储类设置为
模型的默认
。若要覆盖默认配置,请指定满足该数据元素代码生成要求的存储类。
对于本例,配置代码生成器将默认存储类设置应用到这些数据元素:
港口
In2
,In3
,In4
外港
着干活
模型参数
K1
状态
X
在代码映射编辑器中,单击港口选项卡。
选择用于导入的行
In2
,In3
,In4
。然后,对于选中的一个导入,将存储类设置为模型默认值:ImportFromFile
。所选三个导入的存储类更改为模型默认值:ImportFromFile
。单击外港选项卡。对于输出港
着干活
,设置存储类为模型默认值:ExportToFile
。单击参数选项卡。扩大模型参数。然后,对于参数
K1
,设置存储类为模型默认值:ExportedGlobal
。单击信号/州选项卡。扩大州。国家
X
,设置存储类为型号默认:default
。保存模型。
生成和验证代码
生成代码并验证生成的代码。
在文件中
rtwdemo_configdefaults.h
,搜索# include
包含声明外部输入数据的头文件的语句。#include "exInDataLut.h"
打开的文件
rtwdemo_configdefaults.c
。代码初始化增益变量K1
并使用模型中的变量阶跃函数exFast_step1
。Dbl_float k1 = 2.0;……void exFast_step1(void) {DBL_FLOAT rtb_Gain;rtb_Gain = K1 * look1_binlc(ex_input2, (&(rtTable1_bp01Data[0])), (&(rtTable1_tableData[0])), 10U);rtDWork。RateTransition_Buffer0 = rtb_增益;}……}
在文件
rtwdemo_configdefaults.c
,找# pragma
定义内存段的控制行INTERNALDATA
(本地数据存储、单位延迟和常量)。#pragma start INTERNALDATA D_Work rtDWork;#pragma end INTERNALDATA…#pragma start INTERNALDATA static RT_MODEL;#pragma end INTERNALDATA…pragma start INTERNALDATA extern D_Work rtDWork;#pragma end INTERNALDATA
打开的文件
exSysOut.c
。的导出数据定义ex_output
。#包括“rtwdemo_configdefaults.h”
打开共享文件
exSysOut.h
。文件声明ex_output
。获得访问权限ex_output
,外部代码可以包含此头文件。ex_output;
配置函数的默认代码生成
这个例子展示了如何使用Code Mappings编辑器来指定模型函数的代码生成需求。该模型使用多个执行速率,并配置为单实例使用。代码生成器生成初始化、执行和终止入口点函数。由于模型使用多个费率,代码生成器为每个费率生成一个执行函数。
这个例子假设这些代码生成需求:
将生成的初始化和终止函数存储在内存段中
functionSlowMem
并在内存部分执行函数functionFastMem
。使用命名规则
exSlow_ $ N
的名字初始化
而且终止
功能。使用命名规则exFast_ $ N
来命名执行函数。
定义内存段
定义两个内存部分:functionSlowMem
用于初始化和终止函数和functionFastMem
用于执行函数。
打开嵌入式编码器应用程序。
通过选择打开嵌入式编码器字典代码接口>嵌入式编码器词典。
在左窗格的“嵌入式编码器字典”中,单击记忆的部分。
点击创建。
在表的新行中,命名新的内存部分
functionFastMem
。然后,设置:之前的声明来
启动FASTMEM
发布声明来
#pragma结束FASTMEM
点击添加一次。命名内存部分
functionSlowMem
。然后,设置:之前的声明来
启动SLOWMEM
发布声明来
#pragma结束SLOWMEM
定义函数定制模板
在配置功能类别时,需要定义功能定制模板。除非在嵌入式编码器字典中定义与模型相关联的模板,否则唯一可用的模板是默认的
。根据需求,在字典中定义两个函数定制模板:一个为初始化函数和终止函数指定命名规则和内存段,一个为执行函数指定命名规则和内存段。
在“嵌入式编码器字典”中,单击功能定制模板。
点击创建。
在表的新行中,命名新模板
exFastFunction
。然后,设置:函数名来
exFast_ $ N
。此命名规则应用前缀exFast_
到标识函数的默认代码生成器名称的名称(例如,初始化
或一步
).记忆的部分来
functionFastMem
。中定义的内存段与此映射关联定义内存段使用新模板。
点击创建一次。命名模板
exSlowFunction
。然后,设置:函数名来
exSlow_ $ N
。记忆的部分来
functionSlowMem
。
关闭字典。
配置功能默认设置
在C代码选项卡上,单击代码接口>默认代码映射。
在代码映射编辑器中,单击功能默认值选项卡。
配置初始化和终止入口点函数。的类别初始化和终止,选择模板
exSlowFunction
。配置执行入口点函数。的类别执行,选择模板
exFastFunction
。保存模型。
生成和验证代码
生成的代码。
在代码观点:
-
打开的文件
rtwdemo_configdefaults.c
。请按搜索字段。一个菜单列出了生成的入口点函数:exFast_step0
(周期性调用,每0.5秒一次)exFast_step1
(周期性调用,每1秒一次)exFast_step2
(周期性调用,每1.5秒一次)exSlow_initialize
以获得访问函数代码中的入口点
rtwdemo_configdefaults.c
,单击函数名称。验证编译指示
围绕函数代码的控制语句。例如:……#pragma start FASTMEM void exFast_step2(void) /*采样时间:[1.5s, 0.0s] */ {boolean_T rtb_DataStoreRead;rtb_DataStoreRead = ((ex_input1 > 10.0) || (ex_input1 < -10.0));rtDWork。RateTransition1_Buffer0 = rtb_DataStoreRead;} #pragma end FASTMEM #pragma start SLOWMEM void exSlow_initialize(void){/*(不需要初始化代码)*/}#pragma end SLOWMEM . .
打开的文件
rtwdemo_configdefaults.h
。使用搜索找到# pragma
定义内存段的控制行FASTMEM
而且SLOWMEM
。验证编译指示
控制语句围绕着声明。例如:……start SLOWMEM extern void exSlow_initialize(void);#pragma start FASTMEM extern void exFast_step0(void);#pragma end FASTMEM…
配置用于代码生成的模型元素,其定义存储在共享数据字典中
您可以使用在Simulink数据字典中设置的定义来配置默认数据和函数代码生成。万博1manbetx数据字典支持在模型之间共享代码定义。此示例展示了如何将模型从使用特定于模型的嵌入式编码器字典中的代码定义更改为使用共享数据字典中的嵌入式编码器字典中的定义。如果你已经完成了配置数据的默认代码生成而且配置函数的默认代码生成您已经将这些代码定义添加到与模型关联的嵌入式编码器字典中rtwdemo_configdefaults
。
记忆的部分
internalDataMem
与之前的声明设置为启动INTERNALDATA
而且发布声明设置为#pragma end INTERNALDATA
。记忆的部分
functionFastMem
与之前的声明设置为启动FASTMEM
而且发布声明设置为#pragma结束FASTMEM
。记忆的部分
functionSlowMem
与之前的声明设置为启动SLOWMEM
而且发布声明设置为#pragma结束SLOWMEM
。功能定制模板
exFastFunction
函数命名规则exFast_ $ N
记忆部分functionFastMem
功能定制模板
exSlowFunction
函数命名规则exSlow_ $ N
记忆部分functionSlowMem
更新模型rtwdemo_configdefaults
使用数据字典exCodeDefs中的相同代码定义。sldd而不是本地模型嵌入式编码器字典中的定义。
您必须已设置示例环境,如中所述搭建示例环境。
链接模型到共享数据字典
在Simuli万博1manbetxnk编辑器中,选择建模>数据字典链接。
在“模型属性”对话框中外部数据选项卡,浏览到数据字典文件副本的位置
exCodeDefs
然后选择该文件。点击迁移数据。
在“将模型链接到数据字典”对话框中,单击应用。
在“数据迁移”对话框中,单击迁移。数据迁移完成后,单击好吧。
回顾链接数据字典的内容
在模型画布的左下角,单击模型数据图标。
从模型数据源列表中,单击外部数据。
在模型资源管理器中模型层次结构窗格中,展开exCodeDefs节点。
右键单击嵌入式编码器词典。
单击打开嵌入式编码器字典显示的按钮。
在“嵌入式编码器字典”中,查看功能定制模板而且记忆的部分选项卡。
关闭嵌入式编码器字典。
从模型嵌入式编码器字典中删除模型源代码定义
打开嵌入式编码器应用程序。
在C代码选项卡上,选择代码接口>嵌入式编码器词典。
删除在模型中本地创建的代码定义。
在功能定制模板表中,选择的行
exSlowFunction
而且exFastFunction
有源设置为rtwdemo_configdefaults
。单击删除图标。在记忆的部分表中,选择的行
functionFastMem
,functionSlowMem
,internalDataMem
有源设置为rtwdemo_configdefaults
。单击删除图标。
关闭字典。
保存模型。
为代码生成配置默认类别
在C代码选项卡上,选择代码接口>默认代码映射。
在代码映射编辑器中,单击数据默认值选项卡。
扩大信号。选择类别信号、状态和内部数据。
单击图标。集记忆的部分来
internalDataMem
。单击功能默认值选项卡。
为初始化和终止类别,选择功能定制模板
exSlowFunction
。为执行类别,选择模板
exFastFunction
。
保存模型。
生成并审查代码。
有关设置嵌入式编码器字典的详细信息,请参见为软件架构定义存储类、内存段和功能模板。
以编程方式配置默认数据和功能代码生成
这个例子展示了如何配置默认数据和生成示例模型的函数代码rtwdemo_configdefaults
该示例使用默认映射编程接口来指定模型数据和函数的代码生成要求。使用该接口来自动化配置,或者如果您喜欢以编程方式配置模型。有关使用代码映射编辑器配置默认数据和函数代码生成的信息,请参见为数据元素和函数类别配置默认的C代码生成。
打开模型
该模型rtwdemo_configdefaults
使用多个执行速率,并配置为单实例使用。
open_system (“rtwdemo_configdefaults”)
代码生成要求
对于本例,以下是代码生成需求:
为类型的数据导入项目类型定义
双
, DBL_FLOAT,从头文件exDblFloat.h
。输入信号
ex_input1
用于计算存储在内存中的值,并用于Switch块中的if-else条件。从头文件中导入信号数据exInDataMem.h
。进口的信号
ex_input2
,ex_input3
,ex_input4
查找表表1
而且表二
。从头文件中导入信号数据exInDataLut.h
。从头文件导入模型的数据
exInDataMem.h
而且exInDataLut.h
是类型的DBL_FLOAT
,一个项目标准。参数
上
,较低的
,K1
,K2
是存储在模型工作区中的参数对象。在生成的代码中将参数表示为全局变量。数据元素
X
表示单位延迟块的延迟。在内存部分中存储模型内部的数据
internalDataMem
。将生成的初始化和终止函数存储在内存段中
functionSlowMem
并在内存部分执行函数functionFastMem
。使用标识符命名规则
exSlow_ $ N
的名字初始化
而且终止
入口点函数。使用命名规则exFast_ $ N
命名0.5秒和1.5秒周期函数的执行函数。设置1秒周期函数的名称为exFast_1sec
。将输出数据声明导出到头文件
exSysOut.h
和定义exSysOut.c
。
对于这个例子,某人(比如系统架构师)之前已经在嵌入式编码器字典中创建了这些代码定义,该字典是Simulink数据字典的一部分万博1manbetxexCodeDefs.sldd
:
记忆的部分
internalDataMem
,functionFastMem
,functionSlowMem
。功能定制模板
exFastFunction
而且exSlowFunction
。
获取模型的数据和函数代码映射
获取示例模型的代码映射rtwdemo_configdefaults
通过在函数调用中指定模型的名称coder.mapping.api.get
。该函数返回一个对象,该对象表示模型的代码映射。在随后调用API中的其他函数时,将该对象指定为第一个参数。
如果模型不存在代码映射,则通过调用coder.mapping.utils.create
。
Cm = code .mapping.api.get(“rtwdemo_configdefaults”);
设置相关类别、属性和值组合
的调用设置相关的类别、属性和值组合setDataDefaults
而且setFunctionDefaults
。为这些函数指定的前两个参数是返回的代码映射对象coder.mapping.api.get
和数据或函数类别的名称。此外,您还可以指定名称-值对参数,这些参数指定要设置的默认配置信息,例如存储类和存储类属性。
在这个例子中,你设置默认值:
导入块、输出块和模型参数的存储类
内存部分用于内部数据(例如信号和块状态)
导入和输出端口块的头文件和定义文件
函数自定义模板,用于初始化、终止和执行函数
配置数据默认值setDataDefault(厘米,“港口”,“StorageClass”,“ImportFromFile”,“HeaderFile”,“exInDataLut.h”);setDataDefault(厘米,“输出港”,“StorageClass”,“ExportToFile”,“HeaderFile”,“exSysOut.h”,...“DefinitionFile”,“exSysOut.c”);setDataDefault(厘米,“ModelParameters”,“StorageClass”,“ExportedGlobal”);setDataDefault(厘米,“InternalData”,“MemorySection”,“internalDataMem”);配置函数默认值setFunctionDefault(厘米,“InitializeTerminate”,“FunctionCustomizationTemplate”,“exSlowFunction”);setFunctionDefault(厘米,“执行”,“FunctionCustomizationTemplate”,“exFastFunction”);
验证默认映射
的调用来验证默认映射getDataDefaults
和getFunctionDefaults
。为这些函数指定的前两个参数是返回的代码映射对象coder.mapping.api.get
和数据或函数类别的名称。此外,您还可以指定希望函数返回的配置信息的名称,例如存储类的名称或存储类属性。
在这个例子中,你验证这些默认设置:
导入块、输出块和模型参数的存储类
内存部分用于内部数据(例如信号数据和块状态)
导入和输出端口块的头文件和定义文件
函数自定义模板,用于初始化、终止和执行函数
验证默认数据配置defscInports = getDataDefault(cm,“港口”,“StorageClass”)
defscInports = 'ImportFromFile'
defhfileInports = getDataDefault(cm,“港口”,“HeaderFile”)
defhfileInports = 'exInDataLut.h'
defscOutport = getDataDefault(cm,“输出港”,“StorageClass”)
defscOutport = 'ExportToFile'
defhfileOutport = getDataDefault(cm,“输出港”,“HeaderFile”)
defhfileOutport = 'exSysOut.h'
defdffileOutport = getDataDefault(cm,“输出港”,“DefinitionFile”)
defdffileOutport = 'exSysOut.c'
defscParams = getDataDefault(cm,“ModelParameters”,“StorageClass”)
defscParams = 'ExportedGlobal'
defmemInternal = getDataDefault(cm,“InternalData”,“MemorySection”)
defmemInternal = 'internalDataMem'
检查默认功能配置deftempInitTerm = getFunctionDefault(cm,“InitializeTerminate”,“FunctionCustomizationTemplate”)
deftempInitTerm = 'exSlowFunction'
deftempExecution = getFunctionDefault(cm,“执行”,“FunctionCustomizationTemplate”)
deftempExecution = 'exFastFunction'
将各个数据元素配置为使用默认配置设置
每个模型数据元素的存储类都设置为汽车
,这意味着代码生成器可能为了优化目的而消除或更改相关代码的表示。如果不可能进行优化,代码生成器将应用模型默认配置。
要避免优化并强制代码生成器使用默认配置,请将存储类设置为
模型的默认
。若要覆盖默认配置,请指定满足该导入的代码生成要求的存储类。
对于本例,您将代码生成器配置为将默认存储类设置应用于import块、Output块、模型参数和状态X
为单位延迟块。使用找到
函数获取不同类别的模型中数据元素的名称。然后,使用返回的值找到
在呼叫setInport
,setOutport
,setModelParameter
,设置状态
将存储类设置为模型的默认
。使用调用getInport
,getOutport
,getModelParameter
,getState
为了验证,存储类设置。
在每个函数调用中,指定返回的代码映射对象coder.mapping.api.get
。此外:
的调用
找到
函数时,指定一个值,该值指示希望函数返回的代码映射信息。调用
setInport
,setOutport
,setModelParameter
,设置状态
确定要配置的数据元素和指定要设置的配置信息(如存储类或存储类属性)的名-值对参数。调用
getInport
,getOutport
,getModelParameter
,getState
确定要为其返回配置信息的数据元素,以及希望函数返回的信息类型。
输入= find(cm,“港口”);setInport (cm、输入、“StorageClass”,“模型默认”);输出= find(cm,“输出港”);setOutport (cm、输出“StorageClass”,“模型默认”);Params = find(cm,“ModelParameters”);setModelParameter (cm,参数,“StorageClass”,“模型默认”);状态= find(cm,“州”);设置状态(cm、状态“StorageClass”,“模型默认”);scIn1 = getInport(cm,“三机”,“StorageClass”)
scIn1 = '默认型号'
scIn2 = getInport(cm,“In2”,“StorageClass”)
scIn2 = '默认型号'
scIn3 = getInport(cm,“In3”,“StorageClass”)
scIn3 = '默认型号'
scIn4 = getInport(cm,“In4”,“StorageClass”)
scIn4 = '默认型号'
scK1 = getModelParameter(cm,“K1”,“StorageClass”)
scK1 = '默认型号'
scTable2 = getModelParameter(cm,“表”,“StorageClass”)
scTable2 = '默认模型'
scK2 = getModelParameter(cm,“K2”,“StorageClass”)
scK2 = '默认型号'
scX = getState(cm,rtwdemo_configdefaults /延迟的,“StorageClass”)
scX = '默认型号'
覆盖导入块In1的默认头文件设置
以前,您将导入的默认头文件设置为exInDataLut.h
。需求指定您为import块导入数据三机一体
来自头文件exInDataMem.h
。
为轮廓尺寸
块三机一体
,将默认存储类重写为ImportFromFile
头文件设置为exInDataMem.h
用一个电话setInport
。函数调用指定返回的代码映射对象coder.mapping.api.get
、要配置的Inport块的名称,以及指定函数集的名-值对参数StorageClass
来ImportFromFile
而且HeaderFile
来exInDataMem.h
。
setInport(厘米,“三机”,“StorageClass”,“ImportFromFile”,“HeaderFile”,“exInDataMem.h”);
检查头文件设置
验证导入块的更新头文件设置三机一体
用一个电话getInport
.函数调用指定返回的代码映射对象coder.mapping.api.get
,感兴趣的import块的名称,以及要返回的配置信息。
hfileIn1 = getInport(cm,“三机”,“StorageClass”)
hfileIn1 = 'ImportFromFile'
覆盖步骤功能的默认功能名设置
前面,您将执行函数的默认函数自定义模板设置为functionFastMem,
应用命名规则exFast_ $ N
到为模型生成的三个步骤函数。需求指定了函数的名称周期:D2
,其采样时间为1秒exFast_1sec。
将函数名设置为setFunction
.函数调用指定返回的代码映射对象coder.mapping.api.get
,函数的源,Periodic:D2,以及指定函数将函数名设置为的名称-值对参数exFast_1sec
。
setFunction(厘米,“周期:D2”,“FunctionName”,“exFast_1sec”)
验证函数名设置
验证执行函数的更新函数名设置周期:D2
用一个电话getFunction
.函数调用指定返回的代码映射对象coder.mapping.api.get
利息和财产的功能FunctionName
。
function = getFunction(cm,“周期:D2”,“FunctionName”)
functionName = 'exFast_1sec'
相关链接