Main Content

为 C 代码生成配置参数

为代码生成配置模型时,您可以标识和配置参数以支持调整,例如标定。下表列出了您可以配置的参数的类型。

参数的类型描述
模型参数参量参数配置为一个模型参量。每个包含模型参数参量的模型实例都可以将其参量设置为唯一值。
模型参数在模型中定义的参数,例如模型工作区中的参数。
外部参数在基础工作区或数据字典中定义为对象的参数。
常量无法内联的常量值参数。

要为代码生成配置一个参数,必须将该参数与一个数据对象相关联。例如,在为代码生成配置 MATLAB 变量之前,在模型资源管理器中,将变量转换为参数对象。

当您在 Embedded Coder 中打开模型时,与数据对象相关联的模型参数参量和常量会出现在代码映射编辑器中。在该编辑器中,您可以为代码生成配置这些参数。如果模型使用外部参数,您可以通过点击参数名称右侧的 Refresh 链接将这些参数添加到代码映射编辑器中。该链接启动更新图,并在编辑器视图中添加模型使用的外部参数。

将参数数据配置为:

  • 在生成的代码执行时,可访问数据以进行交互。

  • 最小化存储在内存中的数据量。

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

  • 将参数数据提升到模型接口,以便其他组件和系统可以访问这些数据。

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

要控制整个模型中的参数是否可调,您可以使用代码映射编辑器的数据默认值选项卡上的 'Auto' will be tunable/inline 链接来获得对模型配置参数默认参数行为的访问权限。例如,在以下情况下,您可以使用该链接使参数可调:

  • 在快速原型过程中细化参数设置

  • 标定参数

  • 为生产代码优化参数

对于代码生成,示例说明如何为模型 ConfigurationInterface 配置模型参数和模型参数参量。您可以使用代码映射编辑器 - C 或代码映射编程接口 (coder.mapping.api.CodeMapping) 来配置代码映射。

选择参数的自定义选项

默认情况下,模型中的参数在生成代码中显示为采用以下命名方式的全局数据结构体的字段:

  • model_P(对于模型参数)

  • model_InstP(对于模型参数参量)

  • model_ConstP(对于常量参数)

根据您的代码接口要求,决定是否自定义参数数据的生成。如果不配置自定义,代码生成器将出于优化目的确定是消除还是更改生成代码中的参数表示。如果您配置自定义,请决定:

  • 是否设置默认配置

    如果一个模型包含大量必须可调的类别参数(例如,超过 10 个),则更高效的方式是使用默认设置配置该类别的参数,然后在特殊情况下覆盖该设置。如果模型包括一个给定类别的若干元素,且这些元素具有不同源、命名或位置要求,请考虑单独配置这些参数。

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

    • 作为单独的全局变量

    • 从在外部代码中定义的全局变量读取模型参数数据

    • 作为对访问函数的调用。需要 Embedded Coder®

    有关这些选项的详细信息,请参阅Control Data and Function Interface in Generated Code

模型参数的其他考虑事项包括是否要进行以下操作:

要了解具有对应存储类和存储类属性的参数的接口要求,请参阅Choose Storage Class and Storage Class Properties for Data Stores

示例模型 ConfigurationInterface 的参数要求是:

  • 默认情况下,在生成的代码中保留模型参数以用于调整。不要通过内联参数来优化代码。

  • 将模型参数表示为用 constvolatile 类型限定符定义和声明的单独全局变量。

  • 将前缀 mp_ 应用于表示模型参数的变量的名称。

  • 使模型的每个实例的常量参数 UPPERLOWER 具有不同值。

  • 默认情况下,对于模型参数参量的每个实例,分配一个内存区域,它表示为导出的结构体中的一个唯一命名字段。

  • 模型参数参量在生成代码中显示为各个模型函数参量。启用代码生成器来优化模型中的模块不使用的模型参数参量。

在此示例中,请在 ConfigurationInterface 中配置模型参数和模型参数参量,以满足这些代码生成要求。

为参数配置默认代码生成设置

参数的默认代码生成设置可以减少为代码生成准备模型的工作量,特别是在模型有大量参数且您在生成代码执行时需要与之交互的情况下。选择一次配置设置,代码生成器即会将这些设置应用于整个模型中的参数。Simulink® 将默认配置存储为模型的一部分。

如果您的模型使用同一类别的多个参数且这些参数没有唯一性要求或使用一个共享 Embedded Coder 字典,请考虑为模型参数配置默认代码生成设置。

此示例说明如何使用代码映射编辑器 - C 为模型 ConfigurationInterface 配置模型参数和模型参数参量的默认设置。配置模型参数,使其可调并在生成代码中定义和声明为具有类型限定符 constvolatile的单独全局变量。将模型参数参量配置为使用默认设置,其中代码生成器为每个参量实例分配一个内存区域,该区域表示为导出的结构体中的一个唯一命名字段。

  1. 打开模型 ConfigurationInterface

    openExample("ConfigurationInterface")
    

    Simulink model to use for learning how to configure model parameters for code generation.

  2. 打开 Embedded Coder

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

  4. 在代码映射编辑器中,选择模型参数参量。将存储类设置保留为默认值。代码生成器为每个参量实例分配一个单独的内存区域。

  5. 在代码映射编辑器中的参数下,选择模型参数类别。链接文本 'Auto' will be inlined 指示代码生成器默认配置为内联模型参数。此示例的一个要求是模型参数是可调的。点击 'Auto' will be inlined

  6. 在“模型配置参数”对话框中,将模型配置参数默认参数行为设置为可调。保存更改并关闭对话框。在代码映射编辑器中,链接文本更改为 'Auto' will be tunable

  7. 在代码映射中,在模型参数类别仍处于选中状态下,将存储类设置为 ConstVolatile

    Code Mappings editor with Data Defaults tab selected, Parameters tree node expanded, and storage class for Model parameters set to ConstVolatile.

  8. 保存模型。

为单个参数配置代码生成

您可以为单个参数配置代码生成。例如,如果模型有属于同一类别的两个参数,且这两个参数具有不同的代码生成要求,请单独配置这些参数。或者,如果您为一类参数配置了默认设置,则可以覆盖特定参数的那些设置。

如果您的模型满足下列中的至少一个标准,请考虑为参数单独配置代码生成设置:

  • 使用属于同一类别的多个参数,且这些参数具有不同源、命名或位置要求。

  • 使用属于同一类别的若干参数。

  • 某一类参数具有默认配置,您需要覆盖某些特定参数的该配置。

此示例说明如何使用代码映射编辑器将模型参数的默认存储类设置应用于模型 ConfigurationInterface 中的参数 K1Table1Table2。您要为这些参数和模型参数参量 LOWERUPPER 配置代码标识符。您可以指定代码生成标识符(例如用于集成),而无需修改模型设计。

  1. 如果您尚未这样做,请完成为参数配置默认代码生成设置中的步骤。

  2. 在代码映射编辑器中,点击参数选项卡。展开模型参数参量。默认情况下,每个模型参数的存储类设置为 Auto,这意味着代码生成器可能出于优化目的而消除或更改相关代码的表示。如果无法进行优化,代码生成器将应用模型默认配置。在此示例中,将存储类设置保留为 Auto

  3. 展开模型参数。默认情况下,每个参数的存储类都设置为 Auto。使用模型默认配置,该配置指定存储类 ConstVolatile

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

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

  4. 在代码映射编辑器中的模型参数下,选择参数 K1Table1Table2。将存储类设置为模型默认值:ConstVolatile

    Code Mappings editor with Parameters tab selected, parameters K1, Table1, and Table2 selected, and storage class being set to Model default: ConstVolatile.

  5. 使用包含前缀 mp_ 的名称配置模型参数的代码标识符。在代码映射编辑器中,选择模型参数 K1。点击 Icon to configure additional code mapping properties 图标,并将存储类属性标识符设置为 mp_K1。对于参数 Table1Table2,将标识符设置为 mp_Table1mp_Table2

    Code Mappings editor with Parameters tab selected, Model parameters tree node expanded, and storage class for parameters K1, Table1, and Table2 set to Model default: ConstVolatile. Mapping Inspector shows Identifier property for parameter Table2 set to mp_Table2.

  6. 保存模型。

  7. 生成并查看代码。例如,在 ConfigurationInterface.c 中查找模型参数 mp_K1 的数据定义。

    const volatile int8_T mp_K1 = 2; 
    

    查找参数在单步入口函数中的使用位置。

    if (mode) {
        output = (real_T)mp_K1 * dout_Table1;
      } else {
        output = dstate_X;
      }
    

使用 Struct 存储类将参数数据组织为结构体

此示例说明如何使用 Struct 存储类在生成代码中将模块参数值组织为一个结构体。您要将存储类直接应用于模型中的单个数据项。

要在生成代码中创建参数数据的自定义结构体,请考虑在 Simulink 中创建对应的结构体。请参阅Organize Data into Structures in Generated Code

创建示例模型

用三个 Constant 模块和三个 Outport 模块创建以下示例模型。将模型命名为 ex_struct_param

设置常量参数

  1. 打开模型数据编辑器。在建模选项卡上,点击模型数据编辑器

  2. 在模型数据编辑器中,选择参数选项卡。

  3. 在模型中,选择上面的 Constant 模块。

  4. 在模型数据编辑器中,使用列将常量值设置为 p1。在 p1 的旁边,点击操作按钮 three vertical dots 并选择创建

  5. 在“创建新数据”对话框中,将设置为 Simulink.Parameter(1.0),然后点击创建

    Simulink 将名为 p1Simulink.Parameter 对象添加到模型工作区。

  6. p1 的属性对话框中,点击确定

    如果您不必设置其他参数,可以点击代码生成选项卡。然后,点击在 Coder App 中配置按钮,这将打开 Embedded Coder 和代码映射编辑器。

  7. 使用模型数据编辑器,通过使用名为 p2(值 2.0)和 p3(值 3.0)的参数对象来设置其他常量值。

为代码生成配置常量参数

  1. 打开 Embedded Coder

  2. C 代码选项卡上,选择代码接口 > 个体元素代码映射

  3. 在代码映射编辑器中,点击参数选项卡。

  4. 展开模型参数

  5. 将参数 p1p2p3 的存储类设置为 Struct

  6. 选择参数 p1。点击 Icon to configure additional code mapping properties 图标,并将属性 StructName 设置为 my_struct。对于参数 p2p3,将 StructName 设置为 my_struct

  7. 保存模型。

生成和检查代码

生成并检查代码。

文件 ex_struct_param.h 定义结构体类型 my_struct_type

/* Type definition for custom storage class: Struct */
   typedef struct my_struct_tag {
      real_T p1;
      real_T p2;
      real_T p3;
   } my_struct_type;

文件 ex_struct_param.c 定义全局变量 my_struct

/* Definition for custom storage class: Struct */
my_struct_type my_struct = {
     /* p1 */
     1.0,

     /* p2 */
     2.0,

     /* p3 */
     3.0
};

以编程方式配置参数的代码生成设置

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

此示例说明如何为模型 ConfigurationInterface 配置模型参数和模型参数参量的默认设置。配置模型参数,使其可调并在生成代码中定义和声明为具有类型限定符 constvolatile的单独全局变量。将模型参数参量配置为使用默认设置,其中代码生成器为每个参量实例分配一个内存区域,该区域表示为导出的结构体中的一个唯一命名字段。将模型参数的默认存储类设置应用于参数 K1Table1Table2。为这些参数配置代码标识符。

  1. 打开示例模型。

    openExample("ConfigurationInterface")
    
  2. 将模型配置参数默认参数行为设置为可调

    model = "ConfigurationInterface";
    set_param(model,"DefaultParameterBehavior","Tunable");
    
  3. 通过调用函数 coder.mapping.api.get 创建对象 cm。该对象存储模型 ConfigurationInterface 中数据元素和函数的代码生成配置。

    cm = coder.mapping.api.get("ConfigurationInterface");
    
  4. 通过调用函数 setDataDefault,配置模型参数的默认设置。对于参量,请指定以下值:

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

    • ModelParameters 作为默认类别

    • 属性名称 StorageClass,属性值 ConstVolatile

    setDataDefault(cm,"ModelParameters","StorageClass","ConstVolatile");
    
  5. 配置模型参数参量的默认设置。在对 setDataDefault 的调用中,为参量指定以下值:

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

    • ModelParameterArguments 作为默认类别。

    • 属性名称 StorageClass,属性值 Default

    setDataDefault(cm,"ModelParameterArguments","StorageClass","Default");
    
  6. 验证模型参数和模型参数参量的默认配置。发出对 getDataDefault 的调用,这些调用指定由 coder.mapping.api.get 返回的对象、类别 ModelParametersModelParameterArguments,以及 StorageClass

    getDataDefault(cm,"ModelParameters","StorageClass")
    
    ans =
    
        'ConstVolatile'
    
    getDataDefault(cm,"ModelParameterArguments","StorageClass")
    
    ans =
    
        'Default'
    
  7. 将模型参数的默认配置应用于参数 K1Table1Table2

    默认情况下,Simulink 将单个参数的存储类设置为 Auto。当存储类为 Auto 时,代码生成器将:

    • 确定是否出于优化目的从生成的代码中消除数据。

    • 如果保留数据,则确定如何在生成代码中高效地表示数据,同时考虑默认配置设置。

    配置代码生成器,以将默认模型参数设置应用于参数 K1Table1Table2。对于每个参数,调用函数 setModelParameter。指定由 coder.mapping.api.get 返回的对象、参数名称、属性名称 StorageClass 和属性值 Model default

    setModelParameter(cm,"K1","StorageClass","Model default");
    setModelParameter(cm,"Table1","StorageClass","Model default");
    setModelParameter(cm,"Table2","StorageClass","Model default");
    
  8. 通过调用函数 getModelParameter,验证您对参数 K1Table1Table2 的配置更改。

    getModelParameter(cm,"K1","StorageClass")
    
    ans =
    
        'Model default'
    
    getModelParameter(cm,"Table1","StorageClass")
    
    ans =
    
        'Model default'
    
    getModelParameter(cm,"Table2","StorageClass")
    
    ans =
    
        'Model default'
    
  9. 为模型参数配置代码标识符。对于每个参数,调用函数 setModelParameter。指定由 coder.mapping.api.get 返回的对象、参数名称、属性名称 Identifier 以及下列属性值之一。

    模型参数代码标识符
    K1mp_K1
    Table1mp_Table1
    Table2mp_Table2
    setModelParameter(cm,"K1","Identifier","mp_K1");
    setModelParameter(cm,"Table1","Identifier","mp_Table1");
    setModelParameter(cm,"Table2","Identifier","mp_Table2");
    
  10. 通过调用函数 getModelParameter,验证您对模型参数的配置更改。

    getModelParameter(cm,"K1","Identifier")
    
    ans =
    
        'mp_K1'
    
    getModelParameter(cm,"Table1","Identifier")
    
    ans =
    
        'mp_Table1'
    
    getModelParameter(cm,"Table2","Identifier")
    
    ans =
    
        'mp_Table2'
    
  11. 保存模型。

  12. 生成并查看代码。例如,在 ConfigurationInterface.c 中查找模型参数 mp_K1 的数据定义。

    const volatile int8_T mp_K1 = 2; 
    

    查找参数在单步入口函数中的使用位置。

    if (mode) {
        output = (real_T)mp_K1 * dout_Table1;
      } else {
        output = dstate_X;
      }
    

为模型参数选择存储类和存储类属性

根据您的代码生成要求,从可用存储类的列表中进行选择,为模型参数配置代码生成。存储类列表在代码生成器字典中定义。

注意

  • 对于常量,仅默认存储类适用。

  • 对于模型参数参量,仅自动默认模型默认多实例字典默认值(使用共享数据字典时)存储类适用。

要求默认映射的存储类单个映射的存储类
启用优化,以便能生成更高效的代码。 Auto
对于无法优化的数据元素,将数据表示为标准数据结构体的一个字段。Default 
防止优化消除数据元素的存储,并使用数据元素类别的默认映射。 Model Default
使用共享代码生成器字典时,为您不希望代码生成器优化的数据元素选择字典默认值。Dictionary Default 
生成在指定位域中存储布尔、定点或整数数据的结构体。 Bitfield
支持通过使用编译器标志或选项定义的预处理器条件句。CompilerFlag CompilerFlag
生成具有 constvolatileconstvolatile 类型限定符的全局变量定义和声明。Const, Volatile, and ConstVolatileConst, Volatile, and ConstVolatile
生成宏(#define 指令)或使用在外部代码的头文件中定义的宏的代码。Define, ImportedDefineDefine, ImportedDefine
生成全局变量定义和声明。ExportedGlobalExportedGlobal
为指定文件生成全局变量定义和声明。ExportToFileExportToFile
生成具有 static 类型限定符的全局变量定义和声明。FileScope(仅限局部和共享局部数据存储映射)FileScope(仅限局部和共享局部数据存储映射)
通过调用自定义访问器函数生成与数据交互的代码。GetSetGetSet
生成可读写在外部代码中定义的全局变量或全局变量指针的代码。ImportedExtern, ImportedExternPointerImportedExtern, ImportedExternPointer
生成可读写在外部头文件中定义的全局变量的代码。ImportFromFileImportFromFile
生成可指定名称的全局结构体。 Struct
为单实例数据生成变量,为多实例数据生成结构体。MultiInstance(外部参数不支持)MultiInstance(外部参数不支持)

可用存储类的列表可能包括在 Embedded Coder 字典中定义的其他工程特定存储类。如果您有列出的存储类不能满足的特殊要求,并且您有 Embedded Coder 软件,您可以定义存储类。请参阅Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architecture

对于单个模型参数,使用标识符存储类属性来配置在生成代码中表示参数的变量的名称。使用 Embedded Coder,根据您选择的存储类,您还可以配置下列属性。

属性描述存储类
DefinitionFile包含全局数据定义的源定义文件,由参数和外部代码读取ExportToFileVolatile
GetFunction参数在生成代码中表示为对指定的 get 函数的调用GetSet
HeaderFile包含全局数据声明的源头文件,由参数和外部代码读取ExportToFileGetSetImportFromFileVolatile
Memory Section(仅限默认参数配置)包含由参数读取的数据的内存段Default
Owner代码生成器将参数定义放在为模型层次结构中共享定义的多个模型之一生成的代码中。您必须选择模型配置参数使用数据对象的所有者信息来确定数据定义的放置。请参阅Control Placement of Global Data Definitions and Declarations in Generated FilesExportToFileVolatile
PreserveDimensions代码生成器保留参数数据的维度,这些参数数据在生成代码中表示为一个多维数组。您必须将模型配置参数数组布局设置为行优先。请参阅Preserve Dimensions of Multidimensional Arrays in Generated CodeExportToFileFileScopeGetSetImportFromFileLocalizableVolatile
SetFunction参数在生成代码中显示为对指定的 set 函数的调用。GetSet
StructName参数在生成代码中的对应结构体的名称。BitFieldStruct

另请参阅

|

相关主题