为 C 代码生成配置参数
为代码生成配置模型时,您可以标识和配置参数以支持调整,例如标定。下表列出了您可以配置的参数的类型。
参数的类型 | 描述 |
---|---|
模型参数 | 在模型中定义的参数,例如模型工作区中的参数。 |
外部参数 | 在基础工作区或数据字典中定义为对象的参数。 |
要为代码生成配置一个参数,必须将该参数与一个数据对象相关联。例如,在为代码生成配置 MATLAB 变量之前,在模型资源管理器中,将变量转换为参数对象。
当您在 Simulink Coder 中打开模型时,与数据对象相关联的模型参数会出现在代码映射编辑器中。在该编辑器中,您可以为代码生成配置这些参数。如果模型使用外部参数,您可以通过点击参数名称右侧的 Refresh
链接将这些参数添加到代码映射编辑器中。该链接启动更新图,并在编辑器视图中添加模型使用的外部参数。
将参数数据配置为:
在生成的代码执行时,可访问数据以进行交互。
最小化存储在内存中的数据量。
将参数数据提升到模型接口,以便其他组件和系统可以访问这些数据。
提高生成代码的可读性和可追溯性。
要控制整个模型中的参数是否可调,您可以使用代码映射编辑器的数据默认值选项卡上的 'Auto' will be tunable/inline
链接来获得对模型配置参数默认参数行为的访问权限。例如,在以下情况下,您可以使用该链接使参数可调:
在快速原型过程中细化参数设置
标定参数
为生产代码优化参数
对于代码生成,示例说明如何为模型 ConfigurationRapidPrototypingInterface
配置模型参数和模型参数参量。您可以使用代码映射编辑器 - C 或代码映射编程接口 (coder.mapping.api.CodeMapping
) 来配置代码映射。
选择参数的自定义选项
默认情况下,模型中的参数在生成的代码中显示为名为
的全局数据结构体的字段。根据您的代码接口要求,决定是否自定义参数数据的生成。如果不配置自定义,代码生成器将出于优化目的确定是消除还是更改生成代码中的参数表示。如果您配置自定义,请决定:model
_P
是否设置默认配置
如果一个模型包含大量必须可调的类别参数(例如,超过 10 个),则更高效的方式是使用默认设置配置该类别的参数,然后在特殊情况下覆盖该设置。如果模型包括一个给定类别的若干元素,且这些元素具有不同源、命名或位置要求,请考虑单独配置这些参数。
如何在生成的代码中声明和处理模型参数数据
作为单独的全局变量
从在外部代码中定义的全局变量读取模型参数数据
作为对访问函数的调用。需要 Embedded Coder®
有关这些选项的详细信息,请参阅Control Data and Function Interface in Generated Code。
模型参数的其他考虑事项包括是否要进行以下操作:
通过使用模型中的参数名称或使用唯一代码标识符来命名生成代码中的参数。
支持由编译器标志或选项定义的预处理器条件句。需要 Embedded Coder。请参阅Compile Code Conditionally for Variations of Component Represented Using Variant Block。
在全局变量定义和声明中包含
static
类型限定符(例如,用于防止名称冲突)。需要 Embedded Coder。请参阅Prevent Name Clashes by Configuring Data Item as static (Embedded Coder)。在全局变量定义和声明中包含
const
、volatile
或const
和volatile
类型限定符。需要 Embedded Coder。请参阅Protect Global Data with const and volatile Type Qualifiers (Embedded Coder)。生成宏 (
#define
) 或使用在外部头文件中定义的宏的代码。需要 Embedded Coder。请参阅宏定义 (#define) (Embedded Coder)。使用您指定的名称生成全局数据结构体。需要 Embedded Coder。请参阅Organize Data into Structures in Generated Code (Embedded Coder)。
将参数数据放入内存的特定区域。需要 Embedded Coder。请参阅Control Data and Function Placement in Memory by Inserting Pragmas (Embedded Coder)。
要了解具有对应存储类和存储类属性的参数的接口要求,请参阅Choose Storage Class and Storage Class Properties for Data Stores。
示例模型 ConfigurationRapidPrototypingInterface
的参数要求是:
默认情况下,在生成的代码中保留模型参数以用于调整。不要通过内联参数来优化代码。
将前缀
mp_
应用于表示模型参数的变量的名称。
对于此示例,请在 ConfigurationRapidPrototypingInterface
中配置模型参数,以满足这些代码生成要求。
为参数配置默认代码生成设置
参数的默认代码生成设置可以减少为代码生成准备模型的工作量,特别是在模型有大量参数且您在生成代码执行时需要与之交互的情况下。选择一次配置设置,代码生成器即会将这些设置应用于整个模型中的参数。Simulink® 将默认配置存储为模型的一部分。
如果您的模型使用同一类别的多个参数且这些参数没有唯一性要求,请考虑为模型参数配置默认代码生成设置。
此示例说明如何使用代码映射编辑器 - C 为模型 ConfigurationRapidPrototypingInterface
配置模型参数的默认设置。配置模型参数,使其可调并在生成代码中定义和声明为单独全局变量。
打开模型
ConfigurationRapidPrototypingInterface
。openExample("ConfigurationRapidPrototypingInterface")
打开 Simulink Coder。
在 C 代码选项卡中,选择代码接口 > 默认代码映射。
在代码映射编辑器中的参数下,选择模型参数类别。链接文本
'Auto' will be inlined
指示代码生成器默认配置为内联模型参数。此示例的一个要求是模型参数是可调的。点击'Auto' will be inlined
。在“模型配置参数”对话框中,将模型配置参数默认参数行为设置为可调。保存更改并关闭对话框。在代码映射编辑器中,链接文本更改为
'Auto' will be tunable
。在代码映射编辑器中,在模型参数类别仍处于选中状态下,将存储类设置为 ExportedGlobal。
保存模型。
为单个参数配置代码生成
您可以为单个参数配置代码生成。例如,如果模型有属于同一类别的两个参数,且这两个参数具有不同的代码生成要求,请单独配置这些参数。或者,如果您为一类参数配置了默认设置,则可以覆盖特定参数的那些设置。
如果您的模型满足下列中的至少一个标准,请考虑为参数单独配置代码生成设置:
使用属于同一类别的多个参数,且这些参数具有不同源、命名或位置要求。
使用属于同一类别的若干参数。
某一类参数具有默认配置,您需要覆盖某些特定参数的该配置。
此示例说明如何使用代码映射编辑器将模型参数的默认存储类设置应用于模型 ConfigurationInterface
中的参数 K1
、Table1
和 Table2
。为这些参数配置代码标识符。您可以指定代码生成标识符(例如用于集成),而无需修改模型设计。
如果您尚未这样做,请完成为参数配置默认代码生成设置中的步骤。
展开模型参数。默认情况下,每个参数的存储类都设置为
Auto
。使用模型默认配置,该配置指定存储类ExportedGlobal
。要避免优化并强制代码生成器使用默认配置,请将存储类设置为模型默认值。
要覆盖默认配置,请指定满足该参数的代码生成要求的存储类。
在代码映射编辑器中的模型参数下,选择参数
K1
、Table1
和Table2
。将存储类设置为模型默认:ExportedGlobal。使用包含前缀
mp_
的名称配置模型参数的代码标识符。在代码映射编辑器中,选择模型参数K1
。点击 图标,并将存储类属性标识符设置为mp_K1
。对于参数Table1
和Table2
,将标识符设置为mp_Table1
和mp_Table2
。保存模型。
生成并查看代码。例如,在
ConfigurationRapidPrototypingInterface.c
中查找模型参数mp_K1
的数据定义。int8_T mp_K1 = 2;
查找参数在单步入口函数中的使用位置。
if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; }
以编程方式配置参数的代码生成设置
要自动化配置参数的代码生成,请使用代码映射的编程接口。例如,当创建自定义模块库或应用程序测试环境的一部分时,可使用编程接口来自动化数据配置。
此示例说明如何为模型 ConfigurationRapidPrototypingInterface
的模型参数配置默认设置。配置模型参数,使其可调并在生成代码中定义和声明为单独全局变量。将模型参数的默认存储类设置应用于参数 K1
、Table1
和 Table2
。为这些参数配置代码标识符。
打开示例模型。
openExample("ConfigurationRapidPrototypingInterface")
将模型配置参数默认参数行为设置为可调。
model = "ConfigurationRapidPrototypingInterface"; set_param(model,"DefaultParameterBehavior","Tunable");
通过调用函数
coder.mapping.api.get
创建对象cm
。该对象存储模型ConfigurationRapidPrototypingInterface
中数据元素的代码生成配置。cm = coder.mapping.api.get("ConfigurationRapidPrototypingInterface");
通过调用函数
setDataDefault
,配置模型参数的默认设置。对于参量,请指定以下值:coder.mapping.api.get
返回的对象ModelParameters
作为默认类别属性名称
StorageClass
,属性值ExportedGlobal
。
setDataDefault(cm,"ModelParameters","StorageClass","ExportedGlobal");
验证模型参数的默认配置。发出对
getDataDefault
的调用,这些调用指定由coder.mapping.api.get
返回的对象、类别ModelParameters
和StorageClass
。getDataDefault(cm,"ModelParameters","StorageClass")
ans = 'ExportedGlobal'
将模型参数的默认配置应用于参数
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");
通过调用函数
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'
为模型参数配置代码标识符。对于每个参数,调用函数
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");
通过调用函数
getModelParameter
,验证您对模型参数的配置更改。getModelParameter(cm,"K1","Identifier")
ans = 'mp_K1'
getModelParameter(cm,"Table1","Identifier")
ans = 'mp_Table1'
getModelParameter(cm,"Table2","Identifier")
ans = 'mp_Table2'
保存模型。
生成并查看代码。例如,在
ConfigurationRapidPrototypingInterface.c
中查找模型参数mp_K1
的数据定义。int8_T mp_K1 = 2;
查找参数在单步入口函数中的使用位置。
if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; }
为模型参数选择存储类和存储类属性
根据您的代码生成要求,从可用存储类的列表中进行选择,为模型参数配置代码生成。
注意
对于常量,仅默认存储类适用。
对于模型参数参量,仅自动、默认和模型默认值存储类适用。
要求 | 默认映射的存储类 | 单个映射的存储类 |
---|---|---|
启用优化,以便能生成更高效的代码。 | Auto | |
对于无法优化的数据元素,将数据表示为标准数据结构体的一个字段。 | Default | |
防止优化消除数据元素的存储,并使用数据元素类别的默认映射。 | Model Default | |
生成全局变量定义和声明。 | ExportedGlobal | ExportedGlobal |
生成可读写在外部代码中定义的全局变量或全局变量指针的代码。 | ImportedExtern, ImportedExternPointer | ImportedExtern, ImportedExternPointer |
可用存储类的列表可能包括在 Embedded Coder 字典中定义的其他工程特定存储类。如果您有列出的存储类不能满足的特殊要求,并且您有 Embedded Coder 软件,您可以定义存储类。请参阅Define Service Interfaces, Storage Classes, Memory Sections, and Function Templates for Software Architecture (Embedded Coder)。
对于单个模型参数,使用 Identifier 存储类属性来配置在生成代码中表示参数的变量的名称。
另请参阅
代码映射编辑器 - C | coder.mapping.api.CodeMapping