配置根级外港C代码生成块
要使用从模型生成的代码,可以调用生成的入口点函数。调用环境和生成的函数交换输入和输出数据,例如,作为全局变量或函数参数。根级外港块(outports)构成接口的输出数据。要将生成的代码集成并部署到更大的应用程序中,您可以自定义代码生成器如何生成接口代码,包括如何声明和处理输出数据。定制可以:
尽量减少对现有代码的修改。
生成稳定的接口,当您对模型进行更改时,这些接口不会发生更改或变化最小。
生成更有效地交换数据的代码(例如,通过对非标量数据使用指针和引用传递参数)。
对于代码生成,示例展示了如何为模型定制输出接口rtwdemo_configinterface
.属性配置代码映射代码映射编辑器- C或代码映射API (coder.mapping.api.CodeMapping
).
选择“输出接口”的自定义选项
默认情况下,模型中的根级输出端口在生成的代码中显示为全局数据结构的字段
.根据代码接口需求,决定是否自定义输出端口数据的生成。如果不配置自定义,代码生成器将确定是否消除或更改生成的代码中输出端口的表示,以实现优化目的。如果您配置自定义,请确定:模型
_ExtY
是否设置默认配置
如果模型包含大量的根级输出端口(例如,超过10个),那么使用默认设置配置输出端口,并在特殊情况下覆盖该设置会更有效。如果模型包含一些具有唯一源、命名或放置需求的输出端口,请考虑单独配置这些输出端口。
如何在生成的接口中声明和处理输出数据
作为单独的全局变量
将输出数据写入外部代码中定义的全局变量
对于引用的模型输出,作为全局变量(
void-void
)作为访问函数的调用。需要嵌入式编码器®
作为入口点函数参数。需要嵌入式编码器
有关这些选项的详细信息,请参见生成代码中的控制数据和函数接口.
其他考虑因素包括:
通过使用模型中出现的Outport块标签或使用唯一的代码标识符,在生成的代码中命名输出端口。
包括
挥发性
在全局变量定义和声明中输入限定符。需要嵌入式编码器。看到使用const和volatile类型限定符保护全局数据.从内存的特定区域写入数据。需要嵌入式编码器。看到通过插入Pragmas控制数据和函数在内存中的位置.
有关与具有相应存储类和存储类属性的输出端口相关的列表接口需求的列表,请参见选择在生成的代码中控制数据表示的存储类.
示例模型的输出接口需求rtwdemo_configinterface
是:
使用项目类型定义
MYTYPE
中定义的rtwdemo_configinterface_data.m
.为输出声明一个变量
着干活
在生成的外部头文件中exOutSys.h
并在源定义文件中定义该变量exOutSys.c
.写入的数据着干活
是Switch块生成的代码的输出。在生成的代码中表示输出端口的变量必须命名
output1
.该名称是外部代码接口用于访问输出数据的变量名。
对于本例,配置in的输出端口rtwdemo_configinterface
以满足这些代码生成需求。
为根级输出配置默认代码生成设置
根级输出端口的默认代码生成设置可以减少为代码生成准备模型的工作,特别是当模型具有大量输出端口时。选择一次配置设置,代码生成器将这些设置应用到整个模型的输出端口。金宝app动态仿真模块®将默认配置存储为模型的一部分。
如果您的模型使用多个没有唯一需求的根级输出端口,那么考虑为模型输出端口配置默认的代码生成设置或使用共享的嵌入式编码器字典.
示例模型rtwdemo_configinterface
包括一个根级输出端口。方法的使用代码映射编辑器- C为根级输出端口配置默认设置。指定代码生成器在生成的外部头文件和定义文件中声明和定义变量以表示根输出。命名生成的默认外部头文件exOutSys.h
以及生成的定义文件exOutSys.c
.
开放范例模型
rtwdemo_configinterface
.将模型的副本保存到可写位置。打开嵌入式编码器应用程序。
在C代码选项卡上,选择代码接口>默认代码映射.
在“代码映射”编辑器中导入和输出,选择类别外港.将默认存储类设置为
ExportToFile
.单击
图标和设置头文件来
exOutSys.h
而且定义文件来exOutSys.c
.保存模型。
为各个根级输出配置代码生成设置
您可以为代码生成配置单独的根级输出。例如,如果一个模型有两个具有唯一代码生成需求的根级输出端口,则分别配置输出端口。或者,如果为输出端口配置默认设置,请配置各个输出端口以使用默认设置或唯一设置。
如果您的模型至少满足以下条件之一,请考虑为输出单独配置代码生成设置:
使用具有唯一需求的多个输出端口。
使用很少的输出端口。
有一个用于输出端口的默认配置,您需要覆盖某些特定输出端口的配置。
这个例子展示了如何使用Code Mappings编辑器为模型中的输出端口应用默认的代码生成配置rtwdemo_configinterface
.在前面的示例中,您将输出端口的默认存储类设置为ExportToFile
.需求指定了输出端口着干活
将输出数据写入外部代码可访问的生成头文件和定义文件中声明和定义的全局变量。
该示例还展示了如何配置代码生成器用于在生成的代码中命名输出端口的标识符。您可以指定代码生成标识符,例如用于集成,而无需修改模型设计。
如果您还没有这样做,请完成下面的步骤为根级输出配置默认代码生成设置.
在代码映射编辑器中,单击外港选项卡。编辑器列出模型中的Outport块和总线元素的名称。如果端口解析为信号对象,则在元素名称的右侧出现一个解析为信号对象的图标。示例模型中输出端口的存储类设置为
汽车
,这意味着代码生成器可能为了优化目的而消除或更改相关代码的表示。如果不可能进行优化,代码生成器将应用模型默认配置。对于本例,模型默认配置指定存储类ExportToFile
.要避免优化并强制代码生成器使用默认配置,请将存储类设置为
模型的默认
.若要覆盖默认配置,请指定满足该输出端口代码生成需求的存储类。
配置代码生成器,将默认存储类设置应用到输出端口
着干活
.选择输出端口的行。将存储类设置为模型默认值:ExportToFile
.所选输出端口的存储类更改为
模型默认值:ExportToFile
.配置输出端口的代码标识符,以便生成的代码中的接口参数名称与外部代码使用的接口名称匹配。在“代码映射”编辑器中,选择输出端口的行。单击
图标,并设置标识符财产
输出
.保存模型。
生成并查看代码。例如,在文件中
rtwdemo_configinterface.c
,查找变量输出
在步进点函数中使用。if (mode) {output = (real_T)mp_K1 * dout_Table1;} else {output = dstate_X;}
以编程方式配置根级输出的代码生成设置
要自动配置代码生成的根级输出端口,请使用代码映射的编程接口。例如,当创建自定义块库或应用程序测试环境的一部分时,使用编程接口来自动化数据配置。
此示例展示如何使用编程接口为模型的根级输出端口配置默认设置rtwdemo_configinterface
.
为代码配置一个输出端口的标识符,以便生成的代码中的全局变量名与外部代码接口中的变量名匹配。
打开示例模型。
open_system(“rtwdemo_configinterface”)
创建对象
厘米
通过调用函数coder.mapping.api.get
.对象存储数据元素的代码生成配置和功能在模型rtwdemo_configinterface
.Cm = code .mapping.api.get('rtwdemo_configinterface');
通过调用函数配置输出端口的默认设置
setDataDefault
.对于参数,指定这些值。返回的对象。
coder.mapping.api.get
外港
对于默认类别属性名
StorageClass
具有财产价值ExportToFile
属性名
HeaderFile
具有财产价值exOutSys.h
属性名DefinitionFile
具有财产价值exOutSys.c
,声明和定义输出数据的生成文件的名称
setDataDefault (cm,外港,‘StorageClass’,‘ExportToFile’,‘HeaderFile’,‘exOutSys.h’,……“DefinitionFile”、“exOutSys.c”)
验证输出端口的默认配置。发出三次呼叫
getDataDefault
返回的对象coder.mapping.api.get
和类别外港
.在第一次调用中,将第三个参数指定为property
StorageClass
.在第二次调用中,对于第三个参数,指定
HeaderFile
.在第三次调用中,对于第三个参数,指定
DefinitionFile
.
getDataDefault(cm,'Outports','StorageClass') ans = 'ExportToFile' getDataDefault(cm,'Outports','HeaderFile') ans = 'exOutSys.h' getDataDefault(cm,'Outports','DefinitionFile') ans = 'exOutSys.c'
为outport应用默认的outport配置
着干活
.默认情况下,Simuli金宝appnk将单个输出端口的存储类设置为
汽车
.当存储类为汽车
,代码生成器:确定是否为优化目的从生成的代码中删除数据。
如果保留数据,则决定如何在生成的代码中有效地表示数据,并考虑默认配置设置。
要控制输出端口的配置,请调用函数
setOutport
.发出呼叫
setOutport
指定:返回的对象
coder.mapping.api.get
输出端口块名称
着干活
先前使用属性为输出端口设置的默认存储类
StorageClass
以及财产价值模型的默认
财产
标识符
以及财产价值输出
setOutport(厘米,着干活,“StorageClass”、“违约模型”,“标识符”,“输出”);
通过调用函数验证配置更改
getOutport
.指定返回的对象coder.mapping.api.get
、输出端口块的名称和属性StorageClass
或标识符
.getOutport(cm,'Out1','StorageClass') ans = 'Model default' getOutport(cm,'Out1','Identifier') ans = 'output'
保存模型。
生成并查看代码。例如,在文件中
rtwdemo_configinterface.c
,查找变量输出
在步进点函数中使用。if (mode) {output = (real_T)mp_K1 * dout_Table1;} else {output = dstate_X;}
为根级输出端口选择存储类和存储类属性
根据您的代码生成需求,从这些存储类中进行选择,为根级输出配置代码生成。
需求 | 存储类 |
---|---|
启用优化,可能会生成更高效的代码。 | 汽车(仅限单个映射) |
对于无法优化的数据元素,将数据表示为标准数据结构的字段。 | 默认的(仅默认映射) |
防止优化消除数据元素的存储,并对数据元素类别使用默认映射。 | 模型的默认(仅限单个映射),词典默认 (仅限单个映射) |
生成一个在命名位域中存储布尔数据的结构。 | 设置(仅限单个映射) |
属性的全局变量定义和声明挥发性 类型限定符。 |
挥发性 (见Const, Volatile和ConstVolatile) |
生成全局变量定义和声明。 | ExportedGlobal |
生成指定文件的全局变量定义和声明。 | ExportToFile |
通过调用自定义访问器函数生成与数据交互的代码。 | GetSet |
生成从外部代码定义的全局变量或全局变量指针读取和写入的代码。 | ImportedExtern, ImportedExternPointer |
生成读取和写入外部头文件定义的全局变量的代码。 | ImportFromFile |
生成函数的局部变量。 | 可以定位的 |
生成一个具有名称的全局结构,您可以指定名称。 | 结构体(仅限单个映射) |
可用存储类的列表可能包括嵌入式编码器字典中定义的其他特定于项目的存储类。如果您有列出的存储类无法满足的特殊需求,并且您有嵌入式Coder软件,那么您可以定义一个存储类。看到为软件架构定义服务接口、存储类、内存段和功能模板.
对于单独的输出端口,使用标识符属性为生成的代码中表示输出端口的变量配置名称。使用Embedded Coder,您还可以根据所选择的存储类配置这些属性。
财产 | 描述 | 存储类 |
---|---|---|
DefinitionFile |
包含全局数据定义的源定义文件,由输出端口和外部代码读取 | ExportToFile 而且挥发性 |
GetFunction |
输出端口在生成的代码中显示为对指定对象的调用得到 函数 |
GetSet |
HeaderFile |
所生成的包含全局数据声明的源头文件的名称,该声明由输出端口和外部代码编写 | ExportToFile ,GetSet ,ImportFromFile ,挥发性 |
记忆的部分 (仅限默认输出端口配置) |
包含由输出端口写入的数据的内存段 | 默认的 |
老板 |
代码生成器将输出端口的定义放在为共享定义的模型层次结构中的多个模型之一生成的代码中。您必须选择模型配置参数使用数据对象的所有者来放置数据定义.看到控制在生成的文件中全局数据定义和声明的放置. | ExportToFile 而且挥发性 |
PreserveDimensions |
代码生成器保留在生成的代码中表示为多维数组的输出数据的维度。必须设置模型配置参数阵列布局来行 .看到在生成的代码中保留多维数组的维度. |
ExportToFile ,GetSet ,ImportFromFile ,可以定位的 ,挥发性 |
SetFunction |
输出端口在生成的代码中显示为对指定对象的调用集 函数。 |
GetSet |
StructName |
生成的输出代码中结构的名称。 | 设置 而且结构体 |
另请参阅
代码映射编辑器- C|coder.mapping.api.CodeMapping