文档

生成共享实用程序代码

何时生成共享实用程序代码

模型中的块可能需要共同的功能来实现它们的算法。考虑将此功能模块化为独立的支持或帮助函数。金宝app这种方法比内联每个块实例的功能代码更有效。要决定是使用库还是共享实用程序,请考虑:

  • 在静态定义函数时,将具有多个调用者的函数打包到库中。也就是说,在使用代码生成器为模型生成代码之前,函数源代码存在于一个文件中。

  • 当函数不能静态定义时,将具有多个调用者的函数打包为共享实用程序(在代码生成期间生成)。例如,一些特定于模型和块的属性指定使用哪些函数及其行为。此外,这些属性还决定类型定义(例如,typedef.)在共享工具头文件中。决定唯一行为的属性的可能组合的数量使得在代码生成之前静态地定义可能的函数文件是不切实际的。

配置生成函数的命名

通过使用其中一种方法配置生成的共享实用程序函数的默认命名规则。

配置 行动
属性映射默认自定义设置的新模型或现有模型映射编辑器代码或代码默认映射编程接口 嵌入式编码字典,定义指定自定义函数命名规则的函数自定义模板。然后,在映射编辑器代码或者使用代码默认映射编程接口,映射共享效用函数类别。有关更多信息,请参见配置用于模型数据和函数类别的默认C代码生成(嵌入式编码)。
在R2018a之前的版本中创建的模型,并且没有配置映射编辑器代码或默认的映射编程接口 设置模型配置参数共享实用程序标识符格式CustomSymbolsStrUtil)的自定义函数命名规则。有关更多信息,请参见标识符的格式控制(嵌入式编码)。

一旦你使用映射编辑器代码或默认映射编程接口来配置模型,设置模型配置参数共享实用程序标识符格式不影响代码生成。

共享实用程序函数的命名规则必须包含条件校验和令牌$ C.要自定义代码生成器生成的校验和的长度,请使用参数共享的校验和长度SharedChecksumLength) .增加校验和的长度可以减少冲突的概率。

这个示例展示了共享实用程序函数名的定制。

  1. 打开示例模型rtwdemo_crlmath

  2. 设定模型组态参数共享代码的位置共享位置

  3. 设置参数共享实用程序标识符格式mymodel_ N C美元.您可以使用字符串自定义此格式。但是,您必须包含令牌$ C

  4. 设置参数共享的校验和长度5

  5. 生成代码和代码生成报告。

  6. 在报告的左侧导航窗格中,查看列表生成的共享实用程序的文件共享文件

共享实用程序代码的控制位置

使用模型配置参数控制共享实用程序代码的位置共享代码的位置.默认选项值为汽车.对于此设置,代码生成器将固定点所需的代码和其他实用程序放在模型.c文件,模型. cpp文件,或构建文件夹中的单独文件(例如,vdp_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用于共享实用程序的文件夹,即使当前模型不包含现有共享实用程序代码或上述块之一,SET参数共享代码的位置共享位置.代码生成器将实用程序放在slprj文件夹,而不是在普通构建文件夹中。当您手动组合来自多个模型的代码时,此设置非常有用,因为它可以防止模型之间的符号冲突。

控制共享实用程序代码rtwtypes.h的位置

生成的rtwtypes.h头文件提供了基本类型定义,#定义陈述和枚举。有关更多信息,请参见rtwtypes.h

通过选择构建过程是否使用共享实用程序文件夹来控制rtwtypes.h文件的位置。如果模型构建使用共享的实用程序文件夹,则构建过程放置rtwtypes.hslprj /目标/ _sharedutils.否则,软件放置rtwtypes.h模型_目标_rtw

向模型层次结构中添加模型或更改层次结构中的现有模型都可能导致对共享的更新rtwtypes.h文件在代码生成期间。如果发生更新,重新编译,并根据您的开发过程,重新验证先前生成的代码。最小化对rtwtypes.h文件,在“配置参数”对话框中进行以下更改:

  • 选择模型配置参数金宝app支持:复数即使模型当前不使用复杂数据类型。选择此参数可以防止将来在集成代码时添加对复杂数据类型的支持。金宝app

  • 明确的参数金宝app支持非内联S-functions.如果在模型中使用非线性s函数,这个选项会生成一个错误。

  • 明确的参数经典的调用接口.该参数设置禁用使用GRT系统目标文件。

避免导出数据的头文件重复

导出的头文件出现在共享实用程序文件夹:

  • 您可以通过定义和应用存储类来控制信号、参数和状态声明的文件位置。

  • 代码生成器将实用程序代码放置在共享位置。

例如,可以使用以下命令指定数据的头文件:

  • 类中定义的存储类嵌入式编码字典并映射到模型数据的类别映射编辑器代码

  • 代码生成选项卡中的信号属性。

  • HeaderFile属性。数据对象是类的对象金宝app仿真软件。信号金宝app仿真软件。参数

如果您希望声明出现在文件中模型.h,最佳实践是不指定头文件名称。默认情况下,代码生成器放入数据声明模型.h

如果您指定模型.h作为头文件的名称,如果代码生成器将实用程序代码放在共享位置,则不能从模型生成代码。代码生成器无法创建文件模型.h在模型构建文件夹和共享工具文件夹中。

使用增量构建减少共享实用程序代码生成

您可以指定模型构建在共享实用程序文件夹中生成C源文件。看到生成共享实用程序代码.这些文件包括包含函数定义的C源文件和包含宏定义的头文件。在本文中,函数一词指的是函数和宏。

在不同模型中的相同模型和块中的块可以在使用模型引用时使用共享功能或从同一启动构建文件夹构建多个独立模型时。代码生成器仅为第一次触发代码生成的块产生给定函数的代码。由于产品确定为后续块生成功能代码的要求,它执行文件存在检查。如果文件存在,则模型构建不会重新生成该函数。共享实用程序代码机制要求给定的函数和文件名表示相同的功能行为,无论哪个块或模型都生成函数。为了满足这一要求:

  • 决定函数行为的模型属性有助于共享实用程序校验和或决定函数和文件名。

  • 决定函数行为的块属性也决定了函数和文件名。

在编译期间,共享实用程序文件夹的Makefile规则选择仅汇编新的C文件并将对象文件逐渐存档到共享实用程序库中,rtwshared.lib,或rtwshared.a.增量编译也会发生。

管理共享实用程序代码校验和

当您设置模型配置参数时共享代码的位置共享位置或者当模型包含模型块时,代码生成器将共享代码放在共享实用程序文件夹中。构建过程生成共享代码的代码生成配置的共享实用程序校验和。

在随后的代码生成期间,如果校验和文件slprj /目标/ _sharedutils checksummap.mat相对于当前文件夹存在时,代码生成器将读取该文件。代码生成器验证您正在构建的当前模型是否具有与共享实用程序模型的属性校验和相匹配的配置属性。中定义的属性之间发生不匹配checksummap.mat在当前的模型属性中,你会看到一个错误。使用错误消息来管理校验和(例如,诊断和解决当前模型的配置问题)。

查看共享实用程序校验和哈希表

查看有助于校验和的财产值是有帮助的。此示例使用rtwdemo_lct_start_term.slx模型。加载checksum.mat文件到MATLAB®并查看targetInfoStruct它定义了校验和相关的属性:

  1. 打开rtwdemo_lct_start_term.slx模型。在命令窗口中,输入:

    rtwdemo_lct_start_term
  2. 创建并移动到一个新的工作文件夹。

    mkdirC: \ Temp \ democdC: \ Temp \ demo
  3. 在文件夹中保存模型的副本。

  4. 构建的模型。这个模型已经建立,以产生共享的公用事业。

  5. 搬到_sharedutils由构建过程创建的文件夹。

    cdC: \ Temp \ demo \ grt slprj \ \ _sharedutils
  6. 加载checksummap.mat文件到MATLAB。

    负载checksummap
  7. 显示hashTbl.targetInfoStruct并检查校验和相关的属性值。

    hashTbl.targetInfoStruct

对于本例,将显示命令窗口hashTbl.targetInfoStruct对于从模型生成的共享实用程序:

> > hashTbl。目标InfoStruct ans = struct with fields: ShiftRightIntArith: 'on' ProdShiftRightIntArith: 'on' Endianess: 'LittleEndian' ProdEndianess: 'LittleEndian' wordlengths: '8,16,32,32,64,32,64,64,64,64' Prodwordlengths: '8,16,32,32,64,32,64,64,64,64' TargetWordSize: '64' ProdWordSize: '64' TargetHWDeviceType: 'Custom Processor->MATLAB Host Computer' ProdHWDeviceType: 'Intel->x86-64 (Windows64)' TargetIntDivRoundTo: 'Zero' ProdIntDivRoundTo: 'Zero' UseDivisionForNetSlopeComputation: 'off' PurelyIntegerCode: 'off' PortableWordSizes: 'off' SupportNonInlinedSFcns: '' RTWReplacementTypes: '' MaxIdInt8: 'MAX_int8_T' MinIdInt8: 'MIN_int8_T' MaxIdUint8: 'MAX_uint8_T' MaxIdInt16: 'MAX_int16_T' MinIdInt16: 'MIN_int16_T' MaxIdUint16: 'MAX_uint16_T' MaxIdInt32: 'MAX_int32_T' MinIdInt32: 'MIN_int32_T' MaxIdUint32: 'MAX_uint32_T' MaxIdInt64: 'MAX_int64_T' MinIdInt64: 'MIN_int64_T' MaxIdUint64: 'MAX_uint64_T' BooleanTrueId: 'true' BooleanFalseId: 'false' TypeLimitIdReplacementHeaderFile: '' SharedCodeRepository: '' TargetLang: 'C' PreserveExternInFcnDecls: 'on' EnableSignedRightShifts: 'on' EnableSignedLeftShifts: 'on' TflName: 'None' TflCheckSum: [3.9717e+09 1.7460e+09 2.4002e+09 1.5189e+09] UtilMemSecName: 'Default' CodeCoverageChecksum: [3.6498e+09 78774415 2.5508e+09 2.1183e+09] TargetLargestAtomicInteger: 'Char' TargetLargestAtomicFloat: 'None' ProdLargestAtomicInteger: 'Char' ProdLargestAtomicFloat: 'Float' LongLongMode: 'on' ProdLongLongMode: 'off' CollapseNonTrivialExpressions: 'false' toolchainOrTMF: 'Microsoft Visual C++ 2017 v15.0 | nmake (64-bit Windows)'

关联共享实用程序校验和配置参数

检查targetInfoStruct共享本实用新型的哈希表。有些键值对直接与模型属性相关。其他对与一组性质有关。

下表描述了键值对。

关键的名字 模型属性
ShiftRightIntArith TargetShiftRightIntArith
ProdShiftRightIntArith ProdShiftRightIntArith
Endianess TargetEndianess
ProdEndianess ProdEndianess
TargetBitPerCharTargetBitPerShortTargetBitPerIntTargetBitPerLongTargetBitPerLongLongTargetBitPerFloatTargetBitPerDoubleTargetBitPerPointer
Prodwordlengths ProdBitPerCharProdBitPerShortProdBitPerIntProdBitPerLongProdBitPerLongLongProdBitPerFloatProdBitPerDoubleProdBitPerPointer
TargetWordSize TargetWordSize
prodwordsize. prodwordsize.
TargetHWDeviceType TargetHWDeviceType
ProdHWDeviceType ProdHWDeviceType
TargetIntDivRoundTo TargetIntDivRoundTo
ProdIntDivRoundTo ProdIntDivRoundTo
UseDivisionForNetSlopeComputation UseDivisionForNetSlopeComputation
PurelyIntegerCode PurelyIntegerCode
PortableWordSizes PortableWordSizes
金宝appSupportNonInlinedSFcns 金宝appSupportNonInlinedSFcns
RTWReplacementTypes enateUserReplacementTypes,更换型
MaxIdInt8 MaxIdInt8
Minidint8. Minidint8.
MaxIdUint8 MaxIdUint8
MaxIdInt16 MaxIdInt16
MinIdInt16 MinIdInt16
MaxIdUint16 MaxIdUint16
MaxIdInt32 MaxIdInt32
MinIdInt32 MinIdInt32
MaxIdUint32 MaxIdUint32
MaxIdInt64 MaxIdInt64
MinIdInt64 MinIdInt64
MaxIdUint64 MaxIdUint64
BooleanTrueId BooleanTrueId
BooleanFalseId BooleanFalseId
TypeLimitIdReplacementHeaderFile TypeLimitIdReplacementHeaderFile
SharedCodeRepository 预留(仅供内部使用)
TargetLang TargetLang
PreserveExternInFcnDecls PreserveExternInFcnDecls
EnableSignedRightShifts EnableSignedRightShifts
EnableSignedLeftShifts EnableSignedLeftShifts
TflName CodeReplacementLibrary
TflCheckSum 预留(仅供内部使用)
UtilMemSecName MemSecFuncSharedUtilMemsecpackage.
CodeCoverageChecksum 预留(仅供内部使用)
TargetLargestAtomicInteger TargetLargestAtomicInteger
TargetLargestAtomicFloat TargetLargestAtomicFloat
ProdLargestAtomicInteger ProdLargestAtomicInteger
ProdLargestAtomicFloat ProdLargestAtomicFloat
LonglongMode. TargetLongLongMode
ProdLongLongMode ProdLongLongMode
CollapseNonTrivialExpressions 预留(仅供内部使用)
toolchainOrTMF

名称:

  • 工具链,如果构建过程使用工具链(工具链)或与工具链相关联的模板生成文件。

  • 模板生成文件,如果构建过程使用模板生成文件(TemplateMakefile).

相关的话题