模型中的块可能需要共同的功能来实现它们的算法。考虑将此功能模块化为独立的支持或帮助函数。金宝app这种方法比内联每个块实例的功能代码更有效。要决定是使用库还是共享实用程序,请考虑:
在静态定义函数时,将具有多个调用者的函数打包到库中。也就是说,在使用代码生成器为模型生成代码之前,函数源代码存在于一个文件中。
当函数不能静态定义时,将具有多个调用者的函数打包为共享实用程序(在代码生成期间生成)。例如,一些特定于模型和块的属性指定使用哪些函数及其行为。此外,这些属性还决定类型定义(例如,类型定义
)在共享实用程序头文件中。确定唯一行为的属性的可能组合的数量使得在代码生成之前静态定义可能的函数文件是不切实际的。
使用这些方法之一为生成的共享实用程序函数配置默认命名规则。
配置 | 行动 |
---|---|
已使用映射默认自定义设置的新模型或现有模型代码映射编辑器或代码映射编程接口 | 在嵌入式编码词典(嵌入式编码器),定义用于指定自定义函数命名规则的函数自定义模板。然后,在代码映射编辑器中或通过使用代码映射编程接口,映射共享效用函数类别。有关更多信息,请参见配置数据元素和函数类别的默认C代码生成(嵌入式编码器). |
在R2018a之前的版本中创建的模型,并且没有配置代码映射编辑器或代码映射编程接口 | 设置模型配置参数共享实用程序标识符格式(嵌入式编码器)(CustomSymbolsStrUtil )的自定义函数命名规则。有关更多信息,请参见标识符的格式控制(嵌入式编码器). |
一旦你使用代码映射编辑器或代码映射编程接口来配置模型,设置模型配置参数共享实用程序标识符格式不影响代码生成。此设置不适用于配置了这些规范的模型。
系统目标文件 | 编程语言 |
---|---|
ert.tlc |
c++ |
autosar.tlc |
C |
autosar_adaptive.tlc |
c++ |
共享实用程序函数的命名规则必须包含条件校验和令牌$ C
。要自定义代码生成器生成的校验和的长度,请使用参数共享校验和长度(SharedChecksumLength
) .增加校验和的长度可以减少冲突的概率。
这个例子展示了C代码生成的共享实用程序函数名的定制。
打开示例模型rtwdemo_配置默认值
和嵌入式编码器应用程序。
设定模型组态参数共享代码放置来共享位置
.
打开嵌入式编码器字典。上C代码选项卡上,选择代码接口>嵌入式编码词典.
上功能定制模板选项卡上,单击添加添加新的功能自定义模板。
对于函数定制模板,请指定以下配置:
的名字:可分享性
函数名:mymodel_ N C美元
您可以使用字符串自定义此格式。您必须包含令牌$ C
.
打开代码映射编辑器。上C代码选项卡上,选择代码接口>默认代码映射.
上功能默认值选项卡,用于共享效用类别、配置功能定制模板作为可分享性
.
生成代码和代码生成报告。
在报告的左侧导航窗格中,查看下面为共享实用程序生成的文件列表共享文件.
使用模型配置参数控制共享实用程序代码的位置共享代码放置.默认选项值为自动的
. 对于此设置,代码生成器将定点和其他实用程序所需的代码放置在
文件,模型
.c
文件,或构建文件夹中的单独文件(例如,模型
. cppvdp_grt_rtw
),如果模型不包含现有的共享实用程序代码或以下代码块之一:
模型块
金宝app仿真软件的功能块
函数调用者块
从状态流或调用Si金宝appmulink函数MATLAB函数块
选择参数时的状态流图形函数导出图级别功能
如果模型包含前面的一个或多个块,代码生成器将在中创建并使用共享实用程序文件夹slprj
.共享工具文件夹的命名约定为slprj/
目标
/ _sharedutils
.目标
是sim卡
为模拟模型块或用于代码生成的系统目标文件的名称。
Slprj /grt/_sharedutils % folder used with grt. Slprj /sim/_sharedutils % folder used with grt. Slprj /sim/_sharedutils % folder used with grt。tlc STF slprj/ert/_sharedutils %文件夹tlc底座slprj/mytarget/_sharedutils % folder used with mytarget.tlc STF
强制模型构建使用slprj
文件夹用于共享实用程序生成,即使当前模型不包含现有的共享实用程序代码或前面的块之一,也要设置参数共享代码放置来共享位置
.代码生成器将实用程序放在slprj
文件夹,而不是在普通构建文件夹中。当您手动组合来自多个模型的代码时,此设置非常有用,因为它可以防止模型之间的符号冲突。
生成的rtwtypes.h
头文件提供了基本类型定义,#定义
语句和枚举。有关更多信息,请参见rtwtypes.h.
通过选择构建过程是否使用共享实用程序文件夹来控制rtwtypes.h文件的位置。如果模型构建使用共享的实用程序文件夹,则构建过程放置rtwtypes.h
在slprj/
.否则,软件放置目标
/ _sharedutilsrtwtypes.h
在
.模型
_目标
_rtw
向模型层次结构中添加模型或更改层次结构中的现有模型都可能导致对共享的更新rtwtypes.h
文件在代码生成期间。如果发生更新,重新编译,并根据您的开发过程,重新验证先前生成的代码。最小化对rtwtypes.h
文件,在“配置参数”对话框中进行如下修改:
选择模型配置参数金宝app支持:复数即使模型当前不使用复杂数据类型。选择此参数可以防止将来在集成代码时添加对复杂数据类型的支持。金宝app
明确的参数金宝app支持非内联S-functions.如果在模型中使用非线性s函数,这个选项会生成一个错误。
明确的参数经典的调用接口.该参数设置禁用使用GRT系统目标文件。
导出的头文件出现在共享实用程序文件夹:
您可以通过定义和应用存储类来控制信号、参数和状态声明的文件位置。
代码生成器将实用程序代码放置在共享位置。
例如,可以使用以下命令指定数据的头文件:
如果您希望声明出现在文件中
,最佳实践是不指定头文件名称。默认情况下,代码生成器放入数据声明模型
.h
.模型
.h
如果您指定
作为头文件名,如果代码生成器将实用程序代码放置在共享位置,则无法从模型生成代码。代码生成器无法创建该文件模型
.h
在model build文件夹和shared utility文件夹中。模型
.h
您可以指定模型构建在共享实用程序文件夹中生成C源文件。看到生成共享实用程序代码.这些文件包括包含函数定义的C源文件和包含宏定义的头文件。在本文中,函数一词指的是函数和宏。
当您使用模型引用或从同一个start build文件夹构建多个独立模型时,相同模型中的块和不同模型中的块都可以使用共享函数。对于第一个触发代码生成的代码块,代码生成器只为给定函数生成一次代码。当产品确定为后续块生成函数代码的需求时,它执行一个文件存在性检查。如果该文件存在,则模型构建不会重新生成该函数。共享实用程序代码机制要求给定的函数和文件名表示相同的函数行为,而不管生成函数的是哪个块或模型。为了满足这一要求:
决定函数行为的模型属性有助于共享实用程序校验和或决定函数和文件名。
决定函数行为的块属性也决定了函数和文件名。
在编译期间,共享实用程序文件夹的生成文件规则选择只编译新的C文件,并增量地将目标文件归档到共享实用程序库中,rtwshared.lib
或rtwshared.a
.增量编译也会发生。
设置模型配置参数时共享代码放置来共享位置
或者当模型包含模型块时,代码生成器将共享代码放在共享实用程序文件夹中。构建过程生成共享代码的代码生成配置的共享实用程序校验和。
在随后的代码生成期间,如果校验和文件slprj/
相对于当前文件夹存在时,代码生成器将读取该文件。代码生成器验证您正在构建的当前模型是否具有与共享实用程序模型的属性校验和相匹配的配置属性。中定义的属性之间发生不匹配目标
/ _sharedutils checksummap.mat检查汇总表
在当前的模型属性中,你会看到一个错误。使用错误消息来管理校验和(例如,诊断和解决当前模型的配置问题)。
查看构成校验和的属性值是有帮助的。本示例使用rtwdemo_lct_start_term.slx
模型。加载checksum.mat
文件转换成MATLAB®并查看目标结构
定义校验和相关属性的:
打开rtwdemo_lct_start_term.slx
模型。在命令窗口中,输入:
rtwdemo_lct_start_term
创建并移动到一个新的工作文件夹。
mkdirC:\Temp\democdC:\Temp\demo
在文件夹中保存模型的副本。
构建模型,该模型的建立是为了产生共享的公用事业。
上应用程序选项卡,在代码生成,点击金宝app仿真软件编码器.
上C代码选项卡,在生成代码部分,单击建造按钮。
搬到_sharedutils
由构建过程创建的文件夹。
cdC: \ Temp \ demo \ grt slprj \ \ _sharedutils
加载检查汇总表
文件到MATLAB。
负载checksummap
显示hashTbl.targetInfoStruct
并检查与校验和相关的属性值。
hashTbl.targetInfoStruct
对于本例,将显示命令窗口hashTbl.targetInfoStruct
对于从模型生成的共享实用程序:
ans=struct,带字段:shiftrightintarth:'on'prodshiftrightintarth:'on'Endianess:'LittleEndian'ProdEndianess:'LittleEndian'字长:'8,16,32,64,32,32,32,32,32,64,64'prodWordLength:'8,16,32,64,64'TargetWordSize:'64'targetWordDeviceType:'Custom Processor->MATLAB Host Computer'prodDeviceType:'英特尔->x86-64(Windows64)'TargetIntDivRoundTo:'Zero'ProdIntDivRoundTo:'Zero'UseDivisionForNetSlopeComputing:'off'PurelyIntegerCode:'off'PortableWordSizes:'off'支持NonLinedSFCns:'RtWresplacementTypes:'MaxDint8:'MAX\u int8\u T'MaxDint8:'MAX\u int8\u 金宝appT'MaxDint16:'MAX\u int16\u T'MaxDint16:“MAX_uint16_T”MaxIdInt32:“MAX_uint32_T”minidin32:“MIN_uint32_T”MaxIdInt32:“MAX_uint32_T”MaxIdInt64:“MAX_uint64_T”minidin64:“MAX_uint64_T”MaxIdInt64:“MAX_uint64_T”BooleanTrueId:“true”BooleanFalseId:“false”TypeLimitIdReplacementHeaderFile:“SharedDepositionory:”TargetLang:“C”保留外部索引:“on”ImplementImageWithCVMat:“off”EnableSignedRightShifts:“on”EnableSignedLeftShifts:“on”TflName:“None”TflCheckSum:[2.1946e+09 3.7762e+09 3.7700e+09 3.6906e+09]UtilmesCpRestatement:“UtilmesCpostStatement:”UtilmesAccount:“CodeOverageChecksum:[3.6498e+09 78774415 2.5508e+09 2.1183e+09]TaGeAdvestEngestixIdio:“C++”ToalEngestStasixFix:“Char”PudLoestEngestFigFrand:“浮动”LangLangMead:“on”PodLoLangLangMead:“Office”TochChaNoRTMF:“微软Visual C++ 2017 Vx0.0nnFube(64位Windows)”
检查目标结构
共享实用模型中的哈希表。一些键值对直接与模型属性相关。其他键值对与属性组相关。
下表介绍了键值对。
关键名称 | 模型属性 |
---|---|
ShiftRightIntArith |
TargetShiftRightIntArith |
ProdShiftTrightIntarith |
ProdShiftTrightIntarith |
Endianess |
TargetEndianess |
ProdEndianess |
ProdEndianess |
字 |
TargetBitPerChar ,塔吉特比特肖特 ,TargetBitPerInt ,TargetBitPerLong ,TargetBitPerLongLong ,TargetBitPerFloat ,TargetBitPerDouble ,TargetBitPerPointer |
ProdWordLength |
前鲈鱼 ,ProdBitPerShort ,ProdBitPerInt ,ProdBitPerLong ,ProdBitPerLongLong ,ProdBitPerFloat ,ProdBitPerDouble ,ProdBitPerPointer |
目标尺寸 |
目标尺寸 |
ProdWordSize |
ProdWordSize |
TargetHWDeviceType |
TargetHWDeviceType |
ProdHWDeviceType |
ProdHWDeviceType |
TargetIntDivRoundTo |
TargetIntDivRoundTo |
ProdIntDivRoundTo |
ProdIntDivRoundTo |
UseDivisionForNetSlopeComputation |
UseDivisionForNetSlopeComputation |
PurelyIntegerCode |
PurelyIntegerCode |
可移植字号 |
可移植字号 |
金宝app支持非linedsfcns |
金宝app支持非linedsfcns |
RTWReplacementTypes |
EnableUserReplacementTypes, ReplacementTypes |
MaxIdInt8 |
MaxIdInt8 |
MinIdInt8 |
MinIdInt8 |
MaxIdUint8 |
MaxIdUint8 |
最大值16 |
最大值16 |
迷你16 |
迷你16 |
最大值16 |
最大值16 |
MaxIdInt32 |
MaxIdInt32 |
MinIdInt32 |
MinIdInt32 |
MaxIdUint32 |
MaxIdUint32 |
MaxIdInt64 |
MaxIdInt64 |
迷你64 |
迷你64 |
MaxIdUint64 |
MaxIdUint64 |
BooleanTrueId |
BooleanTrueId |
BooleanFalseId |
BooleanFalseId |
TypeLimitIdReplacementHeaderFile |
TypeLimitIdReplacementHeaderFile |
SharedCodeRepository |
预留(仅供内部使用) |
TargetLang |
TargetLang |
PreserveExternInFcnDecls |
PreserveExternInFcnDecls |
EnableSignedRightShifts |
EnableSignedRightShifts |
EnableSignedLeftShifts |
EnableSignedLeftShifts |
TflName |
代码替换库 |
TflCheckSum |
预留(仅供内部使用) |
使用费 |
MemSecFuncSharedUtil ,MemSecPackage |
UtilMemSecPostStatement |
MemSecFuncSharedUtil ,MemSecPackage |
使用说明 |
MemSecFuncSharedUtil ,MemSecPackage |
CodeCoverageChecksum |
预留(仅供内部使用) |
TargetLargestAtomicInteger |
TargetLargestAtomicInteger |
TargetLargestAtomicFloat |
TargetLargestAtomicFloat |
ProdLargestAtomicInteger |
ProdLargestAtomicInteger |
ProdLargestAtomicFloat |
ProdLargestAtomicFloat |
LongLongMode |
TargetLongLongMode |
ProdLongLongMode |
ProdLongLongMode |
胶原离心压 |
预留(仅供内部使用) |
toolchainOrTMF |
名称:
|