创建代码定义以控制模型数据和函数的代码生成
控件上的模型窗口中打开嵌入式编码器字典C代码选项卡上,选择代码接口>嵌入式编码字典.
嵌入式编码器字典窗口显示存储在模型文件中的代码生成定义。如果模型链接到数据字典,窗口还会显示存储在该数据字典或(如果适用)引用字典中的定义。的来源列指示每个定义存储的位置。
在Simulink中打开嵌入式编码器字典金宝app®数据字典,在模型资源管理器中模型层次结构窗格:
在字典节点下,选择嵌入式编码器节点。
如果没有看到该节点,右键单击字典节点并选择显示空节.
在对话框窗格(右侧窗格),单击打开嵌入式编码器字典.
在模型中,创建一个存储类,该存储类聚合内部模型数据,包括块状态,进入您可以控制其特征的结构。然后,通过从模型生成代码来验证存储类。
打开示例模型rtwdemo_roll
.
rtwdemo_roll
如果模型不能在Embedded Coder应用程序中打开,则打开应用程序并单击C代码选项卡。
在C代码选项卡上,选择代码接口>嵌入式编码字典.嵌入式编码器字典窗口显示存储在模型文件中的代码生成定义。
在“嵌入式编码器字典”窗口中,单击添加.
选择出现在列表底部的新存储类,StorageClass1
.在属性检查器窗格中,设置此表中列出的属性值。
财产 | 价值 |
---|---|
的名字 | InternalStruct |
头文件 | internalData_ R.h美元 |
定义文件 | 美元internalData_阻容 |
存储类型 | 结构化 |
结构特性>类型名称 | internalData_T_ M美元 |
结构特性>实例名 | InternalData_ $ M. |
在进行更改之后,在底部窗格中,验证伪代码预览是否反映了您所期望的内容。
返回到模型编辑器。要打开代码映射编辑器,请在画布下方双击代码映射。在数据默认值标签,展开信号部分。选择信号、状态和内部数据行和设置存储类来InternalStruct
.
在“配置参数”对话框中,单击代码生成>代码的位置窗格中,设置文件的包装格式来模块化
.
生成的代码。
在Simuli金宝appnk编辑器代码视图中,打开并检查文件internalData_rtwdemo_roll.h
.该文件定义了结构类型internalData_T_
,其字段表示模型中的块状态。
/*存储类'InternalStruct', for system '' */ typedef struct {real32_T FixPtUnitDelay1_DSTATE;/* ' /FixPt Unit Delay1' */ real32_T Integrator_DSTATE;/* ' /Integrator' */ int8_T integrator_preresetstate;/* ' /Integrator' */} internalData_T_;
该文件还声明了一个名为internalData_
.
/*存储类'InternalStruct' */ extern internalData_T_ internalData_;
打开并检查文件internalData_rtwdemo_roll.c
.文件分配内存internalData_
.
/ *存储类'InternalStruct'* / InternalData_t_ InternalData_;
使用函数模板,您可以指定一个规则来管理生成的入口点函数的名称。这种技术有助于节省具有许多入口点函数的模型的时间和维护工作,例如出口函数模型或多速率、多任务模型。
此示例显示如何创建指定命名规则的函数模板func_ $ n_ $ r
.$ N
每个生成函数的基名和$ R
是Simulink模型的名称。金宝app
打开示例模型rtwdemo_mrmtbb
.
更新框图。这个多任务模型有两个执行速率,因此生成的代码包括两个相应的入口点函数。
在模型中,设置模型配置参数系统目标文件来ert.tlc
.要使用函数定制模板,必须使用基于ert的系统目标文件。
在Simuli金宝appnk编辑器中,打开嵌入式编码器应用程序并打开嵌入式编码器字典。
在嵌入式编码器字典中,在功能定制模板选项卡上,单击添加.
对于新函数模板,设置以下属性:
的名字来myfunction
.
函数名称来func_ $ n_ $ r
.
在进行更改之后,验证伪代码预览是否反映了您所期望的内容。
在模型窗口中,打开代码映射编辑器。在功能默认值选项卡,初始化和终止和执行行,设置功能定制模板来myfunction
.
生成的代码。
在Code视图中,打开并检查该文件rtwdemo_mrmtbb.c
.该文件定义了两个执行函数,func_step0_rtwdemo_mrmtbb
和func_step1_rtwdemo_mrmtbb
,其名称符合您在函数模板中指定的规则。
有关如何创建内存部分的示例,请参见通过插入Pragmas来控制数据和功能放置.
这个例子展示了如何创建一个存储类,将全局变量定义和声明放置在文件中,这些文件的名称依赖于模型名称。创建存储类的两个副本,这样就可以使用带有参数数据(数据类别)的一个副本模型参数)及其他资料各一份。
通常,生成的代码静态地初始化参数数据,在任何功能之外,并在模型初始化函数中动态地初始化其他数据。使用自定义存储类设计器或嵌入式编码器字典创建存储类时,您将设置数据初始化属性指定初始化机制。
在嵌入式编码器字典中,对于每个存储类,必须选择静态
或动态
初始化。考虑为参数数据创建一个存储类的副本(静态
)及其他资料副本一份(动态
).
打开示例模型rtwdemo_roll
.
如果C代码选项卡未打开,打开嵌入式编码器应用程序,然后单击C代码选项卡。
选择代码接口>嵌入式编码字典
在“嵌入式编码器字典”中,单击添加.
对于新的存储类,设置以下属性:
的名字来SigsStates
头文件来$ r_my_data.h.
定义文件来$ r_my_data.c.
数据初始化来动态
在进行更改之后,验证伪代码预览是否反映了您所期望的内容。
点击复制.一个新的存储类,SigsStates_copy
,出现了。
对于新的存储类,设置以下属性:
的名字来参数
数据初始化来静态
验证伪代码预览是否反映了您的期望。
在模型中,打开Code Mappings编辑器。在模型画布下面,双击代码映射- C.
在数据默认值选项卡,参数>模型参数行,在存储类列,选择参数
.
为信号>信号、状态和内部数据行,集存储类来SigsStates
.
在模型中配置一些参数数据元素,以便优化不会从生成的代码中删除这些元素。在建模选项卡上,单击设计>模型的工作空间.
在模型资源管理器中,在中间窗格上,选择与变量对应的三行dispGain
,intGain
,rateGain
在模型工作区中。
右键单击其中一行并单击转换为参数对象
.模型数据编辑器将工作区变量转换为金宝app仿真软件。参数
对象。
在参数所在行中dispGain
,在存储类列,单击配置.的模型窗口突出显示该行dispGain
参数。
对于每个变量,在存储类列,选择默认值:模型参数
,这意味着它们获取您指定的默认存储类模型参数.
在“配置参数”对话框中,单击代码生成>代码的位置窗格中,设置文件的包装格式来模块化
.
生成的代码。
在Code视图中,打开并检查文件RTWDEMO_ROLL_MY_DATA.C.
和RTWDEMO_ROLL_MY_DATA.H.
.这些文件定义并声明与参数对象和一些块状态相对应的全局变量,例如积分商块的BasicRollMode
子系统。
/ *存储类'sigsstates'* / real32_t rtfixptunitdelay1_dstate;REAL32_T RTINTEGRATOR_DSTATE;INT8_T RTINTEGRATOR_PREVRESETSTATE;/ *存储类'Params'* / Real32_t Diemgain = 0.75f;Real32_t Intgain = 0.5F;Real32_t Rategain = 2.0f;
您可以配置嵌入式编码器字典以引用存储在包中的代码生成定义(请参阅为外部数据对象创建代码定义).然后,这些定义将出现在Code Mappings编辑器中供选择。在这个例子中,您配置了嵌入式编码器字典rtwdemo_roll
引用存储在内置示例包中的定义ECoderDemos
.
打开嵌入式编码器字典rtwdemo_roll
.说明,请参阅创建和验证存储类.
在“嵌入式编码器字典”窗口中,单击管理包.
在“Manage Packages”对话框中,单击刷新.直到更多选项出现在选择包下拉列表。
集选择包来ECoderDemos
并点击负载.
在嵌入式编码器字典窗口中,在存储类选项卡中定义的存储类ECoderDemos
包中。现在,在rtwdemo_roll
,您可以在代码映射编辑器中选择这些存储类数据默认值选项卡。
要卸载软件包,请在“管理软件包”对话框中选择选择包下拉列表并单击卸载.
有关如何使用数据字典在模型之间共享代码生成定义的示例,请参见在模型之间共享嵌入式编码器字典定义.
有关如何在共享嵌入式编码器字典中配置默认代码映射的示例,请参见在共享字典中配置默认代码映射.
这些属性出现在属性检查器窗格中的内容。在表中,一些属性显示为列,以方便批量编辑。
存储类的名字
—存储类名称StorageClass1
(默认)|文本存储类的名称。该名称在字典中的存储类中必须是唯一的。
有关Simulink提供的内置存储类和示例存储类的列表,请参见金宝app选择存储类以控制生成代码中的数据表示.
描述
- 存储类的目的和功能可用于描述存储类的目的和功能的自定义文本。
来源
-存储类定义的位置此属性是只读的。
存储类定义的位置。
内置的
-由Simulink提供。金宝app
模型名称 - 在Simulink模型中定义。金宝app
字典名称-在Simulink数据字典中定义(参见金宝app什么是数据字典?).
包名称 - 在Simulink包中或在自定义包中定义(请参阅金宝app使用自定义存储类设计器创建存储类).
数据访问
-访问数据的规格直接
(默认)|函数
|指针
访问与模型关联的数据的规范。直接查阅资料(直接
),通过可定制的得到
和集
函数(函数
),或使用指针(指针
).有关更多信息,请参见使用嵌入式编码器字典中的存储类通过函数访问数据.
将此属性设置为函数
或指针
:
集DataScope
来进口
.
意味着您不能指定多实例属性。
设置PreserveDimensions
财产假
.若要在生成的代码中保留多维数组的维度,请设置DataAccess
来直接
.
此外,将此属性设置为函数
使这些属性:
AccessMode
AllowedAccess
GetFunctionName
SetFunctionName
数据范围
-生成数据定义的规范出口
(默认)|进口
生成的代码定义数据的规范(出口
)或进口(进口
)从外部代码的数据定义。像Simulink这样的包中的内置存储类和存储类可以使用其他作用域选项,例如金宝app文件
.
将此属性设置为进口
:
禁用定义文件.要在构建过程中包含外部源代码文件,请使用模型配置参数。例如,看到配置数据接口.
表示无法设置头文件来新罕布什尔州美元
,虽然你可以使用$ N
令牌。
将此属性设置为出口
,则必须使用其中一个令牌$ N
或$ R
价值头文件.
头文件
- 声明数据的头文件的名称新罕布什尔州美元
(默认)|文本声明数据的头文件的名称,指定为名称或命名规则。命名规则包括文本和标记的组合。该表中列出了有效的令牌。
令牌 | 描述 |
---|---|
$ R |
根模型名称 |
$ N |
关联数据元素的名称 |
G美元 |
存储类名称 |
你美元 |
您为模型指定的用户令牌文本,如标识符的格式控制 |
如果你设置数据范围来出口
,则必须使用其中一个令牌$ R
或$ N
在这个属性的价值。
如果你设置数据范围来进口
,则无法将此属性的值设置为新罕布什尔州美元
,但你可以使用$ N
令牌。
访问模式
-通过函数访问数据的规范价值
(默认)|指针
允许访问
-允许通过函数访问数据的规范读/写
(默认)|只读
|只写
存储类的规范允许读写(读/写
), 只读 (只读
),或只写(只写
)存取资料。
此属性仅在设置时启用数据访问来函数
.
Getter的名字
-名称得到
获取相关数据的函数get_ $ n $ m
(默认)|文本的名字得到
函数,获取作为名称或命名规则指定的关联数据。命名规则包括文本和标记的组合。该表中列出了有效的令牌。
令牌 | 描述 |
---|---|
$ N |
关联数据元素的名称(必需) |
$ R |
根模型名称 |
M美元 |
Mangle文本,确保唯一性 |
你美元 |
用户令牌的文本。看到标识符的格式控制. |
此属性仅在设置时启用数据访问来函数
.
Setter的名字
-名称集
函数,用于修改关联的数据set_ N M美元
(默认)|文本的名字集
函数,获取作为名称或命名规则指定的修改数据。命名规则包括文本和标记的组合。该表中列出了有效的令牌。
令牌 | 描述 |
---|---|
$ N |
关联数据元素的名称(必需) |
$ R |
根模型名称 |
M美元 |
Mangle文本,确保唯一性 |
你美元 |
用户令牌的文本。看到标识符的格式控制. |
此属性仅在设置时启用数据访问来函数
.
使用不同的属性设置单个实例和多实例数据
-指定单独存储设置的规格从
(默认)|在
属性中指定的存储设置,以便存储类使用其中之一单实例存储您指定的部分或存储设置多实例存储部分。当您将存储类应用到数据项时,Embedded Coder Dictionary根据数据类型和模型引用层次结构中的模型上下文来确定它是单实例存储类还是多实例存储类。
选择此属性允许这些属性单实例存储和多实例存储.的属性存储类型,类型名称,实例名出现在单实例存储和多实例存储部分。
存储类型
- 将数据汇总为结构的规范非结构化
(默认)|结构化
规范将使用存储类的数据聚合到生成的代码中的结构中。每个数据元素都作为结构的一个字段出现在代码中。创建一个结构,使用结构化
.
将此属性设置为结构化
启用类型名称和实例名.
类型名称
—结构类型名称R N G M美元美元
(默认)|文本生成代码中结构类型的名称,作为名称或命名规则指定。命名规则包括文本和标记的组合。该表中列出了有效的令牌。
令牌 | 描述 |
---|---|
$ R |
根模型名称 |
$ N |
关联函数的基名,例如一步 |
G美元 |
存储类名称 |
你美元 |
您为模型指定的用户令牌文本,如标识符的格式控制 |
M美元 |
如果需要,请插入名称 - 漫画文本以避免名称碰撞 |
环境存储类型来结构化
使这个属性。
实例名
—结构变量名N G美元美元
(默认)|文本生成的代码中的结构变量的名称,指定为名称或命名规则。命名规则包括文本和标记的组合。该表中列出了有效的令牌。
令牌 | 描述 |
---|---|
$ R |
根模型名称 |
$ N |
关联函数的基名,例如一步 |
G美元 |
存储类名称 |
你美元 |
您为模型指定的用户令牌文本,如标识符的格式控制 |
M美元 |
如果需要,请插入名称 - 漫画文本以避免名称碰撞 |
环境存储类型来结构化
使这个属性。
数据初始化
—如何初始化数据汽车
(默认)|动态
|静态
|没有任何
说明生成的代码初始化数据。
汽车
—生成的代码静态初始化参数数据,动态初始化信号和状态数据。
动态
-生成的代码初始化数据,作为模型初始化入口点函数的一部分。
静态
- 生成的代码初始化与数据定义和分配数据的同一语句中的数据。赋值语句显示在a的顶部.c
或. cpp
源文件,函数之外。
没有任何
—生成的代码不初始化数据。
如果您选择常量,则不能将此属性设置为动态
.
将此属性设置为动态
禁用常量.
记忆部分
—用于分配数据的内存位置没有任何
(默认)|现有内存段控件上用于分配数据的内存位置,指定为存在于嵌入式编码器字典中的内存段记忆的部分选项卡。有关内存段的信息,请参见通过插入Pragmas来控制数据和功能放置.
保存数组维度
-保留多维数组维度的规范从
(默认)|在
存储类规范以在生成的代码中保留多维数组的维度。有关更多信息,请参见在生成的代码中保留多维数组的维数.
常量
-应用规范常量
限定符从
(默认)|在
应用常量
数据的限定符。
如果选择此属性,则无法进行设置数据初始化来动态
.
环境数据初始化来动态
禁用此属性。
挥发性
-应用规范挥发性
限定符从
(默认)|在
应用挥发性
数据的限定符。
其他限定符
-应用自定义限定符的规范规范,以对数据应用自定义限定符。例如,一些内存体系结构支持限定符金宝app远
和巨大的
.
不使用此属性应用关键字静态
.相反,使用内置存储类FileScope
,您不能使用代码映射编辑器应用它。看到选择存储类以控制生成代码中的数据表示.
参数
—是否允许与模型参数一起使用从
(默认)|在
指示是否允许使用带模型参数的存储类的规范。
环境数据初始化来静态
使这个属性。
环境数据初始化来动态
禁用此属性。
若要设置此属性的值,请设置数据初始化来没有任何
.
信号
—是否允许模型信号使用在
(默认)|从
指示是否允许使用带有模型信号的存储类的规范。
环境数据初始化来动态
使这个属性。
环境数据初始化来静态
禁用此属性。
若要设置此属性的值,请设置数据初始化来没有任何
.
的名字
—函数模板名称functiontemplate1.
(默认)|文本模板的名称。该名称在字典中的函数模板中必须是唯一的。Embedded Coder提供了表中列出的内置模板。
模板 | 描述 |
---|---|
ModelFunction |
在代码映射编辑器中,用于初始化、执行、终止和重置的入口点函数(请参阅配置函数的默认代码生成) |
实用功能 |
在代码映射编辑器中,用于共享实用程序函数(参见配置函数的默认代码生成) |
描述
- 功能模板的目的和功能可用于描述函数模板的目的和功能的自定义文本。
来源
-函数模板定义的位置函数名称
- 生成函数的名称R N美元
(默认)|文本生成代码中函数的名称,作为命名规则指定。命名规则包括文本和标记的组合。该表中列出了有效的令牌。
令牌 | 描述 |
---|---|
$ R |
根模型名称 |
$ N |
关联函数的基名,例如一步 |
你美元 |
您为模型指定的用户令牌文本,如标识符的格式控制 |
$ C |
对于共享实用程序函数,插入校验和以避免名称冲突 |
M美元 |
如果需要,请插入名称 - 漫画文本以避免名称碰撞 |
记忆部分
-内存中分配函数的位置没有任何
(默认)|现有内存段内存中的位置分配函数,指定为嵌入式编码器字典中存在的内存部分记忆的部分选项卡。有关内存段的信息,请参见通过插入Pragmas来控制数据和功能放置.
的名字
- 内存部分的名称内存段的名称。该名称在字典中的内存段中必须是唯一的。Embedded Coder提供了表中列出的内置内存部分。
记忆部分 | 描述 |
---|---|
MemConst |
应用存储类型限定符常量 到数据。 |
MemVolatile |
应用存储类型限定符挥发性 到数据。 |
MemConstVolatile |
应用存储类型限定符常量 和挥发性 到数据。 |
描述
-内存部分的目的和功能可用于描述内存部分的目的和功能的自定义文本。
来源
-内存段定义的位置此属性是只读的。
内存段定义的位置。
模型名称 - 在Simulink模型中定义。金宝app
字典名称-在Simulink数据字典中定义(参见金宝app什么是数据字典?).
包名称 - 在Simulink包中或在自定义包中定义(请参阅金宝app为外部数据对象创建代码定义).
评论
-注释以插入生成的代码代码生成器中包含的代码注释或您指定的其他修饰初级陈述和发布声明.
初级陈述
—在数据或函数代码之前插入的代码在内存部分中的数据或函数的定义和声明之前插入的代码(如pragmas)。
您可以使用令牌$ R
表示使用内存部分的模型的名称。
当你设置时陈述周围来每个变量
,你可以使用令牌$ N
表示使用内存段的每个变量或函数的名称。
发布声明
—在数据或函数代码之后插入的代码在内存部分中的数据或函数的定义和声明之后插入的代码,如pragmas。
您可以使用令牌$ R
表示使用内存部分的模型的名称。
当你设置时陈述周围来每个变量
,你可以使用令牌$ N
表示使用内存段的每个变量或函数的名称。
陈述周围
-将数据和功能单独或分组包装的规范每个变量
(默认)|组变量
指定插入代码语句(初级陈述和发布声明):
在使用内存段的每个变量和函数周围。选择每个变量
.
有一次,在整个记忆区域。生成的代码将变量和函数定义聚集到一个相邻的代码块中,并用语句包围该代码块。选择组变量
.
在嵌入式编码器字典中创建的存储类或函数自定义模板不能使用从包加载的内存部分(如请参阅包中的代码生成定义).使用在嵌入式编码器字典中定义的内存段。
您在嵌入的编码器字典中创建的存储类函数
数据存储的存储类不支持数据访问。金宝app
您无法在a中创建代码生成定义. mdl
模型文件。
有关数据字典的嵌入式编码器字典中代码生成定义的其他限制(.sldd.
文件),见部署代码生成定义.