Main Content

为 C 代码生成配置模型数据接口

要将生成代码与外部代码集成,或生成符合编码标准和规范的代码,您可以配置模型中的数据元素(如模块参数和信号线)在生成代码中的显示方式。您可以使用代码映射编辑器或代码映射 API 为数据元素类别配置默认代码生成设置,并配置单个元素。例如,您可以配置如下设置:

  • 控制声明和定义在生成的和外部(导出和导入的)文件中的位置。

  • 将多个数据项打包到结构体中。

  • 应用存储类型限定符 constvolatile

此示例说明如何为示例模型 ConfigurationInterface 的代码生成配置数据元素。

浏览模型示例

打开示例模型 ConfigurationInterface。

model = 'ConfigurationInterface';
open_system(model)

此示例说明如何为代码生成配置以下模型数据元素:

  • Inport 模块 In1In2In3In4

  • Outport 模块 Out1

  • 模型参数参量 LOWERUPPER

  • 模型参数 K1Table1Table2

  • 局部数据存储 mode

  • 源自查找表模块 Table1Table2 的信号线

  • 状态 X(延迟)

Inport 模块配置默认设置

  1. 打开 Embedded Coder

  2. C 代码选项卡中,选择代码接口 > 默认代码映射

  3. 在代码映射编辑器中的输入端口和输出端口下,选择输入端口类别。将默认存储类设置为 ImportFromFile

  4. 在属性检查器中,将头文件设置为 exInDataLut.h

为 Outport 模块配置默认设置

  1. 数据默认值选项卡上的输入端口和输出端口下,选择输出端口类别。将默认存储类设置为 ExportToFile

  2. 在属性检查器中,将头文件设置为 exOutSys.h,将定义文件设置为 exOutSys.c

为参数配置默认设置

  1. 数据默认值选项卡上的参数下,选择类别模型参数参量。将存储类设置为 Default。使用该设置,代码生成器为每个参量实例分配一个单独的内存区域。

  2. 选择模型参数类别。链接文本 'Auto' will be inlined 指示代码生成器默认配置为内联模型参数。在此示例中,将模型参数配置为可调。点击 'Auto' will be inlined。“模型配置参数”对话框将打开。

  3. 将模型配置参数默认参数行为设置为 Tunable。保存更改并关闭对话框。在代码映射编辑器中,链接文本更改为 'Auto' will be tunable

  4. 在代码映射编辑器中,在模型参数类别处于选中状态下,将存储类设置为 ConstVolatile

配置信号、状态和数据存储的默认设置

  1. 数据默认值选项卡上的信号下,选择信号、状态和内部数据类别。将默认存储类设置为 FileScope。

  2. 为共享局部数据存储配置默认代码映射。选择类别共享局部数据存储。将存储类设置为 Volatile

  3. 保存模型。

为单个 Inport 模块配置代码生成设置

  1. 在代码映射编辑器中,点击输入端口选项卡。编辑器列出模型中根级 InportIn Bus Element 模块的名称。如果端口解析为信号对象,则“解析为信号对象”图标会出现在元素名称的右侧。每个输入端口的存储类设置为 Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。如果无法进行优化,代码生成器将应用模型默认配置。在此示例中,模型默认配置指定存储类 ImportedFromFile。要避免优化并强制代码生成器使用默认配置,请将存储类设置为 Model default。要覆盖默认配置,请指定满足该输入端口的代码生成要求的存储类。

  2. 配置代码生成器以将默认存储类设置应用于输入端口 In2In3In4。选择三个输入端口对应的行。然后,对于其中一个所选输入端口,将存储类设置为 Model default: ImportFromFile。三个所选输入端口的存储类更改为模型默认值:ImportFromFile。

  3. 对于输入端口 In1,覆盖默认存储类设置。将存储类设置为 ImportFromFile。在属性检查器中,将头文件设置为 exInDataMem.h

  4. 为输入端口配置代码标识符,以便生成代码中的变量与外部头文件和定义文件中的接口名称相匹配。在代码映射编辑器中,选择每个输入端口对应的行。在属性检查器中,将标识符属性设置为下列值:input1input2input3input4

为单个 Outport 模块配置代码生成设置

  1. 在代码映射编辑器中,点击输出端口选项卡。编辑器列出模型中根级 OutportOut Bus Element 模块的名称。如果端口解析为信号对象,则“解析为信号对象”图标会出现在元素名称的右侧。示例模型中输出端口的存储类设置为 Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。

  2. 要避免优化并强制代码生成器使用默认配置,请将存储类设置为 Model default: ExportToFile。所选输出端口的存储类更改为 Model default: ExportToFile

  3. 为输出端口配置代码标识符,以便生成代码中的变量与外部代码使用的接口名称相匹配。在代码映射编辑器中,选择输出端口对应的行。在属性检查器中,将标识符属性设置为 output

为单个参数配置代码生成设置

  1. 在代码映射编辑器中,点击参数选项卡。展开模型参数参量。默认情况下,每个模型参数参量的存储类都设置为 Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。如果无法进行优化,代码生成器将应用模型默认配置。在此示例中,将存储类设置保留为 Auto

  2. 展开模型参数。默认情况下,每个模型参数的存储类设置为 Auto。在此示例中,您要避免优化,并希望代码生成器使用默认存储类设置,即 ConstVolatile。

  3. 在代码映射编辑器中的模型参数下,选择参数 K1Table1Table2。将存储类设置为 Model default: ConstVolatile

  4. 根据要求将模型参数的代码标识符配置为包含前缀 mp_ 的名称在代码映射编辑器中,选择模型参数 K1。在属性检查器中,展开代码节点。将存储类属性标识符设置为 mp_K1。对于参数 Table1Table2,将标识符设置为 mp_Table1mp_Table2

为单个数据存储配置代码生成设置

  1. 在代码映射编辑器中,点击数据存储选项卡。展开局部数据存储。数据存储模式的存储类设置为“自动”,这意味着代码生成器可能会出于优化目的而消除相关代码。在此示例中,您要避免优化,并希望代码生成器使用默认存储类设置,即 Volatile

  2. 在代码映射编辑器中,选择局部数据存储 mode。将存储类设置为 Model default: Volatile

  3. 将数据存储的代码标识符配置为包含前缀 ds_ 的名称。在代码映射编辑器中,选择共享局部数据存储 mode。在属性检查器中,展开代码节点。将存储类属性标识符设置为 ds_mode

为各个状态配置代码生成设置

  1. 在代码映射编辑器中,点击信号/状态选项卡。展开状态。状态的存储类设置为 Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。在此示例中,您要避免优化,并希望代码生成器使用默认存储类设置,即 FileScope

  2. 在代码映射编辑器中,选择状态 X。将存储类设置为 Model default: FileScope

  3. 按照要求将状态的代码标识符配置为包含前缀 dstate_ 的名称。在代码映射编辑器中,选择状态 X。在属性检查器中,展开代码节点。然后,将存储类属性标识符设置为 dstate_X

为各个信号配置代码生成设置

将您要配置的信号添加到模型代码映射中。在此示例中,要将两个查找表模块的输出信号添加到模型代码映射中。然后,配置那些信号。

  1. 在代码映射编辑器中,点击信号/状态选项卡。未列出任何信号。

  2. 将信号添加到代码映射。对于查找表模块 Table1Table2 的输出信号,请在模型中选择一个信号,在信号线上方或下方出现的省略号上暂停以打开操作栏,然后点击添加信号按钮。在代码映射编辑器中,信号节点会展开并列出您添加的两个信号的名称或模块标识符。如果信号解析为信号对象,则“解析为信号对象”图标会出现在元素名称或端口标识符的右侧。每个信号的存储类设置为 Auto,这意味着代码生成器可能会出于优化目的而消除相关代码。在此示例中,您要避免优化,并希望代码生成器使用默认存储类设置,即 FileScope

  3. 在代码映射编辑器中,选择模块 Table1Table2 的输出信号。将存储类设置为 Model default: FileScope

  4. 将两个查找表模块的输出信号的代码标识符配置为包含前缀 dout 的名称。在代码映射编辑器中,选择信号 Table1:1。在属性检查器中,展开代码节点。将存储类属性标识符设置为 dout_Table1。对于信号 Table2:1,将标识符设置为 dout_Table2

  5. 保存模型。

以编程方式为代码生成配置数据

或者,使用代码映射 API 以编程方式配置模型数据元素。

1.通过调用 coder.mapping.api.get,获取表示模型的代码映射的对象。您可以将返回的对象指定为对代码映射函数的后续调用中的第一个参量。

cm = coder.mapping.api.get(model);

2.通过调用 setDataDefaults,为各类数据元素配置默认代码生成设置。在每个调用中,包括调用 coder.mapping.api.get 所返回的对象、数据元素类别的名称以及指定存储类和存储类属性的名称-值对组参量。使用 setDataDefaults 配置以下默认设置:

  • Inport 模块配置为使用存储类 ImportFromFile 和头文件 exInDataLut.h

  • Outport 模块配置为使用存储类 ExportToFile、头文件 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 模块的默认配置应用于 In2In3In4。对于 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 中,查找以下变量在单步入口函数中的使用位置:input1input2input3input4outputmp_K1ds_modedstate_Xdout_Table1dout_Table2

相关主题