为 C 代码生成配置模型数据接口
要将生成代码与外部代码集成,或生成符合编码标准和规范的代码,您可以配置模型中的数据元素(如模块参数和信号线)在生成代码中的显示方式。您可以使用代码映射编辑器或代码映射 API 为数据元素类别配置默认代码生成设置,并配置单个元素。例如,您可以配置控制声明和定义在生成的文件和外部(导出和导入的)文件中的放置位置,以及表示所生成代码中数据元素的变量命名的设置。
此示例说明如何为示例模型 ConfigurationRapidPrototypingInterface 的代码生成配置数据元素。
浏览模型示例
打开示例模型 ConfigurationRapidPrototypingInterface。
model = 'ConfigurationRapidPrototypingInterface';
open_system(model)
此示例说明如何为代码生成配置以下模型数据元素:
Inport模块In1、In2、In3和In4Outport模块Out1模型参数
K1、Table1和Table2局部数据存储
mode源自查找表模块
Table1和Table2的信号线状态
X(延迟)
为 Inport 模块配置默认设置
打开 Simulink Coder。
在 C 代码选项卡中,选择代码接口 > 默认代码映射。
在代码映射编辑器中的输入端口和输出端口下,选择输入端口类别。将默认存储类设置为
ImportedExternPointer。
为 Outport 模块配置默认设置
在数据默认值选项卡上的输入端口和输出端口下,选择输出端口类别。将默认存储类设置为 ExportedGlobal。
为参数配置默认设置
在数据默认值选项卡上的参数下,选择类别模型参数。链接文本
'Auto' will be inlined指示代码生成器默认配置为内联模型参数。在此示例中,将模型参数配置为可调。点击'Auto' will be inlined。“模型配置参数”对话框将打开。将模型配置参数默认参数行为设置为
Tunable。保存更改并关闭对话框。在代码映射编辑器中,链接文本更改为'Auto' will be tunable。在代码映射编辑器中,在模型参数类别处于选中状态下,将存储类设置为
ExportedGlobal。
配置信号、状态和数据存储的默认设置
在数据默认值选项卡上的信号下,选择信号、状态和内部数据类别。将默认存储类设置为
ExportedGlobal。为共享局部数据存储配置默认代码映射。选择类别共享局部数据存储。将存储类设置为
ExportedGlobal。保存模型。
为各个 Inport 模块配置代码生成设置
在代码映射编辑器中,点击输入端口选项卡。编辑器列出模型中根级
Inport和In Bus Element模块的名称。如果端口解析为信号对象,则“解析为信号对象”图标会出现在元素名称的右侧。每个输入端口的存储类设置为Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。如果无法进行优化,代码生成器将应用模型默认配置。在此示例中,模型默认配置指定存储类ImportedExternPointer。要避免优化并强制代码生成器使用默认配置,请将存储类设置为Model default。要覆盖默认配置,请指定满足该输入端口的代码生成要求的存储类。配置代码生成器以将默认存储类设置应用于输入端口
In2、In3和In4。选择三个输入端口对应的行。然后,对于其中一个所选输入端口,将存储类设置为Model default: ImportedExternPointer。三个所选输入端口的存储类更改为Model default: ImportedExternPointer。对于输入端口
In1,覆盖默认存储类设置。将存储类设置为 ImportedExtern。为输入端口配置代码标识符,以便生成代码中的变量与外部头文件和定义文件中的接口名称相匹配。在代码映射编辑器中,选择每个输入端口对应的行。在属性检查器中,将标识符属性设置为下列值:
input1、input2、input3和input4。
为单个输出端口配置代码生成设置
在代码映射编辑器中,点击输出端口选项卡。编辑器列出模型中根级
Outport和Out Bus Element模块和总线元素的名称。如果端口解析为信号对象,则“解析为信号对象”图标会出现在元素名称的右侧。示例模型中输出端口的存储类设置为Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。要避免优化并强制代码生成器使用默认配置,请将存储类设置为
ExportedGlobal。所选输出端口的存储类更改为Model default: ExportedGlobal。为输出端口配置代码标识符,以便生成代码中的变量与外部代码使用的接口名称相匹配。在代码映射编辑器中,选择输出端口对应的行。在属性检查器中,将标识符属性设置为
output。
为单个参数配置代码生成设置
在代码映射编辑器中,点击参数选项卡。展开模型参数参量。默认情况下,每个模型参数参量的存储类都设置为
Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。如果无法进行优化,代码生成器将应用模型默认配置。在此示例中,将存储类设置保留为Auto。展开模型参数。默认情况下,每个模型参数的存储类设置为
Auto。在此示例中,您要避免优化,并希望代码生成器使用默认存储类设置,即ExportedGlobal。在代码映射编辑器中的模型参数下,选择参数
K1、Table1和Table2。将存储类设置为Model default: ExportedGlobal。根据要求将模型参数的代码标识符配置为包含前缀
mp_的名称在代码映射编辑器中,选择模型参数K1。在属性检查器中,展开代码节点。将存储类属性标识符设置为mp_K1。对于参数Table1和Table2,将标识符设置为mp_Table1和mp_Table2。
为单个数据存储配置代码生成设置
在代码映射编辑器中,点击数据存储选项卡。展开局部数据存储。数据存储模式的存储类设置为“自动”,这意味着代码生成器可能会出于优化目的而消除相关代码。在此示例中,您要避免优化,并希望代码生成器使用默认存储类设置,即
ExportedGlobal。在代码映射编辑器中,选择局部数据存储
mode。将存储类设置为Model default: ExportedGlobal。将数据存储的代码标识符配置为包含前缀
ds_的名称。在代码映射编辑器中,选择共享局部数据存储mode。在属性检查器中,展开代码节点。将存储类属性标识符设置为ds_mode。
为各个状态配置代码生成设置
在代码映射编辑器中,点击信号/状态选项卡。展开状态。状态的存储类设置为
Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。在此示例中,您要避免优化,并希望代码生成器使用默认存储类设置,即ExportedGlobal。在代码映射编辑器中,选择状态
X。将存储类设置为Model default: ExportedGlobal。按照要求将状态的代码标识符配置为包含前缀
dstate_的名称。在代码映射编辑器中,选择状态X。在属性检查器中,展开代码节点。然后,将存储类属性标识符设置为dstate_X。
为各个信号配置代码生成设置
将您要配置的信号添加到模型代码映射中。在此示例中,要将两个查找表模块的输出信号添加到模型代码映射中。然后,配置那些信号。
在代码映射编辑器中,点击信号/状态选项卡。未列出任何信号。
将信号添加到代码映射。对于查找表模块
Table1和Table2的输出信号,请在模型中选择一个信号,在信号线上方或下方出现的省略号上暂停以打开操作栏,然后点击添加信号按钮。在代码映射编辑器中,信号节点会展开并列出您添加的两个信号的名称或模块标识符。如果信号解析为信号对象,则“解析为信号对象”图标会出现在元素名称或端口标识符的右侧。每个信号的存储类设置为Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。在此示例中,您要避免优化,并希望代码生成器使用默认存储类设置,即ExportedGlobal。在代码映射编辑器中,选择模块
Table1和Table2的输出信号。将存储类设置为Model default: ExportedGlobal。将两个查找表模块的输出信号的代码标识符配置为包含前缀
dout的名称。在代码映射编辑器中,选择信号Table1:1。在属性检查器中,展开代码节点。将存储类属性标识符设置为dout_Table1。对于信号Table2:1,将标识符设置为dout_Table2。保存模型。
以编程方式为代码生成配置数据
或者,使用代码映射 API 以编程方式配置模型数据元素。
1.通过调用 coder.mapping.api.get,获取表示模型的代码映射的对象。您可以将返回的对象指定为对代码映射函数的后续调用中的第一个参量。
cm = coder.mapping.api.get(model);
2.通过调用 setDataDefaults,为各类数据元素配置默认代码生成设置。在每个调用中,包括调用 coder.mapping.api.get 所返回的对象、数据元素类别的名称以及指定存储类和存储类属性的名称-值对组参量。使用 setDataDefaults 配置以下默认设置:
具有存储类
ImportedExternPointer的Inport模块具有存储类
ExportedGlobal的Outport模块模型参数配置为使用存储类
ExportedGlobal内部数据(信号、状态和局部数据存储)配置为使用存储类
ExportedGlobal具有存储类
ExportedGlobal的共享局部数据存储
setDataDefault(cm,'Inports','StorageClass','ImportedExternPointer'); setDataDefault(cm,'Outports','StorageClass','ExportedGlobal'); setDataDefault(cm,'ModelParameters','StorageClass','ExportedGlobal'); setDataDefault(cm,'InternalData','StorageClass','ExportedGlobal'); setDataDefault(cm,'SharedLocalDataStore','StorageClass','ExportedGlobal');
将模型配置参数 DefaultParameterBehavior 设置为 Tunable,以便在程序执行期间可以访问模型参数。
set_param(model,'DefaultParameterBehavior','Tunable');
3.通过调用 setInport 配置单个输入端口。为避免优化,请将输入端口的默认配置应用于 In2、In3 和 In4。对于 In1,通过将存储类设置为 ImportedExtern 来覆盖默认配置。此外,为输入端口配置代码标识符,以便在生成代码中表示输入端口的全局变量与外部定义文件中的变量名称相匹配。在对 setInport 的每次调用中,指定 coder.mapping.api.get 返回的对象、Inport 模块名称以及存储类和属性设置的名称-值对组参量。
setInport(cm,'In1','StorageClass','ImportedExtern','Identifier','Input1'); setInport(cm,'In2','StorageClass','Model default','Identifier','Input2'); setInport(cm,'In3','StorageClass','Model default','Identifier','Input3'); setInport(cm,'In4','StorageClass','Model default','Identifier','Input4');
4.通过调用 Out1,为 Outport 模块 setOutport 配置单个数据元素设置。要避免优化,请应用默认配置。此外,为输出端口配置代码标识符。在对 setOutport 的调用中,指定 coder.mapping.api.get 返回的对象、Outport 模块名称以及存储类和代码标识符属性设置的名称-值对组参量。
setOutport(cm,'Out1','StorageClass','Model default','Identifier','output');
5.通过调用 setModelParameter 来配置单个模型参数。要避免优化,请应用默认配置。此外,为参数配置代码标识符。在对 setModelParameter 的每次调用中,指定 coder.mapping.api.get 返回的对象、参数名称以及存储类和代码标识符属性设置的名称-值对组参量。
setModelParameter(cm,'K1','StorageClass','Model default','Identifier','mp_K1'); setModelParameter(cm,'Table1','StorageClass','Model default','Identifier','mp_Table1'); setModelParameter(cm,'Table2','StorageClass','Model default','Identifier','mp_Table2');
6.通过调用 setDataStore,为局部数据存储 mode 配置单个数据元素设置。要避免优化,请应用默认配置。此外,为数据存储配置代码标识符。在对 setDataStore 的调用中,指定 coder.mapping.api.get 返回的对象、数据存储名称以及存储类和代码标识符属性设置的名称-值对组参量。
setDataStore(cm,'mode','StorageClass','Model default','Identifier','ds_mode');
7.通过调用 setState,为状态 X 配置单个数据元素设置。要避免优化,请应用默认配置。此外,为状态配置代码标识符。在对 setState 的调用中,指定 coder.mapping.api.get 返回的对象、使用状态的模块的路径以及存储类和代码标识符属性设置的名称-值对组参量。
setState(cm,'ConfigurationRapidPrototypingInterface/Delay','StorageClass','Model default',... 'Identifier','dstate_X');
8.向代码映射添加信号,并通过调用 setSignal 来配置它们。要添加端口句柄,请通过调用 get_param 将信号数据添加到模型代码映射。然后,在对 addSignals 的调用中指定模块句柄。要避免优化,请对信号应用默认配置。此外,为信号配置代码标识符。在对 setSignal 的每次调用中,指定 coder.mapping.api.get 返回的对象、信号源的路径或模块句柄,以及存储类和代码标识符属性设置的名称-值对组参量。
lut1D_ports = get_param('ConfigurationRapidPrototypingInterface/Table1','PortHandles'); lut2D_ports = get_param('ConfigurationRapidPrototypingInterface/Table2','PortHandles'); lut1D_outPort = lut1D_ports.Outport; lut2D_outPort = lut2D_ports.Outport; addSignal(cm,[lut1D_outPort,lut2D_outPort]); setSignal(cm,lut1D_outPort,'StorageClass','Model default','Identifier','dout_Table1'); setSignal(cm,lut2D_outPort,'StorageClass','Model default','Identifier','dout_Table2');
生成和查看代码
1.生成代码。
slbuild(model)
### Searching for referenced models in model 'ConfigurationRapidPrototypingInterface'. ### Total of 1 models to build. ### Starting build procedure for: ConfigurationRapidPrototypingInterface ### Successful completion of code generation for: ConfigurationRapidPrototypingInterface Build Summary Top model targets: Model Build Reason Status Build Duration ============================================================================================================================ ConfigurationRapidPrototypingInterface Information cache folder or artifacts were missing. Code generated. 0h 0m 7.8154s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 8.4234s
2.查看代码。例如,在 ConfigurationRapidPrototypingInterface.c 中,查找以下变量在单步入口函数中的使用位置:input1、input2、input3、input4、output、mp_K1、ds_mode、dstate_X、dout_Table1 和 dout_Table2。