生成代码中的控制数据和函数接口
要使用从模型生成的代码,可以调用生成的入口点函数,例如一步
和初始化
.调用环境和生成的函数通过全局变量或形式参数(参数)交换输入和输出数据。这些数据和交换机制构成了入口点函数的接口。有关生成代码中可重入模型和不可重入模型的默认接口的信息,请参见生成的代码如何与环境交换数据.
通过控制生成代码中出现的接口,您可以:
尽量减少必须对现有代码进行的修改。
生成稳定的接口,当您对模型进行更改时,这些接口不会发生更改或最小程度的更改。
生成更有效地交换数据的代码(例如,通过对非标量数据使用指针和引用传递参数)。
标准I/O结构的控件类型名称、字段名称和变量名称(嵌入式编码器)
默认情况下,对于不可重入的代码,轮廓尺寸模型根级别的块作为全局结构变量的字段出现在生成的代码中。同样的,外港块以不同的结构出现。对于可重入代码,取决于您对模型配置参数的设置传递根级I/O,代码生成器还可以将输入和输出数据打包到标准结构中。
使用嵌入式编码器®,您可以控制这些名称。看到数据结构的控制特性(嵌入式编码器).
生成的入口点函数的控件名称(嵌入式编码器)
要使用生成的代码,需要编写调用生成的入口点函数的代码。例如,入口点函数包括
,模型
_step
,以及由导出函数模型生成的顶层函数。为了控制模型入口点函数的名称,使用Code Mappings编辑器(需要Embedded Coder)来应用以下技术的组合:模型
_initialize
在功能默认值选项卡,通过在“代码映射”编辑器中应用函数自定义模板,为入口点函数的类别指定默认命名规则。使用这种技术,命名规则应用于类别中的函数。有关更多信息,请参见配置函数的默认代码生成(嵌入式编码)。
在功能选项卡,通过直接编辑函数名列或通过配置对话框打开的预览功能列。指定的名称将覆盖函数自定义模板指定的默认命名规则。有关更多信息,请参见自定义生成的C函数接口(嵌入式编码)
不可重入代码的控制数据接口
当您设置模型配置参数时代码接口打包来那种一次性的功能
(默认),生成的入口点函数是不可重入的。通常,函数通过直接访问全局变量与调用环境交换数据。
配置轮廓尺寸或外港块作为单独的全局变量
要通过创建单独的全局变量从标准I/O结构中删除块,可以应用存储类,例如ExportedGlobal
或ExportToFile
,到该块所代表的信号。
指定的默认存储类轮廓尺寸块和不同的默认值外港块,使用代码映射编辑器。当您将这些块添加到模型中时,它们将获得您指定的存储类。您不需要配置每个单独的块。
对于这种技术,您必须有嵌入式编码器。
要覆盖单个块的默认值,请使用其他工具(如模型数据编辑器或属性检查器)应用不同的存储类。看到将存储类应用于单个信号、状态和参数数据元素.
有关示例,请参见通过配置输入和输出块设计数据接口.有关存储类的一般信息,请参见选择在生成的代码中控制数据表示的存储类.
将生成的代码配置为读写外部代码定义的全局变量
如果调用代码已经定义了一个全局变量,希望生成的代码将其用作输入数据或存储输出数据,则可以通过防止代码生成器复制该定义来重用该变量。将存储类应用到相应的轮廓尺寸或外港块在模型中。选择指定导入数据范围的存储类,例如ImportedExtern
或ImportFromFile
.有关应用存储类的信息,请参见将存储类应用于单个信号、状态和参数数据元素和将内置和自定义存储类应用于数据元素(嵌入式编码)。
将多个输入或输出打包成自定义结构
您可以配置单个轮廓尺寸或外港块以包含多个输入或输出信号的自定义结构的形式出现在生成的代码中。您还可以将块配置为默认I/O结构的子结构或单独的结构变量。
将该块配置为非虚拟总线金宝app仿真软件。公共汽车
对象作为块的数据类型。如果外部代码定义了结构类型,请考虑使用金宝appSimulink.importExternalCTypes
函数生成总线对象。
要在标准I/O结构中生成总线信号作为子结构,请保持块存储类的默认设置,
汽车
.如果您有嵌入式编码器,请在“代码映射”编辑器中数据默认值选项卡,设置类别的存储类港口和外港来默认的
.要将总线信号作为单独的全局结构变量生成,请应用存储类,例如
ExportedGlobal
或ExportToFile
.
有关在生成的代码中将信号分组为自定义结构的更多信息,请参见在生成的代码中将数据组织成结构.
配置轮廓尺寸或外港块作为函数调用(嵌入式编码器)
如果外部代码定义了一个函数,该函数为生成的代码返回输入数据或接受生成的代码产生的输出数据,则可以配置轮廓尺寸或外港块,以便生成的代码调用函数而不是访问全局变量。应用嵌入式编码器存储类GetSet
.有关更多信息,请参见通过存储类为GetSet的函数访问数据(嵌入式编码)。
通过函数参数传递输入和输出(嵌入式编码器)
使用Embedded Coder,您可以有选择地配置模型步骤(执行)函数,以通过参数访问根级输入和输出,而不是直接读取和写入全局变量。完全控制参数特征,如名称、顺序和传递机制(通过引用或值)。这种级别的配置有助于将生成的代码与外部代码集成。
如果需要通过参数传递输入输出,请在“配置C步功能”界面中选择为Step函数原型配置参数.每一个轮廓尺寸和外港模型根级别的块作为执行函数的参数出现在代码中。有关更多信息,请参见自定义生成的C函数接口(嵌入式编码)。
将引用模型的输入和输出配置为全局变量(void-void
)
默认情况下,对于不可重入的引用模型,生成的代码通过函数参数传递根级输入和输出。不可重入引用模型是指在其中设置模型配置参数的模型每个顶级模型允许的实例总数来一个
.
要通过全局变量来传递此数据(对于void-void
接口),在引用的模型中应用存储类,如ExportedGlobal
和ExportToFile
到根级轮廓尺寸和外港块。
若要将默认存储类应用于此类块,请使用代码映射编辑器,这需要嵌入式编码器。使用此技术,当您将此类块添加到模型中时,这些块将获得默认存储类,并保留
void-void
接口。有关更多信息,请参见配置数据的默认代码生成(嵌入式编码)。若要重写默认存储类,请使用Model Data Editor将存储类直接应用到各个块。看到将存储类应用于单个信号、状态和参数数据元素(嵌入式编码)。
有关需要Embedded Coder的示例,请参见在组件系统中建立数据所有权(嵌入式编码)。
可重入代码的控制数据接口
当你设置代码接口打包来可重用的功能
,生成的入口点函数是可重入的。函数通过正式的参数(参数)与调用环境交换数据。默认情况下,每个根级别轮廓尺寸和外港block在生成的代码中作为单独的参数出现,而不是标准I/O结构的字段。
若要减少参数的数量,请参见通过使用结构体减少参数的数量.
若要控制参数的数据类型,请参见控制参数的数据类型.
防止对接口进行非预期的更改
对模型所做的一些更改会更改生成代码中的入口点函数接口。例如,如果您更改了模型的名称,则函数的名称也可以更改。如果您将模型代码配置为通过参数交换数据,当您添加或删除时轮廓尺寸或外港块或改变块的名称,相应的参数也可以改变。
为了便于维护调用代码,请防止对入口点函数的接口进行更改。
如果您通过参数交换输入和输出数据,请将生成的代码配置为打包轮廓尺寸和外港将块放入结构中,而不是允许每个块作为单独的参数出现(默认值)。然后,当你添加或删除轮廓尺寸或外港块,或者改变它们的属性,如名称和数据类型,结构的字段改变,但函数接口不改变。看到通过使用结构体减少参数的数量.
的数据类型轮廓尺寸和外港显式块,而不是使用继承的数据类型设置(这些块默认使用)。继承的数据类型设置可以导致块使用不同的数据类型,这取决于上游和下游信号的数据类型。有关配置数据类型的详细信息,请参见控制信号数据类型(金宝app模型)。
使用嵌入式编码器,指定不依赖于模型名称的函数名。如果使用函数自定义模板指定命名规则,则不要使用令牌
$ R
在规则中。看到生成的入口点函数的控件名称(嵌入式编码器).
通过使用结构体减少参数的数量
减少函数的参数数量可以提高代码的可读性,并减少堆栈内存的消耗。要创建一个可以一次传递多个数据的结构参数,可以使用以下技术:
手动组合多个轮廓尺寸或外港块,以便它们作为标准数据结构的结构或子结构的字段出现在生成的代码中。生成的入口点函数接受结构的地址作为一个单独的参数或作为标准I/O结构的子结构(字段)。
取代轮廓尺寸或外港块,并将新块配置为非虚拟总线
金宝app仿真软件。公共汽车
对象作为块的数据类型。如果外部代码定义了结构类型,请考虑使用金宝appSimulink.importExternalCTypes
函数生成总线对象。看到在生成的代码中将数据组织成结构和金宝appSimulink.importExternalCTypes
.当您使用Embedded Coder生成可重入代码时,请配置轮廓尺寸和外港块在默认情况下出现在聚合结构中。设定模型配置参数传递根级I/O为而不是
个人观点
.打包轮廓尺寸和外港块转换为实时模型数据结构时,选择
部分模型数据结构
.代码生成器将这些块聚合到实时模型数据结构所指向的默认I/O结构中。生成的入口点函数接受实时模型数据结构作为单个参数。如果选择此设置,则函数的参数数量最小。聚合轮廓尺寸块成结构和外港块变成不同的结构,选择
结构参考
.生成的入口点函数接受每个结构的地址作为参数。另一个论点接受实时模型数据结构。如果选择此设置,则输入和输出在功能接口中更易于识别。使用此设置,如果删除根级轮廓尺寸块或根级外港块,函数签名可以改变。类似地,如果添加根级别,签名也可以更改轮廓尺寸或外港块到不包括此类块的模型。
若要更多地控制结构的特征,请设置传递根级I/O为来
部分模型数据结构
.然后,为设置默认存储类轮廓尺寸和外港块到您创建的结构化存储类。用这个技巧:您可以为这些块创建单个结构,也可以创建两个单独的结构。
您可以控制结构类型的名称。
这些结构显示为实时模型数据结构的子结构。你必须设置传递根级I/O为来
部分模型数据结构
.
使用嵌入式编码器字典创建存储类(参见为软件架构定义存储类、内存段和功能模板(嵌入式编码器))。使用代码映射编辑器应用存储类(请参阅配置数据的默认代码生成(嵌入式编码器))。
有关更多信息,请参见传递根级I/O为.
控制参数的数据类型
您可以配置生成的入口点函数来通过参数交换数据。对于标量或数组参数,要控制基元数据类型的名称,请使用金宝app仿真软件。AliasType
对象设置相应块的数据类型或为整个模型配置数据类型替换。这些技术需要嵌入式编码器。有关更多信息,请参见在生成的代码中控制数据类型名称(嵌入式编码)。
将数据项提升到接口
默认情况下,代码生成器假设轮廓尺寸和外港模型根级的块构成模型的数据接口。您可以将任意信号、块参数或块状态提升到接口,以便其他系统和组件可以访问它。看到将内部数据提升到接口.
相关的话题
- 通过配置输入和输出块设计数据接口
- 定义模型组件的接口(金宝app模型)
- 分析生成的代码接口(嵌入式编码)
- 自定义生成的C函数接口(嵌入式编码)
- 生成的代码如何与环境交换数据
- 在外部C/ c++代码和Simulink模型或生成的代码之间交换数据金宝app
- 根据接口控制文档交互配置生成的代码(嵌入式编码)
- 为代码生成配置模型数据和函数的环境(嵌入式编码)