主要内容gydF4y2Ba

为全局数据生成代码gydF4y2Ba

工作流gydF4y2Ba

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

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

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

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

  3. 使用gydF4y2BaMATLAB编码器™gydF4y2BaApp或使用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;AR = ones(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使用App指定全局变量类型和初始值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',ones(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 = code .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

缺省情况下,全局数据为: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 = code .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配置对象)gydF4y2Ba 验证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

Baidu
map