主要内容

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

在C代码中,使用结构(结构体),把资料储存在记忆体的连续位置。您可以使用有意义的名称来组织数据,例如信号和状态。每个结构都充当一个名称空间,因此可以重用一个名称来指定多个数据项。与数组一样,对于结构,您可以使用指针编写有效传输和操作大量数据的代码。

默认情况下,代码生成器将数据聚合到标准结构中(请参阅生成的代码如何存储内部信号,状态和参数数据).若要控制这些结构的特征,或通过创建不同的结构来覆盖此默认行为,请使用表中的信息。

目标 技术

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

使用嵌入式编码器®,请参阅在生成的代码中控制数据类型名称

控制结构在内存中的位置,例如,通过插入pragmas或其他代码修饰。

使用嵌入式编码器,请参见通过插入Pragmas控制数据和函数在内存中的位置

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

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

  • 当您通过设置模型配置参数生成不可重入的单实例代码时代码接口打包那种一次性的功能,通过应用内置存储类创建平面全局结构变量结构体.或者,使用快速入门工具创建的示例存储类,ParamStructSignalStruct,或创建和应用自己的结构化存储类。

  • 当您从模型或组件生成多实例(可重入)代码时,例如通过设置代码接口打包到一个值以外那种一次性的功能,在“代码映射”编辑器中,不能使用内置存储类结构体或者在包中创建的结构化存储类。相反,可以使用嵌入式编码器字典创建自己的结构化存储类。如果您使用嵌入式编码器快速开始工具来为代码生成准备模型(请参阅使用快速开始工具生成代码),您可以使用示例存储类ParamStructSignalStruct

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

有关代码映射编辑器的详细信息,请参见为数据元素和函数类别配置默认的C代码生成.若要创建自己的存储类,请参见为软件架构定义存储类、内存段和功能模板

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

创建一个万博1manbetx仿真软件。公共汽车对象,它表示所需的结构类型。使用总线对象在模型中设置非虚拟总线信号的数据类型和参数结构。

  • 有关显示如何组织参数数据的示例,请参见参数结构

  • 有关显示如何组织信号数据的示例,请参见信号结构

要创建结构的数组,请参见结构阵列

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

创建一个万博1manbetx仿真软件。公共汽车对象,它表示所需的结构类型。如果外部代码已经定义了类型,则使用万博1manbetxSimulink.importExternalCTypes函数生成总线对象。使用总线对象在模型中设置非虚拟总线信号的数据类型和参数结构。有关示例,请参见在生成的代码和外部代码之间交换结构化和枚举数据

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

  • 为了减少用于生成代码的模型的入口点函数的参数数量,例如模型_step,请参阅通过使用结构体减少参数的数量

  • 为了减少引用模型的入口点函数的参数数量,在引用模型中:

    • 配置根级轮廓尺寸外港块以结构字段的形式出现在代码中。用一个配置为非虚拟总线信号的块替换多个这样的块。使用这种技术,您可以最大程度地控制结构特征。当您向模型中添加块时,您必须手动修改总线定义。看到非虚拟总线和参数结构

    • 将模型参数组织成自定义结构(参见为可重用引用模型指定特定于实例的参数值).

  • 要减少掩码可重入子系统的入口点函数的参数数量,请将掩码参数聚合到自定义结构中。

将查找表数据组织成一个结构。

使用万博1manbetx仿真软件。LookupTable万博1manbetx仿真软件。断点对象。看到万博1manbetx仿真软件。LookupTable
生成位字段。 看到通过将布尔数据打包到位字段中优化生成的代码

创建结构的技术

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

  • 使用代码映射编辑器将结构化存储类应用于数据类别。当您向模型中添加块和信号时,默认情况下新的数据元素会获得这个存储类。

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

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

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

能力 结构化存储类的默认应用 结构化存储类的直接应用 非虚拟总线和参数结构
默认情况下,将新数据项聚合到结构中

是的

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

没有

是的 只有当您直接应用存储类,如ExportedGlobal到公共汽车或结构
在不改变框图外观的情况下,将数据聚合到结构中

是的

是的 没有
将信号、状态和参数数据放在相同的结构中 没有 是的 没有
在结构中包含状态数据 是的 是的 没有
将结构组织成嵌套结构 没有 没有 是的
将结构组织成一组结构 没有 没有 是的
结构类型的控件名称

是的

是的,但是类型名派生自您指定的变量名 是的
创建结构以减少生成函数中的参数数量

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

没有 是的
需要嵌入式编码器 是的 是的 没有

结构化存储类的默认应用

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

不能使用默认应用程序聚合全局数据存储或全局参数(存储在基本工作空间或数据字典中的参数对象)。

若要应用默认存储类,请使用代码映射编辑器。在模型窗口的“应用程序”库中,单击嵌入式编码器.然后,在代码的映射>数据默认值,应用存储类存储类列。

有关代码映射编辑器的详细信息,请参见为数据元素和函数类别配置默认的C代码生成.若要使用嵌入式编码器字典创建自己的存储类,请参见创建代码定义以在代码映射编辑器中使用

结构化存储类的直接应用

可以将结构化存储类应用于单个数据项。直接应用程序阻止代码生成优化,例如默认参数行为信号存储重用,从生成的代码中消除每个数据项。直接应用程序还覆盖您指定的默认存储类代码的映射>数据默认值

要直接应用存储类,请使用模型数据编辑器(在建模选项卡上,单击模型数据编辑器).集改变观点代码类应用存储类存储类列。

为一个例子,说明如何使用结构体,请参阅配置C代码生成参数.有关应用存储类的详细信息,请参见使用结构存储类将参数数据组织到结构中

非虚拟总线和参数结构

  • 要创建非虚拟总线信号,请使用总线的创造者块将多条信号线组织到单个总线中,或配置轮廓尺寸块或外港块作为非虚拟总线。您必须创建一个万博1manbetx仿真软件。公共汽车表示结构类型的对象。有关示例,请参见信号结构.有关非虚拟总线的一般信息,请参见将信号线分组为虚拟总线

  • 要创建参数结构,请使用MATLAB®命令或变量编辑器将多个块参数的值组织成MATLAB结构。可选地,创建万博1manbetx仿真软件。公共汽车对象,以便您可以控制结构类型的名称和其他特征,如每个字段的数据类型和维度。有关示例,请参见参数结构.有关参数结构的一般信息,请参见在结构中组织相关块参数定义

参数结构

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

C构造

typedef struct{双G1;双G2;} myStructType;myStructType myStruct = {2.0, -2.0};

过程

1.打开示例模型rtwdemo_paraminline

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

3.在模型中,单击标记的Gain块G1.在“模型数据编辑器”中,使用价值属性的值获得参数myStruct。G1

4.的值获得参数中的G2myStruct。G2

5.旁边myStruct。G2,点击操作按钮(有三个垂直点)并选择创建

6.2 .在“创建新数据”对话框中设置价值万博1manbetxSimulink.Parameter(结构)并点击创建.一个万博1manbetx仿真软件。参数对象命名myStruct出现在基本工作区中。

7.在Simuli万博1manbetxnk中。参数property dialog box, next to the价值属性,单击操作按钮并选择打开变量编辑器

8.控件下面的空白区域单击鼠标右键列并选择.命名新的结构字段G1.使用价值字段的值设置为2

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

10.在Simuli万博1manbetxnk中。参数property dialog box, on the代码生成选项卡,设置存储类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' */

指定结构类型的名称

1.可选地,指定用于结构类型定义的名称(结构体).在命令提示符下,使用该函数万博1manbetxSimulink.Bus.createObject要创建万博1manbetx仿真软件。公共汽车表示结构类型的对象。

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

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

4.在数据表中,找到对应的行myStruct.使用数据类型列设置的数据类型myStruct总线:myStructType

5.从模型生成代码。

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

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

信号结构

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

C构造

Typedef结构{双信号1;双signal2;双signal3;} my_signals_type;

过程

要在模型中表示结构类型,请创建万博1manbetx仿真软件。公共汽车对象。在模型中使用该对象作为总线信号的数据类型。

1.创建ex_signal_struct通过使用增益块、总线创建块和单元延迟块来建立模型。增益和单元延迟块使结构在生成的代码中更具可识别性。

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

3.工具条上的建模选项卡,在设计,点击公共汽车编辑器

4.在总线编辑器中,单击文件>增加公共汽车要创建万博1manbetx仿真软件。公共汽车对象并命名它my_signals_type.点击文件>添加/插入BusElement添加三个信号元素:signal1signal2,signal3.有关更多信息,请参见创建并指定Simulink。万博1manbetx总线对象

5.在当前文件夹中保存总线对象为ex_signal_struct_data.mat

此总线对象表示希望生成的代码使用的结构类型。

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

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

8.打开万博1manbetx仿真软件编码器应用程序。C代码选项卡上,选择代码接口>单个元素代码映射

9.打开信号/州选项卡。在模型中,选择总线创建器块的输出信号并单击将选定的信号添加到代码映射中按钮。

11.对于添加的信号,设置存储类ExportedGlobal

12.在属性检查器中,设置代码>标识符财产sig_struct_var.总线创建器块的输出作为一个单独的全局结构变量出现在生成的代码中sig_struct_var

13.从模型生成代码。

结果

生成的头文件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;/* '<根>/总线创建器' */

在同一个文件中,在模型中一步函数,算法访问sig_struct_var和田野sig_struct_var

信号的嵌套结构

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

C构造

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

过程

要在模型中表示结构类型,请创建万博1manbetx仿真软件。公共汽车对象。在模型中使用该对象作为总线信号的数据类型。

若要在另一个结构中嵌套一个结构,请使用总线对象作为另一个总线对象中的信号元素的数据类型。

1.创建ex_signal_nested_struct模型包含增益块、总线创建块和单元延迟块。增益和单元延迟块使结构在生成的代码中更具可识别性。

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

3.工具条上的建模选项卡,在设计,点击公共汽车编辑器

在总线编辑器中,单击文件>增加公共汽车要创建万博1manbetx仿真软件。公共汽车对象并命名它A_struct_type.点击文件>添加/插入BusElement添加两个信号元素:subStruct_BsubStruct_C.有关更多信息,请参见创建并指定Simulink。万博1manbetx总线对象.此总线对象表示希望生成的代码使用的顶级结构类型。

4.类似地,创建万博1manbetx仿真软件。公共汽车对象B_struct_type(有三个信号元素)和C_struct_type(带有两个信号元素)。

5.在A_struct_type对象,用于subStruct_B元素,集数据类型总线:B_struct_typesubStruct_C总线:C_struct_type

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

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

7.选择输出为非虚拟总线并点击好吧

8.在另一个从属总线创建器块的对话框中,设置输出数据类型总线:C_struct_type并选择输出为非虚拟总线.点击好吧

9.在最后一个总线创建器块对话框中,设置输出数据类型总线:A_struct_type并选择输出为非虚拟总线.点击好吧

10.打开万博1manbetx仿真软件编码器应用程序。C代码选项卡上,选择代码接口>单个元素代码映射

11.打开信号/州选项卡。在模型中,选择的输出信号A_struct_type总线创建器块,它提供单元延迟块。单击将选定的信号添加到代码映射中按钮。

12.对于添加的信号,设置存储类ExportedGlobal

13.在属性检查器中,设置代码>标识符财产sig_struct_var.总线创建器块的输出作为一个单独的全局结构变量出现在生成的代码中sig_struct_var

14.从模型生成代码。

结果

生成的头文件ex_signal_nested_struct_types.h定义结构类型。每个结构类型对应于万博1manbetx仿真软件。公共汽车对象。

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;/* '<根>/Bus Creator2' */

在同一个文件中,在模型中一步函数,算法访问sig_struct_var和田野sig_struct_var

结合技术来克服局限性

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

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

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

在生成的代码中,对应于结构化存储类的平面父结构包含对应于每个总线和参数结构的子结构。选择以下组合技巧中的一种:

  • 将结构化存储类直接应用于每个总线和参数结构。例如,将两个非虚拟总线信号的存储类设置为结构体.每个总线作为单个结构的字段(子结构)出现在生成的代码中。

  • 将每个总线的存储类和参数结构保持默认设置,汽车,或在模型的默认,这可以防止代码生成优化消除总线或参数结构。然后,配置默认存储类,使信号数据和参数数据默认使用结构化存储类。

结构阵列

您可以进一步将多个一致的总线信号或参数结构打包到一个数组中。总线数组或参数结构在生成的代码中以结构数组的形式出现。要创建总线数组,请参见将非虚拟总线分组到总线阵列中.要创建参数结构的数组,请参见将多个参数结构分组到一个数组中

结构填充

默认情况下,代码生成器不会显式地向结构类型添加填充字段。结构类型可以出现在生成的代码中,例如,通过标准数据结构(参见生成代码中的数据结构),万博1manbetx仿真软件。公共汽车对象,以及在模型中使用的参数结构。

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

限制

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

另请参阅

相关的话题