文档

嵌入式编码器词典

创建代码定义,用于控制模型数据和函数的代码生成

描述

嵌入式编码器字典是一个用于创建自定义代码定义的图形界面。通过在模型中应用这些定义,您和您的用户可以生成默认情况下符合特定软件架构的代码。例如,您可以创建自己的存储类,您和您的用户可以在默认情况下将其应用于模型数据的类别(例如根级输入)。

你可以创建这些类型的代码定义:

  • 存储类,它们控制为模型数据生成的代码。

  • 函数定制模板,它控制模型入口点函数的命名,例如模型_step.这些模板还将内存段应用到入口点函数。

  • 内存段,它控制数据和函数在内存中的位置。生成的代码包括自定义装饰,比如您指定语法的pragmas。

嵌入式编码器字典为每种类型的代码定义提供了一个选项卡。在每个选项卡中,配置代码定义的属性。使用该表配置属性并并排比较定义。要访问未出现在表中的属性,请使用属性检查器。

您在字典中创建的定义可以通过在代码映射编辑器中配置模型范围的默认设置应用于模型元素为模型数据和函数类别配置默认代码生成).若要创建可在代码映射编辑器之外使用的存储类和内存段,请使用自定义存储类设计器(请参阅创建代码定义以覆盖默认设置).

有关创建代码生成定义的一般信息,请参见为软件架构定义存储类、内存段和功能模板

打开嵌入式编码器字典

  • 要打开模型使用的嵌入式编码器字典,请使用以下技术之一:

    • 在代码映射编辑器中(请参阅代码映射编辑器),点击“嵌入式编码器字典”图标

    • 在模型窗口中,选择代码>C / c++代码>嵌入式编码器词典

    如果模型未链接到Simulink万博1manbetx®数据字典(见什么是数据字典?(万博1manbetxSimulink)),“嵌入式编码器字典”窗口显示存储在模型文件中的代码生成定义。如果模型链接到一个数据字典,该窗口将显示存储在该数据字典中或(如果适用的话)存储在引用字典中的定义。

  • 要在“模型资源管理器”中打开Simulink数据字典中的嵌入式编码器字典万博1manbetx模型层次结构面板:

    1. 在字典节点下,选择嵌入式编码器节点。

      如果没有看到该节点,右键单击字典节点并选择显示空部分

    2. 在Dialog窗格(右侧窗格)中,单击打开嵌入式编码器字典

例子

创建并验证自定义存储类

在模型中,创建一个存储类,它将内部模型数据(包括块状态)聚合到一个结构中,该结构的特征可以由您控制。然后,通过从模型生成代码来验证存储类。

  1. 打开示例模型rtwdemo_roll

    rtwdemo_roll

  2. 在模型中,选择代码>C / c++代码>在代码透视图中配置模型

  3. 在方框图下面代码的映射>数据默认值,单击“嵌入式编码器字典”图标。

    因为rtwdemo_roll没有链接到Simulink数据字典,则万博1manbetx“嵌入式编码器字典”窗口将显示存储在模型文件中的代码生成定义。

  4. 在“嵌入式编码器字典”窗口中,单击添加按钮。一个名为StorageClass1显示在列表的底部。

  5. 选择新的存储类。在“嵌入式编码器字典”窗口的右侧,在“属性检查器”中,设置本表中列出的属性值。

    财产 价值
    的名字 InternalStruct
    存储类型 结构化
    头文件 internalData_ R.h美元
    定义文件 美元internalData_阻容
    结构特性>类型名称 internalData_T_ M美元
    结构特性>实例名 internalData_ M美元

  6. 在模型中,在下面代码的映射>数据默认值,用于内部数据行,设置存储类InternalStruct

  7. 从模型生成代码。

  8. 在代码生成报告中,下生成的代码>数据文件、检查internalData_rtwdemo_roll.h.文件定义结构类型internalData_T_,其字段表示模型中的块状态。

    /*存储类'InternalStruct',用于系统'<根>' */ typedef struct {real32_T FixPtUnitDelay1_DSTATE;/* '/FixPt Unit Delay1' */ real32_T Integrator_DSTATE;/* '/Integrator' */ int8_T Integrator_PrevResetState;/* '/Integrator' */} internalData_T_;

    该文件还声明了一个全局结构变量internalData_

    /*存储类'InternalStruct' */ extern internalData_T_ internalData_;

  9. 检查文件internalData_rtwdemo_roll.c.该文件为internalData_

    /*存储类'InternalStruct' */ internalData_T_ internalData_;

创建功能定制模板

使用函数模板,您可以指定规则来管理生成的入口点函数的名称。这种技术有助于在具有许多入口点函数的模型中节省时间和维护工作,例如导出函数模型或多速率多任务模型。

此示例显示如何创建指定命名规则的函数模板func_ N_ R美元$ N是每个生成的函数的基本名称和$ R是Simulink模型的名称。万博1manbetx

  1. 打开示例模型rtwdemo_mrmtbb

  2. 更新框图。这个多任务模型有两种执行速率,因此生成的代码包括两个相应的入口点函数。

  3. 在模型中,设置配置参数>代码生成>系统目标文件ert.tlc.要使用函数自定义模板,必须使用基于ert的系统目标文件。

  4. 在模型中,进入代码透视图并打开嵌入式编码器字典。

  5. 在嵌入式编码器字典中,在功能定制模板选项卡,单击添加按钮。

  6. 对于新的函数模板,设置这些属性:

    • 的名字myfunction

    • 函数名func_ N_ R美元

  7. 在模型的“代码映射编辑器”中功能默认值选项卡,用于初始化和终止而且执行行,设置功能定制模板myfunction

  8. 从模型生成代码。

  9. 在代码生成报告中,检查rtwdemo_mrmtbb.c.该文件定义了两个执行函数,func_step_rtwdemo_mrmtbb0而且func_step_rtwdemo_mrmtbb1,它们的名称符合您在函数模板中指定的规则。

创建内存部分

有关显示如何创建内存部分的示例,请参见通过插入Pragmas控制数据和函数在内存中的位置

创建用于参数和非参数数据的存储类

这个例子展示了如何创建一个存储类,将全局变量定义和声明放在文件名依赖于模型名的文件中。您可以创建存储类的两个副本,这样就可以使用一个带有参数数据的副本(数据类别)本地参数)和另一份非参数资料。

通常,生成的代码在任何函数之外静态初始化参数数据,并在模型初始化函数中动态初始化非参数数据。使用自定义存储类设计器或嵌入式编码器字典创建存储类时,可以设置数据初始化属性指定初始化机制。

在嵌入式编码器字典中,对于每个存储类,您必须选择其中之一静态动态.考虑为参数数据创建存储类的一个副本(静态)和一份非参数数据(动态).

创建存储类

  1. 打开示例模型rtwdemo_roll

    rtwdemo_roll

  2. 在模型中,选择代码>C / c++代码>在代码透视图中配置模型

  3. 在方框图下面代码的映射,单击“嵌入式编码器字典”图标。

  4. 在“嵌入式编码器字典”中,单击添加按钮。

  5. 对于新的存储类,设置这些属性:

    • 的名字SigsStates

    • 头文件R_my_data.h美元

    • 定义文件R_my_data.c美元

    默认情况下,数据初始化属性设置为动态,这意味着存储类适合用于非参数数据。

  6. 单击重复的按钮。一个新的存储类,SigsStates_copy,出现了。

  7. 对于新的存储类,设置这些属性:

    • 的名字参数个数

    • 数据初始化静态

应用存储类并生成代码

  1. 在模型中,在下面代码的映射>数据默认值,用于本地参数行,在存储类列,选择参数个数

  2. 内部数据行,设置存储类SigsStates

  3. 在模型中配置一些参数数据元素,以便优化不会从生成的代码中消除它们。控件的下面,打开模型数据编辑器模型数据编辑器选项卡。

  4. 选择参数选项卡。

  5. 模型中,导航到BasicRollMode子系统。

  6. 更新框图。现在,数据表包含了与模型使用的工作区变量相对应的行。

  7. 旁边是内容过滤框,激活使用选择筛选按钮。

  8. 在模型中,选择这三个获得块。

  9. 在“模型数据编辑器”的数据表中,选择与dispGainintGain,rateGain模型工作区中的变量。

  10. 中的每个变量存储类列,选择转换为参数对象

    模型数据编辑器将工作区变量转换为万博1manbetx仿真软件。参数对象。新对象使用存储类模型的默认,这意味着它们获取您指定的默认存储类本地参数在代码映射编辑器中。

  11. 从模型生成代码。

  12. 在代码生成报告中,检查文件rtwdemo_roll_my_data.c而且rtwdemo_roll_my_data.h.文件定义并声明了与参数对象和某些块状态(如积分器BasicRollMode子系统。

    /*存储类'SigsStates' */ real32_T rtwdemo__FixPtUnitDelay1_DSTATE;real32_T rtwdemo_roll_Integrator_DSTATE;int8_T rtwde_Integrator_PrevResetState;/*存储类Params */ real32_T disgain = 0.75F;real32_T intGain = 0.5F;real32_T rateGain = 2.0F;

通过使用共享模型之间的代码生成定义万博1manbetx数据字典

有关如何使用数据字典在模型之间共享代码生成定义的示例,请参见在模型之间共享嵌入式编码器字典定义

参考包中的代码生成定义

您可以配置嵌入式编码器字典以引用存储在包中的代码生成定义(请参阅创建代码定义以覆盖默认设置).然后在代码映射编辑器中可以选择这些定义。在本例中,配置嵌入式编码器字典rtwdemo_roll以引用存储在内置示例包中的定义ECoderDemos

  1. 打开嵌入式编码器字典rtwdemo_roll.有关说明,请参见创建并验证自定义存储类

  2. 在“嵌入式编码器字典”窗口中,单击管理包按钮。

  3. 在“包管理”对话框中,单击刷新.中出现更多选项时,请等待改变包装下拉列表。

  4. 改变包装ECoderDemos并点击加载包

    在“嵌入式编码器字典”窗口中存储类选项卡中定义的存储类ECoderDemos包中。现在,在rtwdemo_roll,您可以在下面选择这些存储类代码的映射>数据默认值

代码定义属性

全部展开

这些属性显示在“嵌入式编码器字典”窗口右侧的“属性检查器”中。在窗口中间的表格中,一些属性以列的形式显示,以方便批量编辑。

存储类

存储类的名称。该名称在字典中的存储类中必须唯一。

有关Simulink提供的内置存储类的列表,请参见万博1manbetx选择一个存储类来控制生成代码中的数据表示

此属性是只读的。

存储类定义的位置。

可用于描述存储类的目的和功能的自定义文本。

内存中用于分配数据的位置,指定为存在于嵌入式编码器字典中的内存段记忆的部分选项卡。有关内存部分的信息,请参见通过插入Pragmas控制数据和函数在内存中的位置

生成的代码定义数据的规范(出口)或import (进口)外部代码的数据定义。内置存储类和包(如Simulink)中的存储类可以使用其他作用域选项,例如万博1manbetx文件

依赖关系

  • 将此属性设置为进口

    • 禁用定义文件.要在构建过程中包括外部源代码文件,请使用模型配置参数。有关示例,请参见自定义生成的入口点函数的接口

    • 意味着你不能设置头文件新罕布什尔州美元,不过你可以使用the$ N令牌。

  • 将此属性设置为出口,您必须使用其中一个令牌$ N$ R在价值上头文件

指定生成的代码初始化数据。

  • 动态生成的代码初始化数据作为模型初始化入口点函数的一部分。

  • 静态—生成的代码在为数据定义和分配内存的语句中初始化数据。赋值语句出现在.c. cpp源文件,在函数之外。

  • 没有一个—生成的代码不初始化数据。

依赖关系

  • 如果您选择常量,则不能将此属性设置为动态

  • 将此属性设置为动态禁用常量

声明数据的头文件的名称,指定为名称或命名规则。命名规则包括文本和标记的组合。该表中列出了有效的令牌。

令牌 描述
$ R 根模型名称
$ N 关联数据元素的名称
G美元 存储类名称
你美元 中为模型指定的用户令牌文本标识符格式控制

依赖关系

  • 如果你设置数据范围出口,您必须使用其中一个令牌$ R$ N这个属性的值。

  • 如果你设置数据范围进口,则不能将此属性的值设置为新罕布什尔州美元,但你可以使用$ N令牌。

定义数据的源文件的名称,指定为名称或命名规则。命名规则包括文本和标记的组合。该表中列出了有效的令牌。

令牌 描述
$ R 根模型名称
$ N 关联数据元素的名称
G美元 存储类名称
你美元 中为模型指定的用户令牌文本标识符格式控制

依赖关系

设置数据范围进口禁用定义文件.要在构建过程中包括外部源代码文件,请使用模型配置参数。有关示例,请参见自定义生成的入口点函数的接口

应用于常量数据的限定符。

依赖关系

  • 如果选择此属性,则无法设置数据初始化动态

  • 设置数据初始化动态禁用此属性。

应用于挥发性数据的限定符。

规范,以便对数据应用自定义限定符。例如,一些内存架构支持限定符万博1manbetx而且巨大的

不要使用此属性应用关键字静态.相反,使用内置存储类FileScope,您无法使用代码映射编辑器应用此功能。看到选择一个存储类来控制生成代码中的数据表示

规范将使用存储类的数据聚合到生成代码中的结构中。每个数据元素都作为结构的字段出现在代码中。要创建结构,请使用结构化

依赖关系

将此属性设置为结构化使类型名称而且实例名

生成代码中结构类型的名称,指定为名称或命名规则。命名规则包括文本和标记的组合。该表中列出了有效的令牌。

令牌 描述
$ R 根模型名称
$ N 关联函数的基名称,例如一步
G美元 存储类名称
你美元 中为模型指定的用户令牌文本标识符格式控制
M美元 如有必要,插入打乱名称的文本,以避免名称冲突

依赖关系

设置存储类型结构化启用此属性。

生成代码中结构变量的名称,指定为名称或命名规则。命名规则包括文本和标记的组合。该表中列出了有效的令牌。

令牌 描述
$ R 根模型名称
$ N 关联函数的基名称,例如一步
G美元 存储类名称
你美元 中为模型指定的用户令牌文本标识符格式控制
M美元 如有必要,插入打乱名称的文本,以避免名称冲突

依赖关系

设置存储类型结构化启用此属性。

功能定制模板

模板名称。该名称在字典中的函数模板中必须唯一。嵌入式编码器®提供本表中列出的内置模板。

模板 描述
ModelFunction 在“代码映射编辑器”中,用于初始化、执行、终止和重置的入口点函数(请参阅配置函数的默认代码生成
UtilityFunction 在“代码映射编辑器”中,用于共享实用程序函数(请参阅配置函数的默认代码生成

生成代码中的函数名称,作为命名规则指定。命名规则包括文本和标记的组合。该表中列出了有效的令牌。

令牌 描述
$ R 根模型名称
$ N 关联函数的基名称,例如一步
$ C 对于共享实用程序函数,插入校验和以避免名称冲突
你美元 中为模型指定的用户令牌文本标识符格式控制
M美元 如有必要,插入打乱名称的文本,以避免名称冲突

此属性是只读的。

函数模板定义的位置。

  • 模型名称-在Simulink模型中定义。万博1manbetx

  • 字典名称-在Simulink数据字典中定义(请参阅万博1manbetx什么是数据字典?(万博1manbetx模型))。

可用于描述函数模板的目的和功能的自定义文本。

记忆的部分

内存段的名称。该名称在字典中的内存区中必须是唯一的。Embedded Coder提供了表中列出的内置内存部分。

记忆的部分 描述
MemConst 应用存储类型限定符常量对数据。
MemVolatile 应用存储类型限定符挥发性对数据。
MemConstVolatile 应用存储类型限定符常量而且挥发性对数据。

此属性是只读的。

内存段定义的位置。

可用于描述内存部分的目的和功能的自定义文本。

代码生成器包含在指令或您指定的其他修饰中的代码注释之前的声明而且发布声明

在内存部分中数据或函数的定义和声明之前插入的代码,如pragmas。

当你设置语句包围每个变量,您可以使用令牌$ N表示使用内存段的每个变量或函数的名称。

在内存部分中数据或函数的定义和声明之后插入的代码,如pragmas。

当你设置语句包围每个变量,您可以使用令牌$ N表示使用内存段的每个变量或函数的名称。

插入代码语句的规范(之前的声明而且发布声明):

  • 围绕使用内存段的每个变量和函数。选择每个变量

  • 一次,绕着整个内存区。生成的代码将变量和函数定义聚合到一个连续的代码块中,并用语句包围该代码块。选择变量组

限制

在R2018a中引入

这个话题有用吗?