组织数据结构生成的代码
在C代码,您可以使用结构(结构体
)在相邻的位置在内存中存储数据。你可以组织数据,如信号和状态,通过使用有意义的名称。每个结构作为一个名称空间,因此您可以重用一个名称来指定多个数据项。像数组,结构,您可以编写代码,有效地转移和作用于大量数据通过使用指针。
默认情况下,代码生成器聚合数据结构(见标准如何生成的代码存储内部信号、状态和参数数据)。控制的特点,这些结构或覆盖默认行为通过创建不同的结构,用表中的信息。
目标 | 技术 |
---|---|
控制标准的数据结构的特点。例如,指定名称的结构类型、结构变量,和字段名称。 |
使用嵌入式编码器®,请参阅管理模型的替代数据类型生成的代码金宝app(嵌入式编码)。 |
控制结构在内存的位置,例如,通过插入代码语法或其他装饰品。 |
与嵌入式编码器,明白了控制数据和函数放置在内存中插入语法(嵌入式编码)。 |
聚合数据结构你可以控制他们的名字和其他基本特征。当您添加模块和信号模型,由此产生的新数据默认出现在这些结构。 |
与嵌入式编码,应用结构化存储类类别的数据通过使用映射编辑器的代码。
关于代码映射编辑器的更多信息,请参阅配置默认C代码生成类别的数据元素和功能(嵌入式编码)。创建自己的存储类,明白了定义服务接口、存储类、内存部分,为软件架构和功能模板(嵌入式编码)。 |
通过组织提高生成的代码的可读性单个数据项为一个自定义结构的特征可以精确控制。 |
创建一个 创建一个结构数组,明白了数组的结构。 |
之间交换结构化数据生成的代码和外部代码,例如,当外部代码已经定义了一个自定义结构类型和相应的全局变量。 |
创建一个 |
减少参数的数量(形式参数)生成的功能。 |
|
查找表的数据组织成一个结构。 |
使用金宝appSimulink.LookupTable 和金宝appSimulink.Breakpoint 对象。看到金宝appSimulink.LookupTable 。 |
生成一些字段。 | 看到本(嵌入式编码)和优化生成的代码通过包装布尔数据为本(嵌入式编码)。 |
技术来创建结构
创建结构在生成的代码中,您可以使用这些技术:
运用结构化存储类类别的数据通过使用映射编辑器的代码。当您添加模块和信号模型,新的数据元素获得这种默认存储类。
运用结构化存储类,比如内置的存储类
结构体
,直接向个人数据项使用模型数据编辑器。创建自定义nonvirtual公交车和参数结构。
决定要使用哪种技术,使用信息表中。
能力 | 默认应用程序的结构化存储类 | 结构化存储类的直接应用 | Nonvirtual公交车和参数结构 |
---|---|---|---|
默认情况下将新数据项聚合成一个结构 | 是的 |
没有 | 没有 |
防止消除目标数据的优化(指定数据出现在生成的代码) | 没有 |
是的 | 只有如果你直接应用存储类等ExportedGlobal 公共汽车或结构 |
聚合数据结构不改变物体的外观图 | 是的 |
是的 | 没有 |
位置信号、状态和参数数据结构相同 | 没有 | 是的 | 没有 |
包括状态数据的结构 | 是的 | 是的 | 没有 |
组织结构嵌套结构 | 没有 | 没有 | 是的 |
组织结构的数组结构 | 没有 | 没有 | 是的 |
控制结构类型的名称 | 是的 |
是的,但是名字来源于变量名称,类型指定 | 是的 |
创建一个结构来减少生成的函数参数 | 是的,但是你必须创建自己的存储类通过使用嵌入式编码字典 |
没有 | 是的 |
需要嵌入编码器 | 是的 | 是的 | 没有 |
默认应用程序的结构化存储类
您可以应用一个默认的存储类模型数据的一个类别。当您添加模块和信号模型,关联的数据获得您所指定的默认存储类。将新数据聚合成结构在默认情况下,您可以应用结构化存储类。您必须使用示例存储类ParamStruct
和SignalStruct
创建快速启动工具或创建自己的存储类通过使用嵌入式编码字典。
你不能使用默认的应用程序聚合全球数据存储或全局参数(参数对象存储在工作区底部或数据字典)。
应用默认的存储类,使用映射编辑器的代码。在模型窗口中,在应用程序画廊,单击嵌入式编码器。然后,在代码的映射>数据默认值通过使用,应用存储类存储类列。
关于代码映射编辑器的更多信息,请参阅配置默认C代码生成类别的数据元素和功能(嵌入式编码)。创建自己的存储类通过使用嵌入式编码字典,看到的在代码中创建代码定义使用映射编辑器(嵌入式编码)。
结构化存储类的直接应用
可以将结构化存储类应用到单个数据项。直接应用程序防止代码生成优化,如默认参数的行为和信号存储重用,从消除每个数据项从生成的代码。直接的应用程序还将覆盖您指定的默认存储类代码的映射>数据默认值。
直接应用存储类,使用的模型数据编辑器(建模选项卡上,单击模型数据编辑器)。集改变观点来代码
并应用使用的存储类存储类列。
为例,展示了如何使用结构体
,请参阅配置参数C代码生成(嵌入式编码)。关于应用存储类的更多信息,请参阅参数数据组织成一个结构通过使用结构体存储类(嵌入式编码)。
Nonvirtual公交车和参数结构
创建一个nonvirtual总线,使用总线的创造者块组织多个信号行成一个公共汽车,或配置一个轮廓尺寸块或外港块nonvirtual总线。您必须创建一个
金宝appSimulink.Bus
对象代表了结构类型。例如,看到的结构的信号。nonvirtual巴士的信息,请参阅创建Nonvirtual公交车。创建一个参数结构,使用MATLAB®命令或变量编辑器来组织多个块参数的值到一个MATLAB结构。可选地,创建一个
金宝appSimulink.Bus
对象,这样你可以控制结构类型的名称和其他特征,如每个字段的数据类型和维度。例如,看到的的结构参数。有关参数结构的一般信息,明白了组织相关块参数定义的结构。
的结构参数
在生成的代码创建一个结构。存储参数数据结构。
C构造
typedef struct{双G1;双G2;}myStructType;myStructType myStruct = {2.0, -2.0};
过程
1。打开示例模型rtwdemo_paraminline
。
2。在建模选项卡上,单击模型数据编辑器。在模型数据编辑器中,选择参数选项卡。
3所示。在模型中,单击获得块标记G1
。在模型数据编辑器,使用价值列设置的值获得参数myStruct.G1
。
4所示。设置的值获得参数G2
块myStruct.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 *引用:* < Root > / G1的* * / < Root > / G2
指定名称的结构类型
1。可选地,用于指定一个名称的结构类型定义(结构体
)。在命令提示符处,使用函数金宝appSimulink.Bus.createObject
创建一个金宝appSimulink.Bus
对象代表了结构类型。
2。对象的缺省名称slBus1
。更改名称的MATLAB®对象复制到一个新的变量。
3所示。在模型数据编辑器中,单击显示/刷新的额外信息按钮。
4所示。在数据表中,找到对应的行myStruct
。使用数据类型列的数据类型myStruct
来总线:myStructType
。
5。从模型中生成代码。
代码生成结构类型的定义myStructType
并使用这种类型定义全局变量myStruct
。
myStructType myStruct = {2.0, -2.0};/ *变量:myStruct
结构的信号
这个例子展示了如何创建一个结构的信号数据生成的代码。
C构造
typedef struct{双signal1;双signal2;双signal3;}my_signals_type;
过程
在一个模型表示一个结构类型,创建一个金宝appSimulink.Bus
对象。使用公交车的对象的数据类型在你的模型。
1。创建ex_signal_struct
模型通过使用增益模块,一个总线创造者块,和一个单位延迟块。获得和单元延迟块使结构更可识别在生成的代码中。
2。配置总线创造者块接受三个输入,在块对话框中,设置输入数量来3
。
3所示。在将来发布,建模选项卡,在设计,点击式编辑器。
4所示。在将来发布编辑类型添加画廊,点击公共汽车创建一个金宝appSimulink.Bus
对象。然后,名字my_signals_type
。与my_signals_type
选中时,在添加画廊,点击公共汽车元素添加三个元素的三倍。他们的名字signal1
,signal2
,signal3
。有关更多信息,请参见式编辑器。
5。总线对象保存在当前文件夹ex_signal_struct_data.mat
。
这辆公共汽车对象表示的结构类型,你想要使用生成的代码。
6。总线中的创造者块对话框中,设置输出数据类型来总线:my_signals_type
。
7所示。选择输出作为nonvirtual总线。点击好吧。nonvirtual巴士出现在生成的代码结构。
8。打开金宝app仿真软件编码器的应用程序。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;/ * < Root > /总线创造者的* /
在同一个文件中,在模型中一步
函数,算法访问sig_struct_var
的字段sig_struct_var
。
嵌套结构的信号
您可以创建嵌套结构的信号数据生成的代码。
C构造
typedef struct{双signal1;双signal2;双signal3;}B_struct_type;typedef struct{双signal1;双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
。与A_struct_type
选中时,在添加画廊,点击公共汽车元素添加两个元素的两倍。名称的元素subStruct_B
和subStruct_C
。有关更多信息,请参见式编辑器。这辆公共汽车对象代表了高层结构类型,你想要使用生成的代码。
4所示。类似地,创建金宝appSimulink.Bus
对象B_struct_type
(三要素)C_struct_type
(两个元素)。
5。在A_struct_type
的对象,subStruct_B
元素,集数据类型来总线:B_struct_type
。同样的,对subStruct_C
元素,集数据类型来总线:C_struct_type
。
中的每个元素A_struct_type
使用另一个总线对象作为一个数据类型。这些元素代表子结构。
6。对话框的总线创造者块收集三个获得信号,设置输出数据类型来总线:B_struct_type
。点击应用。
7所示。选择输出作为nonvirtual总线并点击好吧。
8。对话框的其他下属总线创造者,集输出数据类型来总线:C_struct_type
并选择输出作为nonvirtual总线。点击好吧。
9。在末班车创造者块对话框中,设置输出数据类型来总线:A_struct_type
并选择输出作为nonvirtual总线。点击好吧。
10。打开金宝app仿真软件编码器的应用程序。C代码选项卡上,选择代码接口>单个元素的代码映射。
11。打开信号/州选项卡。在模型中,选择的输出信号A_struct_type
总线的创造者,反过来单位延迟块。单击添加选中的信号代码映射按钮代码映射编辑器。
12。添加信号,设置存储类来ExportedGlobal
。
13。在属性检查器,设置代码>标识符财产sig_struct_var
。总线的创造者的输出出现在生成的代码块作为一个单独的全局结构变量命名sig_struct_var
。
14。从模型中生成代码。
结果
生成的头文件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;/ * < Root > /总线Creator2”* /
在同一个文件中,在模型中一步
函数,算法访问sig_struct_var
的字段sig_struct_var
。
结合技术来解决的局限性
解决一些每个技术的局限性,可以结合结构化存储类nonvirtual公交车和参数结构。例如,您可以:
包括信号数据的结构和结构参数的数据在同一个父结构。
默认情况下巢结构而聚合新数据。
在生成的代码中,平面父结构,对应于结构化存储类,包含子结构,对应于每个总线结构和参数。选择其中一个组合技术:
结构化存储类直接适用于每个总线结构和参数。例如,设置两个nonvirtual总线信号的存储类
结构体
。每个总线出现在生成的代码作为一个领域(底座)的一个结构。离开每个总线结构和参数的存储类在默认设置,
汽车
,或者在模型的默认
,防止代码生成优化消除公共汽车或参数结构。然后,配置默认存储类,这样信号数据和参数数据默认使用结构化存储类。
数组的结构
您可以进一步多个一致的总线信号或参数结构封装成一个数组。公共汽车或参数的数组结构出现在生成的代码作为一个结构数组。创建数组的公交车,看到的集团Nonvirtual巴士公交车的数组。创建数组的参数结构,明白了组织多个参数结构到一个数组中。
结构填充
默认情况下,代码生成器并不显式地添加填充字段结构类型。结构类型可以出现在生成的代码,例如,标准的数据结构(见数据结构在生成的代码中),金宝appSimulink.Bus
对象和参数模型中使用的结构。
然而,当您使用嵌入式程序员代码替换库,您可以指定数据对齐(包括结构填充)作为替换库的一部分。有关更多信息,请参见为编译器提供数据校准规范(嵌入式编码)。
限制
内置金宝app®编码器™和嵌入式编码的特性,不能生成或使用一个自定义结构,包含一个字段的值是一个指针。可以手动创建一个先进的存储类和编写陪同TLC代码(见精确控制数据表示通过编写TLC存储类的代码(嵌入式编码))。
你不能使用内置的存储类
结构体
,或一个结构化的存储类,您创建的自定义存储类设计器(你设置存储类属性类型来FlatStructure
),设置数据默认映射编辑器的代码。