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