主要内容

配置生成C代码的数据存储

数据存储使子系统和引用模型能够共享数据,而无需使用I/O端口在级别之间传递数据(请参阅数据存储基础知识而且生成代码中的数据存储).数据存储的类型包括本表中的数据存储类型。

数据存储类型 描述
本地数据存储 可从模型层次结构中处于或低于您定义数据存储的级别的任何地方访问的数据存储。可以在模型中图形化地定义本地数据存储数据存储内存或者在模型工作区中创建一个信号对象(合成数据存储)
共享本地数据存储 数据存储内存Block参数跨模型实例共享集。这些数据存储只能在定义它们的模型中访问。数据存储值在模型实例之间共享。
全局数据存储 由基本工作空间或数据字典中的信号对象定义的数据存储。应用程序中的多个模型可以使用这些数据存储。

中打开模型时嵌入式编码器app、本地和共享本地数据存储出现在代码映射编辑器中,您可以在其中配置用于代码生成的数据存储。如果模型使用全局数据存储,则可以在“代码映射”编辑器中单击刷新显示在数据存储名称右侧的链接。该链接启动一个更新图,并添加模型在编辑器视图中使用的全局数据存储。

配置数据存储如下:

  • 在执行生成的代码时,使数据可用于交互。

  • 控制代码生成器在内存中放置数据的位置。

  • 提高生成代码的可读性和可追溯性。

对于代码生成,示例展示了如何为模型配置数据存储rtwdemo_configinterface.属性配置代码映射代码映射编辑器- C或代码映射API (coder.mapping.api.CodeMapping).

选择“数据存储自定义选项”

默认情况下,模型中的本地数据存储在生成的代码中显示为全局数据结构的字段模型_DW.共享本地数据存储以全局数据结构字段的形式出现模型_SharedDSM.根据您的代码接口需求,决定是否自定义数据存储的代码生成。如果不配置自定义,代码生成器将确定是否消除或更改生成的代码中数据存储的表示,以实现优化目的。如果您配置自定义,请确定:

  • 是否设置默认配置

    如果一个模型包含在程序执行期间必须可访问的给定类别的大量数据存储(例如,超过10个),则使用默认设置配置数据存储,然后针对特殊情况覆盖该设置会更有效。如果模型包含一些给定类别的数据存储,这些数据存储具有惟一的来源、命名或放置要求,请考虑单独配置数据存储。

  • 如何在生成的代码中声明和处理模型数据存储

    • 作为单独的全局变量

    • 以外部代码中定义的全局变量的形式从数据存储中读取

    • 作为访问函数的调用。需要嵌入式编码器®

    有关这些选项的详细信息,请参见生成代码中的控制数据和函数接口

模型参数的其他考虑因素包括:

有关与具有相应存储类和存储类属性的数据存储相关的接口要求的列表,请参见选择“数据存储的存储类”和“存储类属性”

例如模型rtwdemo_configinterface,数据存储要求如下:

  • 类定义和声明的单独全局变量表示本地数据存储静态类型限定符。

  • 类定义和声明的单独全局变量表示共享本地数据存储挥发性类型限定符。

  • 应用前缀ds_到表示数据存储的变量的名称。

对于本例,您将生成的代码中本地数据存储的默认表示形式设置为全局变量静态类型限定符和共享本地数据存储作为全局变量,具有挥发性类型限定符.然后,将模型中的本地数据存储配置为使用默认存储类和包含所需前缀的惟一代码标识符ds_.代码标识符功能使您可以指定代码生成标识符,而不必修改模型设计。

配置数据存储的默认代码生成设置

数据存储的默认代码生成设置可以减少为代码生成准备模型的工作,特别是当您希望在生成的代码执行时访问模型的大量数据存储时。选择一次配置设置,代码生成器将这些设置应用到跨模型的数据存储。万博1manbetx动态仿真模块®将默认配置存储为模型的一部分。

如果您的模型对一个给定的类别使用多个数据存储,而这些数据存储没有唯一的需求,那么考虑为模型数据存储配置默认的代码生成设置或者使用共享的嵌入式编码器字典

方法的使用代码映射编辑器- C设置数据存储的默认设置。使用Code Mappings编辑器为模型中的本地和共享本地数据存储设置默认存储类rtwdemo_configinterfaceFileScope而且挥发性分别.使用这些存储类设置,代码生成器将生成的代码中的数据存储表示为全局变量静态而且挥发性类型限定符

  1. 开放模式rtwdemo_configinterface.将模型的副本保存到可写位置。

    万博1manbetx使用Simulink模型学习如何配置用于代码生成的模型数据存储。

  2. 打开嵌入式编码器应用程序。

  3. C代码选项卡上,选择代码接口>默认代码映射

  4. 为本地数据存储配置默认代码映射。在“代码映射”编辑器中数据默认值选项卡,展开信号节点。选择类别信号、状态和内部数据.将存储类设置为FileScope

    代码映射编辑器,选中数据默认选项卡,展开信号树节点,并将信号、状态和内部数据的存储类设置为FileScope。

  5. 为共享本地数据存储配置默认代码映射。选择类别共享本地数据存储.将存储类设置为挥发性

  6. 保存模型。

配置单个数据存储的代码生成

您可以为代码生成配置单独的数据存储。例如,如果一个模型有两个具有唯一代码生成需求的相同类别的数据存储,则分别配置数据存储。或者,如果为某类数据存储配置默认设置,则可以覆盖特定数据存储的这些设置。

如果您的模型至少满足以下条件之一,请考虑为数据存储单独配置代码生成设置:

  • 使用具有唯一来源、命名或放置要求的同一类别的多个数据存储。

  • 使用少数同一类别的数据存储。

  • 具有数据存储类别的默认配置,您需要覆盖某些特定状态的配置。

类的默认存储类设置,此示例演示如何使用“代码映射”编辑器数据存储内存模式在模型rtwdemo_configinterface.该示例还展示了如何为该数据存储配置代码标识符。

  1. 如果您还没有这样做,请完成下面的步骤配置数据存储的默认代码生成设置

  2. 在代码映射编辑器中,单击数据存储选项卡。扩大本地数据存储.数据存储的存储类模式设置为汽车,这意味着代码生成器可能为了优化目的而消除或更改相关代码的表示。如果不可能进行优化,代码生成器将应用模型默认配置。对于本例,模型默认配置指定存储类挥发性

    • 要避免优化并强制代码生成器使用默认配置,请将存储类设置为模型的默认

    • 若要覆盖默认配置,请指定满足该数据存储的代码生成要求的存储类。

  3. 在“代码映射”编辑器中选择本地数据存储模式.将存储类设置为模型默认值:Volatile

  4. 为数据存储配置包含前缀的代码标识符ds_.在“代码映射”编辑器中,选择共享本地数据存储模式.单击图标以配置其他代码映射属性图标并设置存储类属性标识符ds_mode

    选中“数据存储”选项卡的“代码映射”编辑器,展开“共享本地数据存储”树节点,并将数据存储模式的存储类设置为“模型默认值:Volatile”。映射检查器显示数据存储模式的标识符属性设置为ds_mode。

  5. 保存模型。

  6. 生成并查看代码。例如,在rtwdemo_configinterface.c,查找该数据存储的数据定义。

    static boolean_T ds_mode;

    找到在步骤入口点函数中使用状态数据的位置。

    ……ds_mode = (input1 > rtwdemo_configinterface_UPPER) || (input1 < rtwdemo_configinterface_LOWER));……if (ds_mode) {output = (real_T)mp_K1 * dout_Table1;} else {output = dstate_X;}……

以编程方式配置数据存储的代码生成设置

要为代码生成自动化配置数据存储,请使用代码映射的编程接口。例如,当创建自定义块库或应用程序测试环境的一部分时,使用编程接口来自动化数据配置。

这个例子展示了如何使用编程接口来配置模型的数据存储rtwdemo_configinterface.在生成的代码中将本地和共享本地数据存储的默认表示形式设置为全局变量静态而且挥发性分别键入限定符.配置数据存储内存模式使用默认存储类和包含所需前缀的惟一代码标识符ds_

  1. 打开示例模型。

    open_system(“rtwdemo_configinterface”)
  2. 创建对象厘米通过调用函数coder.mapping.api.get.对象存储数据和功能模型的代码生成配置rtwdemo_configinterface

    Cm = code .mapping.api.get('rtwdemo_configinterface');
  3. 通过调用function配置本地数据存储的默认设置setDataDefault.对于参数,指定这些值:

    • 返回的对象。coder.mapping.api.get

    • InternalData对于默认类别

    • 属性名StorageClass具有财产价值FileScope

    setDataDefault (cm,‘InternalData’,‘StorageClass’,‘FileScope’);
  4. 通过调用function配置共享本地数据存储的默认设置setDataDefault.为参数指定以下值:

    • 返回的对象。coder.mapping.api.get

    • SharedLocalDataStore对于默认类别。

    • 属性名StorageClass具有财产价值挥发性

    setDataDefault(厘米,“SharedLocalDataStore”、“StorageClass”,“不稳定的”);
  5. 检查本地和共享本地数据存储的默认配置设置。发出呼叫getDataDefault返回的对象coder.mapping.api.get、类别InternalData,以及物业StorageClass.在第二次呼叫getDataDefault,将类别替换为SharedLocalDataStore

    getDataDefault(cm,'Internal','StorageClass') ans = 'FileScope' getDataDefault(cm,'SharedLocalDataStore','StorageClass') ans = 'Volatile'
  6. 对本地数据存储应用默认配置模式

    默认情况下,Simuli万博1manbetxnk将数据存储的存储类设置为汽车.当存储类为汽车,代码生成器:

    • 确定是否为优化目的从生成的代码中删除数据。

    • 如果保留数据,则决定如何在生成的代码中有效地表示数据,并考虑默认配置设置。

    若要控制单个数据存储的配置,请调用functionsetDataStore.发出呼叫setDataStore指定:

    • 返回的对象coder.mapping.api.get

    • 数据存储名称模式

    • 先前使用属性为数据存储设置的默认存储类StorageClass以及财产价值模型的默认

    • 财产标识符以及财产价值ds_mode

    setDataStore(厘米,“模式”,“StorageClass”,“违约模型”,“标识符”,“ds_mode”);
  7. 通过调用函数验证配置更改getDataStore.指定返回的对象coder.mapping.api.get、数据存储的名称和属性StorageClass标识符

    getDataStore(cm,'mode','StorageClass') ans = 'Model default' getDataStore(cm,'mode','Identifier') ans = 'ds_mode'
  8. 保存模型。

  9. 生成并查看代码。例如,在rtwdemo_configinterface.c,找到数据存储的数据定义。

    static boolean_T ds_mode;

    找到在步骤入口点函数中使用数据存储的位置。

    ……ds_mode = (input1 > rtwdemo_configinterface_UPPER) || (input1 < rtwdemo_configinterface_LOWER));……if (ds_mode) {output = (real_T)mp_K1 * dout_Table1;} else {output = dstate_X;}……

选择“数据存储的存储类”和“存储类属性”

根据您的代码生成需求,从这些存储类中进行选择,以配置数据存储的代码生成。

需求 存储类
启用优化,可能会生成更高效的代码。 汽车(仅限单个映射)
对于无法优化的数据元素,将数据表示为标准数据结构的字段。 默认的(仅默认映射)
防止优化消除数据元素的存储,并为数据元素类别使用默认存储类。 模型的默认(仅限单个映射),词典默认(仅限单个映射)
生成一个在命名位域中存储布尔数据的结构。 设置(仅限个别地图)
属性的全局变量定义和声明挥发性类型限定符。 挥发性(见Const, Volatile和ConstVolatile
生成全局变量定义和声明。 ExportedGlobal
生成指定文件的全局变量定义和声明。 ExportToFile
属性的全局变量定义和声明静态类型限定符。 FileScope(仅限本地和共享本地数据存储映射)
通过调用自定义访问器函数生成与数据交互的代码。 GetSet
生成从外部代码定义的全局变量或全局变量指针读取和写入的代码。 ImportedExtern, ImportedExternPointer
生成读取和写入外部头文件定义的全局变量的代码。 ImportFromFile
生成函数的局部变量。 可以定位的
生成一个具有名称的全局结构,您可以指定名称。 结构体(仅限单个映射)
生成一个支持缓冲区重用的全局变量。 可重用的(仅限单个映射)

可用存储类的列表可能包括嵌入式编码器字典中定义的其他特定于项目的存储类。如果您有列出的存储类无法满足的特殊需求,并且您有嵌入式Coder软件,那么您可以定义一个存储类。看到为软件架构定义服务接口、存储类、内存段和功能模板

对于单个数据存储,请使用标识符属性为生成的代码中表示数据存储的变量配置名称。使用Embedded Coder,您还可以根据所选择的存储类配置这些属性。

财产 描述 存储类
DefinitionFile 包含全局数据定义的源定义文件,由数据存储和外部代码读取 ExportToFile而且挥发性
GetFunction 数据存储在生成的代码中显示为对指定的得到函数 GetSet
HeaderFile 包含全局数据声明的源头文件,由数据存储和外部代码读取 ExportToFileGetSetImportFromFile,挥发性
记忆的部分(仅限默认数据存储配置) 包含数据存储读取的数据的内存部分 默认的
老板 代码生成器将数据存储的定义放在为共享定义的模型层次结构中的多个模型之一生成的代码中。您必须选择模型配置参数使用数据对象的所有者来放置数据定义.看到控制在生成的文件中全局数据定义和声明的放置 ExportToFile而且挥发性
PreserveDimensions 代码生成器保留在生成的代码中表示为多维数组的数据存储维。您必须设置模型配置参数阵列布局.看到在生成的代码中保留多维数组的维度 ExportToFileFileScopeGetSetImportFromFile可以定位的而且挥发性
SetFunction 数据存储在生成的代码中显示为对指定的函数。 GetSet
StructName 为数据存储生成的代码中结构的名称。 设置而且结构体

另请参阅

|

相关的话题