文档

定义代码替换库优化

代码替换库包含一个或多个代码替换表。每个表包含一个或多个代码替换项。每个条目包含一个映射和条目参数。该条目将自动生成的MATLAB或Simulink函数的概念表示映射到优化的C或c++函数的实现表示。金宝app条目参数描述代码生成器在代码替换期间要执行的附加属性。

要定义代码替换库,首先要在自定义文件中定义代码替换表。然后,在注册步骤中,通过选择要包含在库中的表来创建代码替换库。您可以使用相同的工作流程以交互方式或编程方式定义代码替换表。

交互式和程序化方法都遵循以下8个步骤:

  1. 打开环境。

  2. 创建一个表。

  3. 创建一个条目。

  4. 创建入口参数。

  5. 创造概念表现。

  6. 创建实现表示。

  7. 指定构建信息。

  8. 验证并保存。

交互式开发一个代码替换库

  1. 打开环境。

    要以交互方式创建代码替换库,请打开代码替换工具(crtool)从MATLAB命令行中使用以下命令:

    > > crtool
  2. 创建一个表。

    代码替换表将代码替换项组织到更容易管理的组中。

    创建一个代码替换表。

    1. 从crtool菜单中选择文件>新表

    2. 在右窗格中,命名表并单击应用

  3. 创建一个条目。

    代码替换表项包含项参数和描述生成函数的概念表示到描述该函数的优化实现的实现表示的映射。

    要创建代码替换条目,请使用以下方法之一:

    • 从crtool工具栏中,单击条目类型图标,选择条目类型

    • 从crtool菜单中选择文件>新条目>条目类型

    • 右键单击一个表并选择新条目>条目类型

    新条目出现在中间窗格中,但没有显示名称。

  4. 创建入口参数。

    入口参数指定代码生成器在代码替换期间要实现的优化和构建需求。这些参数各不相同,根据函数替换的类型自动出现在crtool界面的各个部分。

    创建入口参数。

    • 函数操作下拉列表中,选择需要替换的函数名称。

    这个选择决定了crtool中出现的条目参数。

  5. 创造概念表现。

    概念表示描述要替换的函数的签名。概念表示由函数名、返回实参和形参组成。返回实参称为输出实参,形参称为输入实参。用名称、I/O类型以及crtool中出现的其他属性(取决于替换的类型)指定每个概念参数。

    定义你的概念表征:

    • 概念功能概念上的操作crtool的子部分,指定您希望代码生成器替换的函数的输入和输出参数。

  6. 创建实现表示。

    实现表示描述了在代码替换库中定义的替换函数的签名。实现表示由函数名、返回实参和形参组成。用类型、类型限定符和复杂性指定每个实现参数。

    要定义你的实现表示:

    • 实现功能操作函数crtool的子部分,为在代码替换库中定义的优化函数指定输入和输出参数。

  7. 指定构建信息。

    构建信息为代码生成器提供执行功能替换的文件。

    指定构建信息:

    • 在crtool中,单击构建信息选项卡以打开构建需求窗格。在这些字段中指定必要的构建信息:

    参数 描述
    实现头文件 代码替换所需的头文件的名称。
    实现源文件 代码替换所需的源文件的名称。
    附加头文件/包含路径 代码替换所需的附加头文件的名称或路径。
    额外的源文件/路径 代码替换所需的其他源文件的名称或路径。
    附加的目标文件/路径 代码替换所需的其他目标文件的名称或路径。
    其他链接标志 标记链接器为替换代码生成可执行文件所需的标记。
    其他编译标志 标记编译器为替换代码生成目标代码所需的标记。
    复制文件到构建目录 标记是否在生成代码之前将生成替换代码所需的头文件、源文件或目标文件复制到构建文件夹中。如果指定文件附加头文件/包含路径额外的源文件/路径当你复制文件时,编译器和工具(如packNGo)可能会发现文件的重复实例。
  8. 验证并保存。

    将代码替换库以与MATLAB路径上的代码替换表相同的名称保存。保存库会自动验证未验证的内容。

    验证并保存库:

    • 从crtool菜单中选择文件>保存表>保存

以编程方式开发一个代码替换库

  1. 打开环境。

    要以编程方式创建代码替换库,请打开MATLAB函数文件。从MATLAB菜单中选择>函数

  2. 创建一个表。

    代码替换表将代码替换项组织到更容易管理的组中。

    创建一个代码替换表。

    1. 创建一个可用于调用代码替换库表的函数。函数不应该有参数并返回一个表对象。

    2. 创建一个表对象,调用环球套票。TflTable

    函数hTable = code_replacement_library_table()创建一个函数来调用代码替换库表创建代码替换库表对象hTable = RTW.TflTable;结束
  3. 创建一个条目。

    代码替换表项包含项参数和生成函数的概念表示到该函数的优化实现的实现表示的映射。

    创建一个代码替换表。

    1. 确定要替换的函数类型。

    2. 调用相应的Entry函数在表中创建一个条目。

    函数hTable = code_replacement_library_table()创建一个函数来调用代码替换库表创建代码替换库表对象hTable = RTW.TflTable;创建代码替换库条目从下面的列表中选择一个hEntry = RTW.TFLCOperationEntry;hEntry = RTW.TflCFunctionEntry;hEntry = RTW.TflBlasEntryGenerator;hEntry = RTW.TflCBlasEntryGenerator;hEntry = RTW.TflCOperationEntryGenerator;hEntry = RTW.TflCOperationEntryGenerator_NetSlope;hEntry = RTW.TflCSemaphoreEntry;hEntry = RTW.TflCFunctionEntryML;hEntry = RTW.TflCOperationEntryML;结束
  4. 创建入口参数。

    入口参数指定代码生成器在代码替换期间要实现的优化和构建需求。这些参数取决于函数替换的类型。

    创建输入参数:

    • 调用与上一步(第3步)中确定的要替换的函数类型相对应的Set Parameters函数。

      你想要替换的功能类型 设置参数功能
      数学运算,BLAS运算,CBLAS运算,定点运算,净斜率定点运算,自定义运算 setTflCOperationEntryParameters
      功能,自定义功能 setTflCFunctionEntryParameters
      信号量或互斥锁 setTflCSemaphoreEntryParameters

      显示每个Set Parameter函数时,将所有可用属性设置为它们的默认值。需要指定的确切属性和值取决于要替换的函数。有关具体替换细节,请参阅示例。

      函数hTable = code_replacement_library_table()创建一个函数来调用代码替换库表创建代码替换库表对象hTable = RTW.TflTable;创建代码替换库条目从下面的列表中选择一个hEntry = RTW.TFLCOperationEntry;hEntry = RTW.TflCFunctionEntry;hEntry = RTW.TflBlasEntryGenerator;hEntry = RTW.TflCBlasEntryGenerator;hEntry = RTW.TflCOperationEntryGenerator;hEntry = RTW.TflCOperationEntryGenerator_NetSlope;hEntry = RTW.TflCSemaphoreEntry;hEntry = RTW.TflCFunctionEntryML;hEntry = RTW.TflCOperationEntryML;%%创建表项参数从下面的列表中选择一个hEntry.setTflCOperationEntryParameters (...“关键”' '...“优先”, 100,...“AcceptExprInput”,真的,...“AdditionalHeaderFiles”{},...“AdditionalIncludePaths”{},...“AdditionalLinkObjs”{},...“AdditionalLinkObjsPaths”{},...“AdditionalSourceFiles”{},...“AdditionalSourcePaths”{},...“AdditionalCompileFlags”{},...“AdditionalLinkFlags”{},...“AllowShapeAgnostic”假的,...“ArrayLayout”“COLUMN_MAJOR”...“EntryInfoAlgorithm”“RTW_CAST_BEFORE_OP”...“GenCallback”' '...“ImplementationHeaderFile”' '...“ImplementationHeaderPath”' '...“ImplementationName”' '...“ImplementationSourceFile”' '...“ImplementationSourcePath”' '...“ImplType”“FCN_IMPL_FUNCT”...“MustHaveZeroNetBias”假的,...“NetFixedExponet”0,...“NetAdjustmentFactor”, 1...“RoundingModes”“RTW_ROUND_UNSPECIFIED”...“SaturationMode”“RTW_SATURATE_UNSPECIFIED”...“调查”假的,...“SlopesMustBeTheSame”假的,...“StoreFcnReturnInLocalVar”、假);hEntry.setTflCFunctionEntryParameters (...“关键”' '...“优先”, 100,...“AcceptExprInput”,真的,...“AdditionalHeaderFiles”{},...“AdditionalIncludePaths”{},...“AdditionalLinkObjs”{},...“AdditionalLinkObjsPaths”{},...“AdditionalSourceFiles”{},...“AdditionalSourcePaths”{},...“AdditionalCompileFlags”{},...“AdditionalLinkFlags”{},...“ArrayLayout”“COLUMN_MAJOR”...“EntryInfoAlgorithm”“RTW_DEFAULT”...“GenCallback”' '...“ImplementationHeaderFile”' '...“ImplementationHeaderPath”' '...“ImplementationName”' '...“ImplementationSourceFile”' '...“ImplementationSourcePath”' '...“ImplType”“FCN_IMPL_FUNCT”...“RoundingModes”“RTW_ROUND_UNSPECIFIED”...“SaturationMode”“RTW_SATURATE_UNSPECIFIED”...“调查”假的,...“StoreFcnReturnInLocalVar”、假);hEntry.setTflCSemaphoreEntryParameters (...“关键”' '...“优先”, 100,...“AcceptExprInput”,真的,...“AdditionalHeaderFiles”{},...“AdditionalIncludePaths”{},...“AdditionalLinkObjs”{},...“AdditionalLinkObjsPaths”{},...“AdditionalSourceFiles”{},...“AdditionalSourcePaths”{},...“AdditionalCompileFlags”{},...“AdditionalLinkFlags”{},...“GenCallback”' '...“ImplementationHeaderFile”' '...“ImplementationHeaderPath”' '...“ImplementationName”' '...“ImplementationSourceFile”' '...“ImplementationSourcePath”' '...“ImplType”“FCN_IMPL_FUNCT”...“RoundingModes”“RTW_ROUND_UNSPECIFIED”...“SaturationMode”“RTW_SATURATE_UNSPECIFIED”...“调查”假的,...“StoreFcnReturnInLocalVar”、假);结束
  5. 创造概念表现。

    概念表示描述要替换的函数的签名。它由函数名、返回实参和形参组成。返回实参称为输出实参,形参称为输入实参。用必需的属性指定每个概念参数,并根据替换类型指定其他可选属性。

    所需的属性:

    • 的名字-定义为y1..Yn为输出参数,u1..UN用于输入参数

    • I / O型-定义为RTW_IO_OUTPUTRTW_IO_INPUT

    要定义你的概念表示,可以使用以下方法之一:

    方法 函数 目标
    1 createAndAddConceptualArg

    定制和控制。

    如果您想显式地将参数指定为标量或矩阵和其他属性。

    2 getTflArgFromString

    快速原型。

    如果您想用内置数据类型快速指定参数。

    在显示编程方法时,将所有可用属性设置为默认值。需要指定的确切属性和值取决于要替换的函数。有关具体替换细节,请参阅示例。

    函数hTable = code_replacement_library_table()创建一个函数来调用代码替换库表创建代码替换库表对象hTable = RTW.TflTable;创建代码替换库条目从下面的列表中选择一个hEntry = RTW.TFLCOperationEntry;hEntry = RTW.TflCFunctionEntry;hEntry = RTW.TflBlasEntryGenerator;hEntry = RTW.TflCBlasEntryGenerator;hEntry = RTW.TflCOperationEntryGenerator;hEntry = RTW.TflCOperationEntryGenerator_NetSlope;hEntry = RTW.TflCSemaphoreEntry;hEntry = RTW.TflCFunctionEntryML;hEntry = RTW.TflCOperationEntryML;%%创建表项参数从下面的列表中选择一个查看属性,请参见步骤4hEntry.setTflCOperationEntryParameters ();hEntry.setTflCFunctionEntryParameters ();hEntry.setTflCSemaphoreEntryParameters ();创建概念表示方法1:createAndAddConceptualArg% arg = createAndAddConceptualArg(hEntry, argType, varargin)% argType - 'RTW. 'TflArgNumeric”| 'RTW.TflArgMatrix'% varargin - 'name', 'value'对设置为默认值,%包括名称和I/O类型定义输出参数hEntry.createAndAddConceptualArg (...“环球套票。TflArgNumeric”...“名字”“日元”...“IOType”“RTW_IO_OUTPUT”...“IsSigned”,真的,...“字”32岁的...“CheckSlope”,真的,...“CheckBias”,真的,...“DataTypeMode”“定点:二进位点缩放”...“数据类型”“固定”...“缩放”“BinaryPoint”...“坡”, 1...“SlopeAdjustmentFactor”, 1.0,...“FixedExponent”, -15,...“偏见”, 0.0,...“FractionLength”15岁的...“基类型”“双”...“DimRange”, (2, 2));定义输入参数hEntry.createAndAddConceptualArg (...“环球套票。TflArgNumeric”...“名字”‘u1’...“IOType”“RTW_IO_OUTPUT”...“IsSigned”,真的,...“字”32岁的...“CheckSlope”,真的,...“CheckBias”,真的,...“DataTypeMode”“定点:二进位点缩放”...“数据类型”“固定”...“缩放”“BinaryPoint”...“坡”, 1...“SlopeAdjustmentFactor”, 1.0,...“FixedExponent”, -15,...“偏见”, 0.0,...“FractionLength”15岁的...“基类型”“双”...“DimRange”, (2, 2));方法2:getTflArgFromString% arg = getTflArgFromString(hEntry,名称,I/O类型)% name- y1..Yn | u1..un% I/O类型- RTW_IO_OUTPUT | RTW_IO_INPUT定义输出参数arg = getTflArgFromString(“日元”“双”);参数。IOType =“RTW_IO_OUTPUT”;hEntry.addConceptualArg (arg);定义输入参数arg = getTflArgFromString(‘u1’“双”);参数。IOType =“RTW_IO_INPUT”;hEntry.addConceptualArg (arg);结束
  6. 创建实现表示。

    实现表示描述了由代码替换库定义的替换函数的签名。它由函数名、返回实参和形参组成。使用类型、类型限定符和复杂性指定实现参数。在定义了实现表示之后,使用对函数的调用将完成的条目添加到代码替换表addEntry

    要定义您的实现表示,请使用以下方法之一:

    方法 函数 目标
    1 copyConceptualArgsToImplementation

    相同的参数。

    指定实现参数和概念参数具有相同的属性。

    2 createAndAddImplementationArgcreateAndSetCImplementationReturn

    相同的顺序,不同的性质。

    指定实现参数的顺序与概念参数相同,但具有不同的属性。

    3. getTflArgFromString

    加上常数值。

    使用常量指定实现参数。

    4 getTflDWorkFromString

    /互斥信号量替换。

    为互斥量或信号量函数指定实现参数。

    5 createCRLEntry

    用一个函数创建条目。

    在一个函数中声明和定义一个代码替换表项(概念参数和实现参数)。

    在显示编程方法时,将所有可用属性设置为它们的默认值。需要指定的确切属性和值取决于要替换的函数。有关具体替换细节,请参阅示例。

    函数hTable = code_replacement_library_table()创建一个函数来调用代码替换库表创建代码替换库表对象hTable = RTW.TflTable;创建代码替换库条目从下面的列表中选择一个hEntry = RTW.TFLCOperationEntry;hEntry = RTW.TflCFunctionEntry;hEntry = RTW.TflBlasEntryGenerator;hEntry = RTW.TflCBlasEntryGenerator;hEntry = RTW.TflCOperationEntryGenerator;hEntry = RTW.TflCOperationEntryGenerator_NetSlope;hEntry = RTW.TflCSemaphoreEntry;hEntry = RTW.TflCFunctionEntryML;hEntry = RTW.TflCOperationEntryML;%%创建表项参数从下面的列表中选择一个查看属性,请参见步骤4hEntry.setTflCOperationEntryParameters ();hEntry.setTflCFunctionEntryParameters ();hEntry.setTflCSemaphoreEntryParameters ();创建概念表示方法1:createAndAddConceptualArg% arg = createAndAddConceptualArg(hEntry, argType, varargin)% argType - 'RTW. 'TflArgNumeric”| 'RTW.TflArgMatrix'% varargin - 'name', 'value'对设置为默认值,%包含名称和I/O类型,要查看属性,请参见步骤5定义输出参数hEntry.createAndAddConceptualArg ();定义输入参数hEntry.createAndAddConceptualArg ();方法2:getTflArgFromString% arg = getTflArgFromString(hEntry,名称,I/O类型)% name- y1..Yn | u1..un% I/O类型- RTW_IO_OUTPUT | RTW_IO_INPUT定义输出参数arg = getTflArgFromString(“日元”“双”);参数。IOType =“RTW_IO_OUTPUT”;hEntry.addConceptualArg (arg);定义输入参数arg = getTflArgFromString(‘u1’“双”);参数。IOType =“RTW_IO_INPUT”;hEntry.addConceptualArg (arg);创建实现表示方法1:copyConceptualArgsToImplementationcopyConceptualArgsToImplementation (hEntry);方法2:createAndSetCImplementation, createAndSetCImplementationArg% arg = createandaddiimplementation (hEntry, argType,varargin),% arg = createAndSetCImplementationReturn(hEntry, argType,varargin)% argType - 'RTW. 'TflArgNumeric”| 'RTW.TflArgMatrix'% varargin - 'name', 'value'对设置为默认值,%包括名称和I/O类型定义输出参数hEntry.createAndSetCImplementationReturn (...“环球套票。TflArgNumeric”...“名字”“日元”...“IOType”“RTW_IO_Output”...“IsSigned”,真的,...“字”, 16岁,...“DataTypeMode”“定点:二进位点缩放”...“数据类型”“固定”...“缩放”“BinaryPoint”...“坡”, 1.0,...“SlopeAdjustmentFactor”, 1.0,...“FixedExponent”, -15,...“偏见”, 0.0,...“FractionLength”15岁的...“价值”, 0);定义输入参数hEntry.createAndAddImplementationArg (...“环球套票。TflArgNumeric”...“名字”“日元”...“IOType”“RTW_IO_Output”...“IsSigned”,真的,...“字”, 16岁,...“DataTypeMode”“定点:二进位点缩放”...“数据类型”“固定”...“缩放”“BinaryPoint”...“坡”, 1.0,...“SlopeAdjustmentFactor”, 1.0,...“FixedExponent”, -15,...“偏见”, 0.0,...“FractionLength”15岁的...“价值”, 0);方法3:getTflArgFromString% arg = getTflArgFromString(hEntry,名称,数据类型)% name- y1..Yn | u1..un,datatype - built-in data type定义输出参数arg = getTflArgFromString(hEntry,“日元”“双”);参数。IOType =“RTW_IO_OUTPUT”;hEntry.Implementation.setReturn (arg);定义输入参数arg = getTflArgFromString(hEntry,‘u1’“双”, 0);hEntry.Implementation.addArgument (arg);方法4:getTflDWorkFromString% arg = getTflDWorkFromString(hEntry,名称,数据类型)定义参数arg = getTflDWorkFromString(“d1”“void *”);hEntry.addDWorkArg (arg);%方法5:createCRLEntrytableEntry = createCRLEntry(crTable,conceptualSpecification,implementationSpecification)定义代码替换概念和实现参数。hEntry = createCRLEntry(...hTable,...“conceptualSpecification”...“implementationSpecification”);将代码替换库条目添加到表中hTable.addEntry (hEntry);结束
  7. 指定构建信息。

    为代码替换库指定生成信息。构建信息为代码生成器提供执行函数替换所需的文件。

    指定构建信息:

    • 在第5步中定义的Entry parameters函数中指定构建参数。使用以下属性指定构建信息:

    参数 描述

    实现头文件

    设置属性ImplementationHeaderFile而且ImplementationHeaderPath

    代码替换所需的头文件的名称。

    实现源文件

    设置属性ImplementationSourceFile而且ImplementationSourcePath

    代码替换所需的源文件的名称。

    附加头文件/包含路径

    对于每个文件,在调用函数时指定文件名和路径addAdditionalHeaderFile而且addAdditionalIncludePath

    代码替换所需的附加头文件的名称或路径。

    额外的源文件/路径

    对于每个文件,在调用函数时指定文件名和路径addAdditionalSourceFile而且addAdditionalSourcePath

    代码替换所需的其他源文件的名称或路径。

    附加的目标文件/路径

    对于每个文件,在调用函数时指定文件名和路径addAdditionalLinkObj而且addAdditionalLinkObjPath

    代码替换所需的其他目标文件的名称或路径。

    其他链接标志

    设置条目属性AdditionalCompileFlags到表示所需编译标志的字符向量或字符串数组的单元格数组。

    标记链接器为替换代码生成可执行文件所需的标记。

    其他编译标志

    设置条目属性AdditionalLinkFlags到表示所需链接标志的字符向量或字符串数组的单元格数组。

    标记编译器为替换代码生成目标代码所需的标记。

    复制文件到构建目录。

    集属性GenCallback“RTW.copyFileToBuildDir”

    如果表项出现匹配,则调用该函数RTW.copyFileToBuildDir将所需文件复制到生成文件夹。

    如果您指定额外的头文件/包含路径或额外的源文件/路径并复制文件,编译器和实用程序如packNGo可能会发现文件的重复实例。

    标记是否在生成代码之前将生成替换代码所需的头文件、源文件或目标文件复制到构建文件夹中。如果指定文件附加头文件/包含路径额外的源文件/路径当你复制文件时,编译器和工具(如packNGo)可能会发现文件的重复实例。
    • 如果条目使用头文件、源文件或目标文件,请考虑是否让代码生成器可以访问这些文件。您可以将文件复制到构建文件夹中,也可以显式指定各个文件名和路径。

    • 如果你指定额外的头文件/包含路径或源文件/路径和你复制的文件,编译器和实用程序等packNGo可能会找到文件的重复实例(一个实例在构建文件夹中,另一个实例在原始文件夹中)。

    • 如果您选择将文件复制到生成文件夹,并且正在使用packNGo函数将静态和生成的代码文件重新定位到另一个开发环境:

      • 在呼唤packNGo,指定属性值对“minimalHeaders”真(默认)。该设置指示函数在zip文件中包含构建代码所需的最小头文件。

      • 不要将复制的文件与未复制的文件放在一起。如果packNGo函数查找同一文件的多个实例,则函数返回错误。

    • 如果使用编程接口,则指定的路径可以包含令牌。令牌是一个变量,在MATLAB中定义为字符向量、字符向量的单元格数组或字符串数组®您用美元符号($变量美元)。代码生成器计算并用定义的值替换令牌。例如,考虑路径myfolder \ folder1美元,在那里myfolder是在MATLAB工作空间中定义的字符向量或字符串标量变量“d: \ \源\ module1工作”.代码生成器将自定义路径生成为d: \ \ \ module1来源\ folder1工作

  8. 验证并保存。

    将代码替换库自定义文件以与MATLAB路径上的代码替换库表相同的名称保存。

    保存并验证你的库:

    1. 保存文件。从MATLAB菜单中,选择文件>保存

    2. 通过从MATLAB命令行调用来验证库。例如:

      hTable = code_replacement_library_table()

相关的话题