主要内容gydF4y2Ba

为全局数据生成代码gydF4y2Ba

工作流gydF4y2Ba

从MATLAB生成C/ c++代码gydF4y2Ba®gydF4y2Ba使用全局数据的代码:gydF4y2Ba

  1. 在代码中声明变量为全局变量。gydF4y2Ba

  2. 在使用全局数据之前,定义并初始化它。gydF4y2Ba

    有关更多信息,请参见gydF4y2Ba定义全局数据gydF4y2Ba.gydF4y2Ba

  3. 使用gydF4y2BaMATLAB编码器™gydF4y2Ba应用程序或使用gydF4y2BacodegengydF4y2Ba.gydF4y2Ba

如果使用全局数据,还必须指定是否要在MATLAB和生成的MEX函数之间同步该数据。有关更多信息,请参见gydF4y2Ba用MATLAB同步全局数据gydF4y2Ba.gydF4y2Ba

声明全局变量gydF4y2Ba

当使用全局数据时,必须首先在MATLAB代码中声明全局变量。考虑到gydF4y2Bause_globalsgydF4y2Ba函数使用两个全局变量gydF4y2Ba基于“增大化现实”技术gydF4y2Ba和gydF4y2BaBgydF4y2Ba:gydF4y2Ba

函数gydF4y2Bay = use_globals (u)gydF4y2Ba% # codegengydF4y2Ba%关闭内联使gydF4y2Ba%生成的代码更容易阅读gydF4y2Bacoder.inline (gydF4y2Ba“永远”gydF4y2Ba);gydF4y2Ba%声明AR和B为全局变量gydF4y2Ba全球gydF4y2Ba基于“增大化现实”技术;gydF4y2Ba全球gydF4y2BaB;AR(1) = u + B(1);y = AR * 2;gydF4y2Ba

定义全局数据gydF4y2Ba

您可以在MATLAB全局工作空间中定义全局数据gydF4y2BaMATLAB编码器gydF4y2Ba工程,或在命令行。如果您没有在项目中或命令行中初始化全局数据,gydF4y2BaMATLAB编码器gydF4y2Ba在MATLAB全局工作空间中查找变量。如果变量不存在,gydF4y2BaMATLAB编码器gydF4y2Ba生成一个错误。gydF4y2Ba

中定义全局数据gydF4y2BaMATLABgydF4y2Ba全球的工作区gydF4y2Ba

的MEX函数gydF4y2Bause_globalsgydF4y2Ba描述的功能gydF4y2Ba声明全局变量gydF4y2Ba使用gydF4y2BacodegengydF4y2Ba:gydF4y2Ba

  1. 在MATLAB工作空间中,定义并初始化全局数据。在MATLAB提示下,输入:gydF4y2Ba

    全球gydF4y2Ba基于“增大化现实”技术的B;基于“增大化现实”技术= 1 (4);B = [1 2 3];gydF4y2Ba

  2. 生成MEX文件。gydF4y2Ba

    codegengydF4y2Bause_globalsgydF4y2Baarg游戏gydF4y2Ba{0}gydF4y2Ba%使用-args选项指定输入的ugydF4y2Ba%是实数,标量,双精度gydF4y2Ba默认情况下,codegen生成一个MEX函数,gydF4y2Ba% use_globals_mex,在当前文件夹中gydF4y2Ba

定义全局数据gydF4y2BaMATLABgydF4y2Ba编码器gydF4y2Ba应用程序gydF4y2Ba

  1. 在gydF4y2Ba定义输入类型gydF4y2Ba页,自动定义输入类型或单击gydF4y2Ba让我直接输入输入类型或全局类型gydF4y2Ba.gydF4y2Ba

    该应用程序显示一个入口点输入表。gydF4y2Ba

  2. 要添加全局变量,请单击gydF4y2Ba增加全球gydF4y2Ba.gydF4y2Ba

    默认情况下,应用程序命名项目中的第一个全局变量gydF4y2BaggydF4y2Ba,以及后续的全局变量gydF4y2Bag1gydF4y2Ba,gydF4y2Bag2gydF4y2Ba,等等。gydF4y2Ba

  3. 下gydF4y2Ba全局变量gydF4y2Ba,输入全局变量的名称。gydF4y2Ba

  4. 单击全局变量名称右侧的字段。指定全局变量的类型和初始值。看到gydF4y2Ba使用应用程序指定全局变量类型和初始值gydF4y2Ba.gydF4y2Ba

    如果不指定类型,则必须在全局工作区中创建具有相同名称的变量。gydF4y2Ba

在命令行定义全局数据gydF4y2Ba

要在命令行定义全局数据,请使用gydF4y2BacodegengydF4y2Ba全局变量gydF4y2Ba选择。例如,编译gydF4y2Bause_globalsgydF4y2Ba描述的功能gydF4y2Ba声明全局变量gydF4y2Ba,指定两个全局输入gydF4y2Ba基于“增大化现实”技术gydF4y2Ba和gydF4y2BaBgydF4y2Ba在命令行。使用gydF4y2Baarg游戏gydF4y2Ba选项指定输入gydF4y2BaugydF4y2Ba是一个实的标量二重。默认情况下,codegen生成一个MEX函数,gydF4y2Bause_globals_mexgydF4y2Ba,在当前文件夹中。gydF4y2Ba

codegengydF4y2Ba全局变量gydF4y2Ba{AR,(4),“B”,(1 2 3)}gydF4y2Bause_globalsgydF4y2Baarg游戏gydF4y2Ba{0}gydF4y2Ba

属性指定类型和初始值gydF4y2Ba全局变量gydF4y2Ba使用格式标记gydF4y2Ba-globals {'g', {type, initial_value}}gydF4y2Ba.对于单元格数组,必须使用这种格式。看到gydF4y2Ba在命令行指定全局单元格数组gydF4y2Ba.gydF4y2Ba

定义可变大小的全局数据。gydF4y2Ba要为可变大小的全局数据提供初始值,请使用gydF4y2Ba全局变量gydF4y2Ba使用格式标记gydF4y2Ba-globals {'g', {type, initial_value}}gydF4y2Ba.例如,指定一个全局变量gydF4y2Bag1gydF4y2Ba它有一个初始值gydF4y2Ba[1]gydF4y2Ba和上界gydF4y2Ba(2 - 2)gydF4y2Ba,输入:gydF4y2Ba

codegengydF4y2Ba喷火gydF4y2Ba全局变量gydF4y2Ba{{编码器,g1”。Typeof (0, [2 2],1),[1 1]}}gydF4y2Ba
有关语法的详细说明,请参见gydF4y2Bacoder.typeofgydF4y2Ba.gydF4y2Ba

同步全局数据gydF4y2BaMATLABgydF4y2Ba

为什么要同步全局数据?gydF4y2Ba

所生成的MEX函数和MATLAB都有各自的全局数据副本。要使这些副本保持一致,您必须在两者交互时同步它们的全局数据。如果不同步数据,它们的全局变量可能会不同。交互级别决定了何时同步全局数据。有关更多信息,请参见gydF4y2Ba何时同步全局数据gydF4y2Ba.gydF4y2Ba

当全局数据为常量时,不能用MATLAB同步全局数据。默认情况下,MEX函数在函数入口和外部函数调用之后测试编译时常量全局值和MATLAB值之间的一致性。如果MATLAB值与编译时常量全局值不同,则MEX函数以一个错误结束。有关何时控制MEX函数测试编译时常量全局值与MATLAB值之间的一致性的信息,请参见gydF4y2BaMATLAB与常量全局数据的一致性gydF4y2Ba.gydF4y2Ba

何时同步全局数据gydF4y2Ba

默认情况下,MEX函数的全局数据与MATLAB之间的同步发生在MEX函数的入口和出口以及外部调用时。使用这种同步方法最大限度地保持MEX函数和MATLAB之间的一致性。gydF4y2Ba

为了提高性能,您可以:gydF4y2Ba

  • 选择只在MEX函数入口和出口点进行同步。gydF4y2Ba

  • 当全局数据不交互时禁用同步。gydF4y2Ba

  • 选择是否在每次外部调用之前和之后进行同步。gydF4y2Ba

下表总结了要使用哪些全局数据同步选项。要了解如何设置这些选项,请参见gydF4y2Ba如何同步全局数据gydF4y2Ba.gydF4y2Ba

全局数据同步选项gydF4y2Ba

如果你想gydF4y2Ba 设置全局数据同步方式为:gydF4y2Ba 在外部调用之前和之后同步?gydF4y2Ba
当所有外部调用修改全局数据时具有最大的一致性。gydF4y2Ba 在mex函数入口,出口和外部调用gydF4y2Ba(默认)gydF4y2Ba 是的。默认的行为。gydF4y2Ba
当大多数外部调用修改全局数据,而少数不修改时,具有最大的一致性。gydF4y2Ba 在mex函数入口,出口和外部调用gydF4y2Ba(默认)gydF4y2Ba

是的。使用gydF4y2Bacoder.extrinsicgydF4y2Ba同步:了gydF4y2Ba选项关闭不改变全局数据的外部调用的同步。gydF4y2Ba

当大多数外部调用不修改全局数据而只有少数调用修改全局数据时,具有最大的一致性。gydF4y2Ba 在mex功能入口和出口gydF4y2Ba

是的。使用gydF4y2Bacoder.extrinsicgydF4y2Ba同步:gydF4y2Ba选项只同步修改全局数据的调用。gydF4y2Ba

在同步全局数据时最大化性能,并且没有任何外部调用修改全局数据。gydF4y2Ba 在mex功能入口和出口gydF4y2Ba 不。gydF4y2Ba
仅在生成的MEX函数之间进行通信。MATLAB与MEX函数之间不交互全局数据。gydF4y2Ba 禁用gydF4y2Ba 不。gydF4y2Ba

如何同步全局数据gydF4y2Ba

若要控制全局数据同步,可设置全局数据同步模式,并选择是否同步外部功能。有关使用哪些选项的指南,请参见gydF4y2Ba何时同步全局数据gydF4y2Ba.gydF4y2Ba

您可以通过项目设置对话框、命令行或MEX配置对话框控制全局数据同步模式。控件可以用外部函数来控制数据的同步gydF4y2Bacoder.extrinsicgydF4y2Ba同步:gydF4y2Ba和gydF4y2Ba同步:了gydF4y2Ba选项。gydF4y2Ba

全局数据同步模式使用gydF4y2BaMATLABgydF4y2Ba编码器gydF4y2Ba应用程序gydF4y2Ba

  1. 打开gydF4y2Ba生成gydF4y2Ba对话框中gydF4y2Ba生成代码gydF4y2Ba页面,点击gydF4y2Ba生成gydF4y2Ba箭头gydF4y2Ba.gydF4y2Ba

  2. 集gydF4y2Ba构建类型gydF4y2Ba来gydF4y2Ba墨西哥人gydF4y2Ba.gydF4y2Ba

  3. 点击gydF4y2Ba更多的设置gydF4y2Ba.gydF4y2Ba

  4. 在gydF4y2Ba内存gydF4y2Ba选项卡,设置gydF4y2Ba全局数据同步方式gydF4y2Ba来gydF4y2Ba在mex功能入口和出口gydF4y2Ba或gydF4y2Ba禁用gydF4y2Ba,如适用。gydF4y2Ba

通过命令行控制全局数据同步模式gydF4y2Ba

  1. 在MATLAB工作空间中,定义代码生成配置对象。在MATLAB命令行中,输入:gydF4y2Ba

    mexcfg = coder.config (gydF4y2Ba墨西哥人的gydF4y2Ba);gydF4y2Ba

  2. 在MATLAB命令行中,设置gydF4y2BaGlobalDataSyncMethodgydF4y2Ba财产gydF4y2BaSyncAtEntryAndExitsgydF4y2Ba或gydF4y2BaNoSyncgydF4y2Ba,如适用。例如:gydF4y2Ba

    mexcfg。全球DataSyncMethod =“SyncAtEntryAndExits”gydF4y2Ba;gydF4y2Ba

  3. 在编译代码时,使用gydF4y2BamexcfggydF4y2Ba配置对象。例如,为函数生成一个MEX函数gydF4y2Ba喷火gydF4y2Ba它没有输入:gydF4y2Ba

    codegengydF4y2Ba配置gydF4y2BamexcfggydF4y2Ba喷火gydF4y2Ba

控制外部函数调用的同步。gydF4y2Ba要控制MATLAB和MEX函数全局数据在调用外部函数之前和之后是否发生同步,可以使用gydF4y2Bacoder.extrinsicgydF4y2Ba同步:gydF4y2Ba和gydF4y2Ba同步:了gydF4y2Ba选项。gydF4y2Ba

默认情况下,global data为:gydF4y2Ba

  • 如果全局数据同步模式为,则在每次外部调用之前和之后同步gydF4y2Ba在mex函数入口,出口和外部调用gydF4y2Ba.属性关闭这些调用的同步,如果您确定某些外部调用不会更改全局数据gydF4y2Ba同步:了gydF4y2Ba选择。例如,if函数gydF4y2Bafoo1gydF4y2Ba和gydF4y2Bafoo2gydF4y2Ba不要改变全局数据,关闭这些函数的同步:gydF4y2Ba

    coder.extrinsic (gydF4y2Ba“同步:掉”gydF4y2Ba,gydF4y2Ba“foo1”gydF4y2Ba,gydF4y2Ba“foo2”gydF4y2Ba);gydF4y2Ba

  • 当全局数据同步方式为时,表示未同步gydF4y2Ba在mex功能入口和出口gydF4y2Ba.如果代码有一些更改全局数据的外部调用,则使用gydF4y2Ba同步:gydF4y2Ba选择。例如,if函数gydF4y2Bafoo1gydF4y2Ba和gydF4y2Bafoo2gydF4y2Ba更改全局数据,打开这些函数的同步:gydF4y2Ba

    coder.extrinsic (gydF4y2Ba的同步:gydF4y2Ba,gydF4y2Ba“foo1”gydF4y2Ba,gydF4y2Ba“foo2”gydF4y2Ba);gydF4y2Ba

  • 当全局数据同步方式为时,表示未同步gydF4y2Ba禁用gydF4y2Ba.当同步被禁用时,不能使用gydF4y2Ba同步:gydF4y2Ba选项来控制特定外部调用的同步。gydF4y2Ba

明确的全局数据gydF4y2Ba

因为MEX函数和MATLAB都有它们自己的全局数据副本,所以必须gydF4y2Ba清晰的gydF4y2Ba这两个副本确保连续运行MEX产生相同的结果。的gydF4y2Ba明确的全球gydF4y2Ba命令只删除MATLAB工作空间中全局数据的副本。要删除数据的两个副本,请使用gydF4y2Ba明确的全球gydF4y2Ba和gydF4y2Ba清晰的墨西哥人gydF4y2Ba命令在一起。的gydF4y2Ba清除所有gydF4y2Ba命令也会删除两个副本。gydF4y2Ba

定义常量全局数据gydF4y2Ba

如果您知道全局变量的值在运行时不会更改,那么可以通过指定全局变量具有常量值来减少生成代码中的开销。不能写入常量全局变量。gydF4y2Ba

属性定义常量全局数据gydF4y2BaMATLABgydF4y2Ba编码器gydF4y2Ba应用程序gydF4y2Ba

  • 在gydF4y2Ba定义输入类型gydF4y2Ba页,自动定义输入类型或单击gydF4y2Ba让我直接输入输入类型或全局类型gydF4y2Ba.gydF4y2Ba

    该应用程序显示一个入口点输入表。gydF4y2Ba

  1. 要添加全局变量,请单击gydF4y2Ba增加全球gydF4y2Ba.gydF4y2Ba

    默认情况下,应用程序命名项目中的第一个全局变量gydF4y2BaggydF4y2Ba,以及后续的全局变量gydF4y2Bag1gydF4y2Ba,gydF4y2Bag2gydF4y2Ba,等等。gydF4y2Ba

  2. 下gydF4y2Ba全局变量gydF4y2Ba,输入全局变量的名称。gydF4y2Ba

  3. 单击全局变量名右侧的字段。gydF4y2Ba

  4. 选择gydF4y2Ba定义常量值gydF4y2Ba.gydF4y2Ba

  5. 在全局变量右侧的字段中,输入一个MATLAB表达式。gydF4y2Ba

在命令行定义常量全局数据gydF4y2Ba

属性指定全局变量为常量gydF4y2BacodegengydF4y2Ba命令,可以使用gydF4y2Ba全局变量gydF4y2Ba选择与gydF4y2Ba编码器。常数gydF4y2Ba类。gydF4y2Ba

  1. 为所需的代码生成输出类型定义配置对象。例如,为MEX代码生成定义一个配置对象:gydF4y2Ba

    cfg = coder.config (gydF4y2Ba墨西哥人的gydF4y2Ba);gydF4y2Ba

  2. 使用gydF4y2Ba编码器。常数gydF4y2Ba指定全局变量具有常量值。例如,下面的代码指定了全局变量gydF4y2BaggydF4y2Ba有初始值gydF4y2Ba4gydF4y2Ba这个全局变量gydF4y2BagcgydF4y2Ba具有常数值gydF4y2Ba42gydF4y2Ba.gydF4y2Ba

    global_values = {gydF4y2Ba‘g’gydF4y2Ba4gydF4y2Ba“垃圾收集”gydF4y2Bacoder.Constant (42)};gydF4y2Ba
  3. 控件生成代码gydF4y2Ba全局变量gydF4y2Ba选择。例如,为gydF4y2BamyfunctiongydF4y2Ba指定在单元格数组中定义全局变量gydF4y2Baglobal_valuesgydF4y2Ba.gydF4y2Ba

    codegengydF4y2Ba配置gydF4y2BacfggydF4y2Ba全局变量gydF4y2Baglobal_valuesgydF4y2BamyfunctiongydF4y2Ba

之间的一致性gydF4y2BaMATLABgydF4y2Ba和常量全局数据gydF4y2Ba

默认情况下,生成的MEX函数会验证MATLAB工作空间中的常量全局数据值是否与生成的MEX中的编译时值一致。它在函数入口和调用外部函数之后测试一致性。如果MEX函数检测到不一致,则以错误结束。若要控制MEX函数何时测试一致性,请使用全局同步模式和gydF4y2Bacoder.extrinsicgydF4y2Ba同步选项。gydF4y2Ba

下表显示了全局数据同步模式和gydF4y2Bacoder.extrinsicgydF4y2Ba同步选项设置确定MEX函数何时验证编译时常量全局数据值与MATLAB之间的一致性。gydF4y2Ba

全局数据同步模式(项目)gydF4y2Ba MEX配置对象GlobalDataSyncMethodgydF4y2Ba 在MEX函数入口验证常量全局值的一致性gydF4y2Ba coder.extrinsicsynchronization option 验证外部函数调用后常量全局值的一致性gydF4y2Ba

在mex函数入口,出口和外部调用gydF4y2Ba(默认)gydF4y2Ba

“SyncAlways”gydF4y2Ba

是的gydF4y2Ba

的同步:gydF4y2Ba(默认)gydF4y2Ba

是的gydF4y2Ba

“同步:掉”gydF4y2Ba

没有gydF4y2Ba

在mex功能入口和出口gydF4y2Ba

“SyncAtEntryAndExits”gydF4y2Ba

是的gydF4y2Ba

的同步:gydF4y2Ba

是的gydF4y2Ba

“同步:掉”gydF4y2Ba(默认)gydF4y2Ba

没有gydF4y2Ba

禁用gydF4y2Ba

“NoSync”gydF4y2Ba

没有gydF4y2Ba

N/AgydF4y2Ba

N/AgydF4y2Ba

代码生成报告中的常量全局数据gydF4y2Ba

代码生成报告提供了关于常量全局变量的以下信息:gydF4y2Ba

  • 类型的gydF4y2Ba全球gydF4y2Ba在gydF4y2Ba变量gydF4y2Ba选项卡。gydF4y2Ba

  • 中突出显示的变量名gydF4y2Ba函数gydF4y2Ba窗格。gydF4y2Ba

看到gydF4y2Ba视图MATLAB变量gydF4y2Ba.gydF4y2Ba

生成代码的全局数据限制gydF4y2Ba

  • 全局结构变量不能包含句柄对象或稀疏数组。gydF4y2Ba

  • 你不能申请gydF4y2Bacoder.cstructnamegydF4y2Ba直接指向全局变量。要命名要与全局变量一起使用的结构类型,请使用gydF4y2Bacoder.cstructnamegydF4y2Ba创建命名结构类型的类型对象。然后,当你跑的时候gydF4y2BacodegengydF4y2Ba,指定全局变量具有该类型。看到gydF4y2Ba命名要与全局结构变量一起使用的C结构类型gydF4y2Ba.gydF4y2Ba

另请参阅gydF4y2Ba

相关的话题gydF4y2Ba