在生成的代码中将数据组织成结构

在C代码中,使用结构(结构体)来存储在存储器中的连续位置的数据。您可以通过使用有意义的名称组织数据,如信号和状态。每个结构作为一个命名空间,这样你就可以重新使用一个名称,指定多个数据项。像阵列,结构,你可以写代码,有效地转移和通过使用指针大量的数据进行操作。

默认情况下,代码生成聚合数据转换成标准结构(见生成的代码如何存储内部信号、状态和参数数据)。为了控制这些结构的特性或通过创建不同的结构来覆盖此默认行为,请在表中的信息。

目标 技术

控制标准的数据结构的特性。例如,指定的结构类型,结构变量和字段名的名称。

随着嵌入式编码器®,请参阅数据结构的控制特性(嵌入式编码)(嵌入式编码)。

控制结构的放置在存储器中,例如,通过插入编译指示或其他代码的装饰品。

与嵌入式编码器,看看控制数据和功能放置在存储器通过插入编译指示(嵌入式编码)。

将数据聚合到可以控制其名称和其他基本特征的结构中。当您向模型添加块和信号时,默认情况下新数据会出现在这些结构中。

使用嵌入式编码器,通过使用代码映射编辑器将结构化存储类应用于数据类别。

  • 当您通过设置模式配置参数生成nonreetrant,单实例代码代码接口封装不可再利用的功能,通过应用创建平,全局结构变量内置存储类结构。或者,使用Quick Start工具创建的示例存储类,ParamStructSignalStruct,或创建并应用自己的结构化存储类。

  • 当生成多实例(折返)通过设置从一个模型或组件代码,例如代码接口封装而不是不可再利用的功能在“代码映射编辑器”中,您不能使用内置的存储类结构或结构化存储类,你在一个包中创建。相反,通过使用嵌入式编码字典创建自己的结构化存储类。如果您使用的嵌入式编码快速启动工具准备代码生成模型(见使用Quick Start工具生成代码(嵌入式编码)),可以使用例如存储类ParamStructSignalStruct

  • 您不能使用此技术来聚合全局数据存储或全局参数(其中包括存储在基本工作区或数据字典中的参数对象)。对于这类数据,可以使用其他技术来创建结构。

有关代码映射编辑器的更多信息,请参见为模型数据和函数的类别配置默认的C代码生成(嵌入式编码)。要创建自己的存储类,见定义存储类型,存储器部分,和函数模板的软件体系结构(嵌入式编码)。

通过将单个数据项组织到一个自定义结构中,可以很好地控制其特征,从而提高生成的代码的可读性。

创建一个金宝appSimulink.Bus对象,该对象表示所需的结构类型。使用总线对象来设置模型中非虚拟总线信号的数据类型和参数结构。

  • 举一个例子,说明如何组织参数数据,请参见的结构参数

  • 举一个例子,说明如何组织信号数据,参见信号的结构

创建结构的阵列,见结构数组

交换结构生成的代码和外部代码,例如,当外部代码已经定义自定义结构类型和一个相应的全局变量之间的数据。

创建一个金宝appSimulink.Bus对象,该对象表示所需的结构类型。如果外部的代码已经定义的类型,使用金宝appSimulink.importExternalCTypes函数来生成总线对象。使用总线对象来设置模型中非虚拟总线信号的数据类型和参数结构。例如,参见在生成的代码和外部代码之间交换结构化和枚举数据(嵌入式编码)。

减少生成函数的参数(形式参数)的数量。

  • 为了减少参数的个数从您生成的代码模型的入口点函数,如模型_步,请参阅使用结构减少参数的数量

  • 为了减少为参考模型,在参考模型的入口点函数的参数个数:

  • 为了减少用于掩蔽,折返子系统的入口点函数,聚合掩模参数自变量的数量到自定义结构。

组织查找表数据转换成的结构。

使用金宝appSimulink.LookupTable金宝appSimulink.Breakpoint对象。看到金宝appSimulink.LookupTable
生成位字段。 看到(嵌入式编码)通过将布尔数据打包到位字段来优化生成的代码(嵌入式编码)。

技术来创建结构

要在生成的代码中创建结构,您可以使用以下技术:

  • 通过使用代码映射编辑应用一个结构化存储类数据的类别。当您添加模块和信号模型,新的数据元素获得默认情况下此存储类。

  • 应用结构化存储类,如内置的存储类结构直接通过使用模型数据编辑器的各个数据项。

  • 创建自定义非虚总线和参数结构。

要决定使用哪种技术,使用表中的信息。

能力 结构化存储类的默认应用程序 直接应用结构化存储类 非虚公共汽车和结构参数
默认情况下,将新的数据项聚合到一个结构中

没有 没有
防止消除目标数据的由优化(指定该数据出现在生成的代码)

没有

只有当您直接将存储类如ExportedGlobal到总线或结构
将数据聚合到一个结构中,而不改变框图的外观

没有
在同一结构的地方信号,状态和参数数据 没有 没有
包括在结构中的状态数据 没有
组织结构为嵌套结构 没有 没有
将结构组织成一组结构 没有 没有
结构类型的控制名

是的,但是从变量名称类型的名称源自,您指定
创建的结构,以减少所产生的功能的自变量数目

是的,但是您必须使用嵌入式编码器字典创建自己的存储类

没有
需要嵌入编码器 没有

结构化存储类的默认应用程序

可以将默认存储类应用于模型数据的类别。当您向模型添加块和信号时,关联的数据将获取您指定的默认存储类。要在缺省情况下将新数据聚合到结构中,您可以应用结构化存储类。您必须使用示例存储类ParamStructSignalStruct通过快速启动工具创建或通过使用嵌入式编码字典创建自己的存储类。

不能使用默认的应用程序来全球总数据存储或全局参数(参数对象,你在基地工作区或一个数据字典存储)。

要应用默认存储类,请使用代码映射编辑器。在一个模型窗口中,在Apps gallery中,点击嵌入式编码器。然后,在代码映射>数据默认值类来应用存储类存储类柱。

有关代码映射编辑器的更多信息,请参见为模型数据和函数的类别配置默认的C代码生成(嵌入式编码)。要使用嵌入式编码器字典创建自己的存储类,请参阅对于用作默认代码生成设置创建代码定义(嵌入式编码)。

直接应用结构化存储类

您可以将结构化存储类单独的数据项。直接应用防止代码生成优化,如默认参数行为信号存储重用从消除来自所生成的代码的每个数据项。直接应用还覆盖了默认的存储类,你指定代码映射>数据默认值

要直接应用存储类,使用模型数据编辑器(在造型选项卡上,单击模型数据编辑器)。集改变观点类来应用存储类存储类柱。

举一个例子,说明如何使用结构,请参阅使用Struct Storage类将参数数据组织到结构中(嵌入式编码)。有关应用存储类的更多信息,请参阅将内置的和自定义的存储类应用于数据元素(嵌入式编码)。

非虚公共汽车和结构参数

  • 要创建一个非虚总线信号,使用总线的创造者块到多条信号线组织成单个总线,或配置轮廓尺寸块或外港块作为非虚拟总线。您必须创建一个金宝appSimulink.Bus对象,表示的结构类型。例如,参见信号的结构。有关非虚拟总线的一般信息,请参阅将信号线分组到虚拟总线中(金宝app模型)。

  • 要创建参数结构,请使用MATLAB®命令或变量编辑器来将多个块参数的值组织到MATLAB结构中。可选地,创建一个金宝appSimulink.Bus对象,以便您可以控制结构类型的名称和其他特征,如每个字段的数据类型和维度。例如,参见的结构参数。有关参数结构的一般信息,请参阅在结构中组织相关块参数定义(金宝app模型)。

的结构参数

创建在生成的代码的结构。结构存储参数数据。

ç构建

typedef结构{双G1;双G2;} myStructType;myStructType MYSTRUCT = {2.0,-2.0};

过程

1.打开示例模型rtwdemo_paraminline

2.在造型选项卡上,单击模型数据编辑器。在模型数据编辑器中,选择参数标签。

3.在模型中,单击标记为“增益”的块G1。在模型数据编辑器中,使用价值的值设置获得参数myStruct.G1

4.设置的值获得参数在G2myStruct.G2

5.旁边myStruct.G2单击动作按钮(三个垂直圆点),然后选择创建

6.在“创建新数据”对话框中设置价值金宝appSimulink.Parameter(结构)并点击创建。一个金宝appSimulink.Parameter对象命名MYSTRUCT出现在基本工作区中。

7.在仿真软件。金宝app“。”旁边的“参数属性”对话框价值属性中,单击动作按钮并选择打开变量编辑器

8.右键单击下的白色空间列,并选择。命名新的结构字段G1。使用价值列来设置字段的值2

9.添加一个字段G2的值是-2,然后关闭变量编辑器。

10.在仿真软件。金宝app参数属性对话框,设置存储类ExportedGlobal。结构MYSTRUCT在生成的代码中显示为全局变量。

11.从模型中生成代码。

结果

将所生成的报头文件rtwdemo_paraminline_types.h定义具有随机名称的结构类型。

typedef struct {real_T G1;real_T G2;}struct_6h72eH5WFuEIyQr5YrdGuB;

源文件rtwdemo_paraminline.c定义并初始化结构变量MYSTRUCT

/ *导出块参数* / struct_6h72eH5WFuEIyQr5YrdGuB MYSTRUCT = {2.0,-2.0};/ *变量:MYSTRUCT *引用的方式:* '<根> / G1' * '<根> / G2' * /

指定结构类型的名称

任选地,指定要使用的结构类型定义的名称(结构体)。在命令提示符下,使用功能金宝appSimulink.Bus.createObject创建金宝appSimulink.Bus对象,表示的结构类型。

2.该对象的默认名称是slBus1。通过将对象复制到新的MATLAB变量中来更改名称。

3.在模型数据编辑器中,单击显示/刷新的其他信息按钮。

4.在数据表中,找到对应的行MYSTRUCT。使用数据类型列设置的数据类型MYSTRUCT公交:myStructType

5.从模型中生成代码。

该代码生成结构类型的定义myStructType并使用此类型来定义全局变量MYSTRUCT

myStructType MYSTRUCT = {2.0,-2.0};/ *变量:MYSTRUCT

信号的结构

这个例子展示了如何在生成的代码中创建一个信号数据结构。

ç构建

typedef struct{双信号1;双signal2;双signal3;} my_signals_type;

过程

1.若要在模型中表示结构类型,请创建金宝appSimulink.Bus对象。使用对象作为模型中总线信号的数据类型。

2.创建ex_signal_struct通过使用增益块,一个总线创作者块,和一个单位延迟块建模。增益和单位延迟块使结构在生成的代码中更容易识别。

3.配置总线造物主块接受三个输入,在块对话框中,设置输入数量3.

4.在工具条,上造型选项卡,在设计,点击总线编辑器

5.使用总线编辑器创建金宝appSimulink.Bus对象命名my_signals_type包含三个信号元素:信号1,信号2,SIGNAL3。看到创建并指定Simulink。金宝app总线对象(金宝app模型)。

该总线对象表示要生成的代码使用结构类型。

6.在“总线创建器块”对话框中设置输出数据类型公交:my_signals_type

7.选择输出作为非虚总线。点击。非虚拟总线出现在所生成的代码作为结构。

8.在造型选项卡上,单击模型数据编辑器。在模型数据编辑器上信号选项卡,从改变观点下拉列表中,选择

9.在模型中,单击总线创作者块的输出信号。

10.在模型数据编辑器中,对于总线创建者块的输出,设置名称sig_struct_var

11.集存储类ExportedGlobal。总线创建者块的输出在生成的代码中显示为一个单独的全局结构变量,名为sig_struct_var

12.从模型中生成代码。

结果

将所生成的报头文件ex_signal_struct_types.h定义结构类型my_signals_type

typedef struct {real_T signal1;real_T signal2;real_T signal3;} my_signals_type;

源文件ex_signal_struct.c为全局变量分配内存sig_struct_var,它表示总线创建者块的输出。

/*导出块信号*/ my_signals_type sig_struct_var;/* '/Bus Creator' */

在同一个文件,在模型函数,算法访问sig_struct_var以及sig_struct_var

信号的嵌套结构

可以在所生成的代码中创建信号数据的嵌套结构。

ç构建

typedef struct{双信号1;双signal2;双signal3;}B_struct_type;typedef struct{双信号1;双signal2;}C_struct_type;typedef struct {B_struct_type subStruct_B;C_struct_type subStruct_C;}A_struct_type;

过程

若要在模型中表示结构类型,请创建金宝appSimulink.Bus对象。使用对象作为模型中总线信号的数据类型。

嵌套另一个结构内部的结构,使用一个总线对象作为另一总线对象的信号元素的数据类型。

1.创建ex_signal_nested_struct带有增益块、总线创建者块和单位延迟块的模型。增益和单位延迟块使结构在生成的代码中更容易识别。

2.若要将总线创建者块配置为接受三个输入,请在“块”对话框中设置输入数量3.

3.在工具条,在造型选项卡,在设计,点击总线编辑器

使用总线编辑器创建金宝appSimulink.Bus对象命名A_struct_type包含两个信号元素:subStruct_BsubStruct_C。要使用总线编辑器创建总线对象,请参见创建并指定Simulink。金宝app总线对象(金宝app模型)。该总线对象表示要生成的代码使用顶层结构类型。

4.对于subStruct_B元素,集数据类型总线:B_struct_type。使用一个类似的类型名称subStruct_C

在每个信号元件A_struct_type使用另一个总线对象作为数据类型。现在,这些元素代表子。

5.使用母线编辑器创建金宝appSimulink.Bus对象B_struct_type(有三个信号元素)和C_struct_type(带有两个信号元件)。

6.在收集三个增益信号的总线创作者块的对话框中,集输出数据类型总线:B_struct_type。点击应用

7.选择输出作为非虚总线并点击

8.在其他从属总线造物主块的对话框中,设置输出数据类型总线:C_struct_type并选择输出作为非虚总线。点击

9.在“最后总线创建器”块对话框中设置输出数据类型总线:A_struct_type并选择输出作为非虚总线。点击

10.在造型选项卡上,单击模型数据编辑器

11.在模型数据编辑器中,在信号选项卡,从改变观点下拉列表中,选择

12.在模型中,点击的输出信号A_struct_type公交车造物主块,其中饲料单位延迟块。

13.在模型数据编辑器,适用于总线创作者块的输出,组名称sig_struct_var

14.设置存储类ExportedGlobal。通过此设置,总线创建者块的输出将作为一个单独的全局结构变量(名为)出现在生成的代码中sig_struct_var

15.从模型中生成的代码。

结果

将所生成的报头文件ex_signal_nested_struct_types.h定义结构类型。每个结构类型对应一个金宝appSimulink.Bus对象。

typedef struct {real_T signal1;real_T signal2;real_T signal3;}B_struct_type;typedef struct {real_T signal1;real_T signal2;}C_struct_type;typedef struct {B_struct_type subStruct_B;C_struct_type subStruct_C;}A_struct_type;

生成的源文件ex_signal_nested_struct.c为全局结构变量分配内存sig_struct_var。属性的名称A_struct_type公交车造物主块总线Creator2

/ *导出块信号* / A_struct_type sig_struct_var;/ * '<根> /总线Creator2' * /

在同一个文件,在模型函数,算法访问sig_struct_var以及sig_struct_var

结合技术来解决限制

为了解决每种技术的一些限制,您可以将结构化存储类与非虚拟总线和参数结构组合起来。例如,你可以:

  • 包括信号数据的结构和参数数据的在同一父结构的结构。

  • 默认情况下聚合新数据时,嵌套结构。

在生成的代码,扁平母体结构,其对应于所述结构化存储类,包含子结构,其对应于每个总线和参数结构。选择的这些组合技术之一:

  • 直接应用结构化存储类到每个总线和参数结构。例如,存储类2个非虚拟总线信号设置为结构。每个总线出现在生成的代码作为一个单一的结构的场(子)。

  • 离开存储类中的每个总线和参数结构中的默认设定中,汽车, 或默认模式,这防止代码生成优化从消除了总线或参数结构。然后,配置默认存储类,使得信号数据和参数数据默认使用结构化存储类。

结构数组

可以进一步打包多个一致的总线信号或参数结构转换成一个数组。总线或参数结构的阵列出现在生成的代码作为结构的阵列。要创建总线阵列,请参见结合公共汽车到公交车的数组(金宝app模型)。要创建参数结构的阵列,请参见集团多参数结构为Array(金宝app模型)。

结构填充

默认情况下,代码生成不明确添加填充字段结构类型。结构类型可以显示在通过将所生成的代码,例如,标准的数据结构(参照生成的代码中的标准数据结构),金宝appSimulink.Bus对象和在模型中使用的参数结构。

但是,当使用带有嵌入式编码器的代码替换库时,可以将数据对齐(包括结构填充)指定为替换库的一部分。有关更多信息,请参见提供编译器数据对齐规格(嵌入式编码)。

限制

  • 借助内置的金宝app®编码器™和嵌入式编码器功能,您不能生成或使用一个自定义结构,其中包含的字段的值是一个指针。您可以通过创建一个高级存储类并编写相应的TLC代码(参见精细控制数据表示通过写作TLC代码存储类(嵌入式编码器))。

  • 您无法使用内置存储类结构或者您用自定义存储类设计器创建一个结构化存储类(设置存储类属性类型FlatStructure),以在“代码映射编辑器”中设置数据默认值。

另请参阅

相关话题