为 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®

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

  • 通过使用模型中的参数名称或使用唯一代码标识符来命名生成代码中的参数。

  • 支持由编译器标志或选项定义的预处理器条件句。需要 Embedded Coder。

  • 在全局变量定义和声明中包含 static 类型限定符(例如,用于防止名称冲突)。需要 Embedded Coder。

  • 在全局变量定义和声明中包含 const、volatile 或 const 和 volatile 类型限定符。需要 Embedded Coder。

  • 生成宏 (#define) 或使用在外部头文件中定义的宏的代码。需要 Embedded Coder。

  • 使用指定的名称生成全局数据结构体。需要 Embedded Coder。

  • 将参数数据放入内存的特定区域。需要 Embedded Coder。

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

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

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

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

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

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

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

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

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

  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”。

  7. 保存模型。

为单个参数配置代码生成

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

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

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

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

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

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

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

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

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

    要避免优化并强制代码生成器使用默认配置,请将存储类设置为 “Model default”。要覆盖默认配置,请指定满足该参数的代码生成要求的存储类。
  4. 在 Code Mappings 编辑器中的 Model Parameters 下,选择参数K1、Table1 和 Table2。将存储类设置为 “Model default:ExportedGlobal”。

  5. 使用包含前缀 mp_ 的名称配置模型参数的代码标识符。在 Code Mappings 编辑器中,选择模型参数 K1。点击 

    图标,并将存储类属性 Identifier 设置为 mp_K1。对于参数 Table1 和 Table2,将 Identifier 设置为 mp_Table1 和 mp_Table2。

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

const volatile int8_T mp_K1 = 2; 

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

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

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

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

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

  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 返回的对象、类别 ModelParameters 和 StorageClass。

    getDataDefault(cm,'ModelParameters','StorageClass')
    
    ans =
    
        'ExportedGlobal'
  6. 将模型参数的默认配置应用于参数 K1、Table1 和 Table2。

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

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

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

    配置代码生成器,以将默认模型参数设置应用于参数 K1、Table1 和 Table2。对于每个参数,调用函数 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,验证您对参数 K1、Table1 和 Table2 的配置更改。

    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 以及下列属性值之一。

    模型参数 代码标识符
    K1 mp_K1
    Table1 mp_Table1
    Table2 mp_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 软件,可以定义存储类。

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

猜你喜欢

转载自blog.csdn.net/jk_101/article/details/127356990