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