文档

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

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

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

目标 技术

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

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

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

使用嵌入式Coder,请参见通过插入语法在内存中放置控制数据和函数(嵌入式编码)。

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

使用嵌入式编码器,可以使用代码映射编辑器对数据类别应用结构化自定义存储类。

  • 当您通过设置模型配置参数生成不可重传的单实例代码时代码接口包装那种一次性的功能,通过应用内置存储类创建平面的全局结构变量结构体ParamStruct,SignalStruct.或者,创建和应用您自己的结构化自定义存储类。

  • 当您从模型或组件生成多实例(可重入)代码时,例如通过设置代码接口包装的值那种一次性的功能,在“代码映射编辑器”中,不能使用内置存储类结构体或者在包中创建的任何结构化存储类。相反,可以使用嵌入式编码器字典创建自己的结构化自定义存储类。如果您在模型上使用嵌入式编码器快速启动工具(参见使用快速开始工具生成代码(Embedded Coder)),您可以使用内置的存储类ParamStruct而且SignalStruct

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使用万博1manbetx仿真软件。LookupTable而且万博1manbetx仿真软件。断点对象。看到万博1manbetx仿真软件。LookupTable
生成一些字段。 看到(嵌入式编码)通过将布尔数据打包到位域中来优化生成的代码(嵌入式编码)。

创建结构的技巧

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

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

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

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

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

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

是的

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

没有

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

是的

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

是的

是的,但是类型名来源于您指定的变量名 是的
创建一个结构来减少生成函数中的参数数量

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

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

结构化存储类的默认应用

您可以对模型数据的类别应用默认存储类。当您向模型添加块和信号时,相关的数据将获得您指定的默认存储类。若要在默认情况下将新数据聚合到结构中,可以应用结构化存储类。您必须使用内置存储类ParamStruct而且SignalStruct或者使用嵌入式编码器字典创建自己的存储类。

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

若要应用默认存储类,请使用代码映射编辑器。在模型窗口中,选择代码>C / c++代码>在代码透视图中配置模型.然后,在代码的映射>数据默认值方法应用存储类存储类列。

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

结构化存储类的直接应用

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

要直接应用存储类,请使用模型数据编辑器(视图>模型数据编辑器).集改变观点代码类来应用存储类存储类列。

以演示如何使用结构体,请参阅使用结构自定义存储类将参数数据组织到结构中(嵌入式编码)。有关应用存储类的更多信息,请参见对个别信号、状态和参数数据元素应用自定义存储类(嵌入式编码)。

非虚拟总线和参数结构

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

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

的结构参数

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

C构造

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

过程

打开示例模型rtwdemo_paraminline

rtwdemo_paraminline

选择查看>模型数据编辑器

在模型数据编辑器中,选择参数选项卡。

在模型中,单击标有“Gain”的块G1

在模型数据编辑器中,使用价值属性的值获得参数myStruct。G1

的值,使用模型数据编辑器获得参数G2myStruct。G2

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

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

在仿真软件。万博1manbetx参数property dialog box, next to the价值属性,单击操作按钮并选择打开变量编辑器

在变量编辑器中,右键单击列和选择.命名新的结构字段G1.使用价值列来设置字段的值2

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

在仿真软件。万博1manbetx参数property dialog box, set存储类ExportedGlobal.有了这个设定,结构myStruct在生成的代码中作为全局变量出现。

或者,使用这些命令来配置和创建块myStruct

rtwdemo_paraminline set_param (“rtwdemo_paraminline / G1”“获得”“myStruct。G1的) set_param (“rtwdemo_paraminline / G2”“获得”“myStruct。G2的) myStruct。G1 = 2;myStruct。G2 = 2;myStruct = 万博1manbetxSimulink.Parameter (myStruct);myStruct.CoderInfo.StorageClass =“ExportedGlobal”

结果

从模型生成代码。

rtwbuild (“rtwdemo_paraminline”
###成功完成模型:rtwdemo_paraminline的构建过程

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

文件= fullfile (“rtwdemo_paraminline_grt_rtw”...“rtwdemo_paraminline_types.h”);rtwdemodbtype(文件,“typedef struct{”“}struct_6h72eH5WFuEIyQr5YrdGuB;”...1,1)
typedef struct {real_T G1;real_T G2;} struct_6h72eH5WFuEIyQr5YrdGuB;

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

文件= fullfile (“rtwdemo_paraminline_grt_rtw”“rtwdemo_paraminline.c”);rtwdemodbtype(文件,“struct_6h72eH5WFuEIyQr5YrdGuB myStruct”...“/ *变量:myStruct”, 1, 1)
struct_6h72eH5WFuEIyQr5YrdGuB myStruct = {2.0, -2.0};/ *变量:myStruct

指定结构类型的名称

可选地,指定用于结构类型定义的名称(结构体).

在命令提示符处,使用该函数万博1manbetxSimulink.Bus.createObject创建一个万博1manbetx仿真软件。公共汽车对象,它表示结构类型。

万博1manbetxSimulink.Bus.createObject (myStruct.Value);

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

myStructType = (slBus1)复印件;

在模型数据编辑器中,单击显示/刷新的额外信息按钮。

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

或者,在命令提示符处使用此命令设置数据类型myStruct

myStruct。数据类型=“巴士:myStructType”

从模型生成代码。

rtwbuild (“rtwdemo_paraminline”
###成功完成模型:rtwdemo_paraminline的构建过程

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

rtwdemodbtype(文件,'myStructType myStruct = {'“/ *变量:myStruct”...1,1)
myStructType myStruct = {2.0, -2.0};/ *变量:myStruct

结构的信号

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

C构造

类型定义结构{double signal1;双signal2;双signal3;} my_signals_type;

过程

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

创建ex_signal_struct模型包含增益块、总线创建者块和单元延迟块。增益和单位延迟块使结构在生成的代码中更容易识别。

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

在模型中,选择编辑>总线编辑器

使用总线编辑器创建万博1manbetx仿真软件。公共汽车对象命名my_signals_type它包含三个信号元素:signal1signal2,signal3.要使用总线编辑器创建总线对象,请参见使用总线编辑器创建总线对象(万博1manbetx模型)。

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

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

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

在模型中,选择查看>模型数据编辑器

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

在模型中,单击Bus Creator块的输出信号。

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

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

从模型生成代码。

结果

生成的头文件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构造

类型定义结构{double signal1;双signal2;双signal3;} B_struct_type;类型定义结构{double signal1;双signal2;} C_struct_type;typedef结构{B_struct_type subStruct_B;C_struct_type subStruct_C;} A_struct_type;

过程

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

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

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

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

在模型中,选择编辑>总线编辑器

使用总线编辑器创建万博1manbetx仿真软件。公共汽车对象命名A_struct_type它包含两个信号元素:subStruct_B而且subStruct_C.要使用总线编辑器创建总线对象,请参见使用总线编辑器创建总线对象(万博1manbetx模型)。此总线对象表示您希望生成的代码使用的顶级结构类型。

subStruct_B元素,集数据类型总线:B_struct_type.使用类似的类型名subStruct_C

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

使用总线编辑器创建万博1manbetx仿真软件。公共汽车对象B_struct_type(有三个信号元件)和C_struct_type(有两个信号元件)。

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

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

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

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

在模型中,选择查看>模型数据编辑器

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

在模型中,点击输出信号A_struct_type总线创建器块,它提供单元延迟块。

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

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

从模型生成代码。

结果

生成的头文件ex_signal_nested_struct_types.h定义结构类型。每个结构类型对应于a万博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结构{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;/* '<根>/总线creater2 ' */

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

结合技术来克服限制

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

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

  • 默认情况下,在聚合新数据时使用Nest结构。

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

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

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

数组的结构

可以进一步将多个一致的总线信号或参数结构打包到一个数组中。总线数组或参数结构以结构数组的形式出现在生成的代码中。要创建总线数组,请参见将总线合并为一个总线数组(万博1manbetx模型)。要创建参数结构的数组,请参见将多个参数结构分组到一个数组中(万博1manbetx模型)。

结构填充

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

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

限制

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

另请参阅

相关的话题

这个话题有帮助吗?