Main Content

为 C 代码生成配置参数

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

参数的类型描述
模型参数在模型中定义的参数,例如模型工作区中的参数。
外部参数在基础工作区或数据字典中定义为对象的参数。

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

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

将参数数据配置为:

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

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

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

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

要控制整个模型中的参数是否可调,您可以使用 Code Mappings 编辑器的 Data Defaults 选项卡上的 'Auto' will be tunable/inline 链接来获得对模型配置参数 Default parameter behavior 的访问权限。例如,在以下情况下,您可以使用该链接使参数可调:

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

  • 标定参数

  • 为生产代码优化参数

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

选择参数的自定义选项

默认情况下,模型中的参数在生成的代码中显示为名为 model_P 的全局数据结构体的字段。根据您的代码接口要求,决定是否自定义参数数据的生成。如果不配置自定义,代码生成器将出于优化目的确定是消除还是更改生成代码中的参数表示。如果您配置自定义,请决定:

  • 是否设置默认配置

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

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

    • 作为单独的全局变量

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

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

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

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

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

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

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

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

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

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

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

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

此示例说明如何使用 Code Mappings 编辑器 - C 为模型 rtwdemo_configrpinterface 配置模型参数的默认设置。配置模型参数,使其可调并在生成代码中定义和声明为单独全局变量。

  1. 打开模型 rtwdemo_configrpinterface。将模型的副本保存到可写位置。

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

  2. 打开 Simulink Coder

  3. C Code 选项卡中,选择 Code Interface > Default Code Mappings

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

  5. 在 Model Configuration Parameters 对话框中,将模型配置参数 Default parameter behavior 设置为 “Tunable”。保存更改并关闭对话框。在 Code Mappings 编辑器中,链接文本更改为 'Auto' will be tunable

  6. 在 Code Mappings 中,在 Model parameters 类别仍处于选中状态下,将存储类设置为 “ExportedGlobal”。

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

  7. 保存模型。

为单个参数配置代码生成

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

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

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

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

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

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

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

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

    • 要避免优化并强制代码生成器使用默认配置,请将存储类设置为 “Model default”。

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

  3. 在 Code Mappings 编辑器中的 Model Parameters 下,选择参数 K1Table1Table2。将存储类设置为 “Model default:ExportedGlobal”。

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

  4. 使用包含前缀 mp_ 的名称配置模型参数的代码标识符。在 Code Mappings 编辑器中,选择模型参数 K1。点击 Icon to configure additional code mapping properties 图标,并将存储类属性 Identifier 设置为 mp_K1。对于参数 Table1Table2,将 Identifier 设置为 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_Table2D.

  5. 保存模型。

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

    int8_T mp_K1 = 2;                       
    

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

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

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

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

此示例说明如何为模型 rtwdemo_configrpinterface 的模型参数配置默认设置。配置模型参数,使其可调并在生成代码中定义和声明为单独全局变量。将模型参数的默认存储类设置应用于参数 K1Table1Table2。为这些参数配置代码标识符。

  1. 打开示例模型。

    open_system('rtwdemo_configrpinterface')
    
  2. 将模型配置参数 Default parameter behavior 设置为 “Tunable”。

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

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

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

    • ModelParameters 作为默认类别

    • 属性名称 StorageClass,属性值 ExportedGlobal

    setDataDefault(cm,'ModelParameters','StorageClass','ExportedGlobal');
  5. 验证模型参数的默认配置。发出对 getDataDefault 的调用,这些调用指定由 coder.mapping.api.get 返回的对象、类别 ModelParametersStorageClass

    getDataDefault(cm,'ModelParameters','StorageClass')
    
    ans =
    
        'ExportedGlobal'
    
  6. 将模型参数的默认配置应用于参数 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');
    
  7. 通过调用函数 getModelParameter,验证您对参数 K1Table1Table2 的配置更改。

    getModelParameter(cm,'K1','StorageClass')
    
    ans =
    
        'Model default'
    
    getModelParameter(cm,'Table1','StorageClass')
    
    ans =
    
        'Model default'
    
    
    getModelParameter(cm,'Table2','StorageClass')
    
    ans =
    
        'Model default'
  8. 为模型参数配置代码标识符。对于每个参数,调用函数 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');
    
  9. 通过调用函数 getModelParameter,验证您对模型参数的配置更改。

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

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

    int8_T mp_K1 = 2;                       
    

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

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

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

根据您的代码生成要求,从这些存储类中进行选择,为模型参数配置代码生成。对于常量,仅 “Default” 适用。对于模型实参,仅 “Auto”、“Default” 和 “Model default” 适用。

要求Storage Class
启用优化,以便能生成更高效的代码。Auto(仅限单个映射)
对于无法优化的数据元素,将数据表示为标准数据结构体的一个字段。Default(仅限默认映射)
防止优化消除数据元素的存储,并使用数据元素类别的默认映射。Model Default(仅限单个映射)、Dictionary Default(仅限单个映射)
生成全局变量定义和声明。ExportedGlobal
生成可读写在外部代码中定义的全局变量或全局变量指针的代码。ImportedExtern, ImportedExternPointer

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

对于单个模型参数,使用 Identifier 存储类属性来配置在生成代码中表示参数的变量的名称。

另请参阅

|

相关主题