文档

通过开发和使用代码替换库- Simulink®优化生成的代码金宝app

开发和使用代码替换库来替换生成代码中的函数和操作符。代码替换是一种更改代码生成器为函数和操作符生成的代码以满足应用程序代码需求的技术。例如,您可以替换生成的代码以满足以下要求:

  • 针对特定运行时环境的优化,包括但不限于特定的目标硬件

  • 与现有应用程序代码的集成

  • 符合标准,如AUTOSAR

  • 修改代码行为,例如启用或禁用非有限或内联支持金宝app

  • 特定于应用程序或项目的代码需求,如使用BLAS或取消math.h,系统头文件,或调用memcpymemset

您可以配置一个模型,使代码生成器使用MathWorks®提供的代码替换库。如果您有嵌入式Coder®许可证,您可以与代码替换工具交互或以编程方式开发自己的代码替换库。

这个示例使用模型来展示以编程方式定义代码替换映射的各种方法。每个模型都包含可以用于的按钮

  • 从“代码替换查看器”查看代码替换库表定义

  • 在编辑器中打开库表定义文件

  • 在编辑器中打开库注册文件

  • 查看模型配置

  • 生成代码

有关更多信息,请参见定义代码替换库优化而且注册码替换库

开发代码替换库的步骤

  1. 确定关于函数或操作映射、构建信息和注册信息的代码替换需求。

  2. 为代码替换库开发做好准备(例如,识别或开发用于测试库的模型)。

  3. 定义代码替换映射。

  4. 为替换代码指定构建信息。

  5. 注册代码替换映射。

  6. 验证代码替换。

  7. 部署库。

有关更多信息,请参见快速入门代码替换库开发- Simulink®金宝app

数学函数替换

本示例为数学函数定义和注册代码替换映射。您可以为各种函数定义代码替换映射(参见可以从Simulink模型中替换的代码金宝app).

打开模型rtwdemo_crlmath并使用模型窗口底部的按钮来查看定义和注册代码替换库映射的文件。

有关更多信息,请参见数学函数代码替换

open_system (“rtwdemo_crlmath”

加减运算符替换

这个例子展示了如何为加法(+)和减法(-)操作定义和注册代码替换映射。在为加减操作定义条目时,可以指定下列算法中的哪一种(EntryInfoAlgorithm)你的库函数实现:

  • 操作前浇铸(RTW_CAST_BEFORE_OP),默认为

  • 操作后浇铸(RTW_CAST_AFTER_OP

1.打开模型rtwdemo_crladdsub.该模型展示了如何定义和注册两个操作数上的标量加减(-)操作的代码替换映射,使用以下内置整数数据类型的对:

  • int8uint8

  • int16uint16

  • int32uint32

假设默认算法为CBO。

open_system (“rtwdemo_crladdsub”

2.使用模型窗口底部的按钮来查看定义和注册代码替换库映射的文件。

3.通过打开模型,探究CBO和CAO算法之间的差异rtwdemo_crl_cbo_cao.该模型显示了两个SUM块,每个块演示了一种算法设置,以匹配相应的代码替换条目。

  • Cast_before_operation_Sub块中,代码生成器计算累加器数据类型(int8),它小于输入数据类型(int16).这相当于CBO,因为在计算结果之前,代码生成器将输入转换为输出数据类型。

  • Cast_after_operation_Sub块中,代码生成器计算累加器数据类型(int32),它大于输入数据类型(int16).这与CAO相当,因为代码生成器在转换为输出数据类型之前,通过计算结果而不会损失范围或精度,从而产生相同的结果。

open_system (“rtwdemo_crl_cbo_cao”

4.使用模型窗口底部的按钮来查看定义和注册代码替换库映射的文件。

有关加减运算符替换的更多信息,请参见加减运算符代码替换.有关加减法算法的更多信息(EntryInfoAlgorithm),请参阅setTflCOperationEntryParameters

内置整数的乘法和除法运算符替换

这个示例为标量乘法(*)和除法(/)操作定义和注册代码替换映射。该操作采用两个操作数,并使用以下内置整数数据类型对:

  • int8uint8

  • int16uint16

  • int32uint32

打开模型rtwdemo_crlmuldiv并使用模型窗口底部的按钮来查看定义和注册代码替换库映射的文件。

open_system (“rtwdemo_crlmuldiv”

标量运算符替换

此示例为标量操作定义和注册代码替换映射:加法、减法、乘法、复共轭、强制转换、算术右移和算术左移。

金宝app支持的类型包括:

  • 单,双

  • int8, uint8

  • int16, uint16

  • int32, uint32

  • csingle, cdouble

  • cint8, cuint8

  • cint16, cuint16

  • cint32, cuint32

  • 定点整数

  • 混合类型(每个输入的类型不同)

打开模型rtwdemo_crlscalarops并使用模型窗口底部的按钮来查看定义和注册代码替换库映射的文件。

有关标量运算符替换的更多信息,标量运算符代码替换

假定CBO是用于加减运算的默认算法。

open_system (“rtwdemo_crlscalarops”

矩阵算子替换

这个示例为矩阵操作定义和注册代码替换映射:加、减、乘、转置、共轭和厄米运算。

金宝app支持的类型包括:

  • int8uint8

  • int16uint16

  • int32uint32

  • csinglecdouble

  • cint8cuint8

  • cint16cuint16

  • cint32cuint32

  • 定点整数

  • 混合类型(每个输入的类型不同)

打开模型rtwdemo_crlmatops,这张图展示了一些替换物。使用模型窗口底部的按钮来查看定义和注册代码替换库映射的文件。

有关矩阵运算符替换的更多信息,请参见小矩阵运算到处理器代码替换

假定CBO是用于加减运算的默认算法。

open_system (“rtwdemo_crlmatops”

BLAS的矩阵乘法替换

本示例为基本线性代数子例程(BLAS)子例程定义和注册代码替换映射xGEMM而且xGEMV.您可以将以下操作映射到BLAS子例程:

  • 矩阵乘法

  • 矩阵的转置乘法在单个或两个输入上

  • 单输入或双输入上的厄米运算矩阵乘法

打开模型rtwdemo_crlblas并使用模型窗口底部的按钮来查看定义和注册代码替换库映射的文件。

有关BLAS的矩阵乘法替换的更多信息,请参见矩阵乘法运算到MathWorks BLAS代码替换

open_system (“rtwdemo_crlblas”

基本算子的定点算子替换

这个示例为标量加法(+)、减法(-)、乘法(*)和除法(/)操作定义和注册代码替换映射。这些操作采用两个具有定点数据类型的操作数。

你可以将代码替换定义为匹配:

  • 输入和输出的斜率/偏置缩放组合

  • 输入和输出上的二值点缩放组合

  • 输入和输出之间的相对伸缩

  • 相同的斜率值和零净偏差的输入和输出。

打开模型rtwdemo_crlfixpt并使用模型窗口底部的按钮来查看定义和注册代码替换库映射的文件。

  • 默认情况下,对于加减运算符代码替换,代码生成器假定替换代码实现了运算前强制转换(CBO)算法。

  • 在模型中使用定点数据类型需要有定点设计器许可证。

有关定点运算符代码替换的更多信息,请参见定点运算符代码替换

open_system (“rtwdemo_crlfixpt”

函数匹配替换过程定制

此示例为自定义条目定义和注册代码替换映射。的子类来创建自己的条目环球套票。TflCFunctionEntryML环球套票。TflCOperationEntryML.您的条目类必须实现一个do_match方法,该方法自定义匹配逻辑或修改匹配条目。的do_match方法必须具有固定的预置签名。

打开模型rtwdemo_crlcustomentry.该模型展示了如何通过注入常量作为附加实现函数参数来修改匹配的条目。DTC1三角函数,产品显示自定义入口代码替换:

  • 强制转换操作,演示如何从类型中提取分数长度并将它们传递给实现函数-Out1 = custom_cast(in1,2,4)

  • sin演示了如何向实现函数传递恒定值-Out2 = custom_sin (In2, 1)

  • 乘法运算,演示如何计算运算的净斜率并将其传递给实现函数-Out3 = custom_multiply_shift_right (In3 In4 3)

使用模型窗口底部的按钮来查看定义和注册代码替换映射的文件。

有关自定义条目的更多信息,请参见自定义匹配和替换流程

open_system (“rtwdemo_crlcustomentry”

MATLAB函数替换

本示例为MATLAB函数块中指定的MATLAB®函数定义并注册代码替换映射。可以通过指定来选择替换函数coder.replace在它。该特性支持用以下功能替换M金宝appATLAB®函数:

  • 单个或多个输入

  • 单输出或多输出

  • 标量和矩阵的输入和输出

打开模型rtwdemo_crlcoderreplace.该模型显示了其中的一些需求。金宝app支持的类型包括:

  • int8uint8

  • int16uint16

  • int32uint32

  • csinglecdouble

  • cint8cuint8

  • cint16cuint16

  • cint32cuint32

  • 定点整数

  • 混合类型(每个输入的类型不同)

使用模型窗口底部的按钮来查看定义和注册代码替换映射的文件。

有关MATLAB®函数替换的更多信息,请参见coder.replace

open_system (“rtwdemo_crlcoderreplace”

函数实现的数据对齐

这个例子展示了如何指定传递给替换函数的矩阵操作数的对齐方式。一些特定于目标的函数实现需要对数据进行对齐,以优化应用程序性能。为函数实现配置数据对齐:

  • 在表项中指定数据对齐要求。可以单独或集体指定实现函数参数的对齐方式。

  • 为编译器指定数据对齐功能和语法。附加一个AlignmentSpecification反对TargetCharacteristics对象的注册表项rtwTargetInfo.m文件。

打开模型rtwdemo_crlalign.该模型显示了三种数据对齐代码替换场景:

  • 添加-输出和导入信号的对齐。您可以在“信号属性”对话框中指定精确的对齐值,或者允许代码生成器根据使用情况确定最佳对齐值,将对齐值设置为-1。

  • 产品-虚拟和非虚拟总线类型的对齐。对象的对齐方式的精确值对齐属性。金宝app总线对象或允许代码生成器根据使用情况确定最佳对齐方式对齐属性设置为-1。

  • EML_MMUL-局部变量、全局变量和块参数的对齐。

使用模型窗口底部的按钮来查看定义和注册代码替换映射的文件。注意,该模型被配置为使用GCC、Clang、MSVC或MinGW编译器。

有关为代码替换指定数据对齐的详细信息,请参见代码替换的数据对齐

open_system (“rtwdemo_crlalign”

代码替换库的探索与验证

此示例显示代码替换查看器。您可以使用代码替换查看器来:

  • 探索要使用的代码替换库

  • 验证库中的表列表和每个表中的条目

  • 检查表条目规范

  • 解决代码替换失败的问题

以下命令打开代码替换查看器以进行代码替换表crl_tablemuldiv

CRL = crl_table_muldiv;crviewer (crl);daRoot = DAStudio.Root;me = darot .find“是”“DAStudio。资源管理器”);

有关代码替换查看器的更多信息,请参见验证代码替换库

构建信息

对于代码替换表中的每个条目,您可以为替换函数指定如下构建信息:

  • 头文件依赖关系

  • 源文件依赖关系

  • 其他包含路径

  • 其他源路径

  • 其他链接标志

此外,您可以指定RTW.copyFileToBuildDir在生成代码之前,将生成替换代码所需的头文件、源文件或目标文件复制到构建文件夹中。你可以指定RTW.copyFileToBuildDir通过将其设置为值:

  • 财产GenCallback在一个电话中setTflCFunctionEntryParameterssetTflCOperationEntryParameters,或setTflCSemaphoreEntryParameters

  • 论点genCallback在一个电话中registerCFunctionEntryregisterCOperationEntry,或registerCSemaphoreEntry

注意:本例中的模型被配置为代码生成,只是因为没有提供替换函数的实现。

有关指定生成信息的详细信息,请参见中的指定生成信息定义代码替换库优化

保留标识符

由代码替换表项定义的每个函数实现名都保留为唯一标识符。可以使用表在每个头文件的基础上指定其他标识符。提供额外的保留标识符可以帮助防止重复符号和其他与标识符相关的编译和链接问题。

有关指定保留标识符的更多信息,请参见保留标识符和代码替换

删除示例代码替换库

当您完成使用示例模型时,删除示例代码替换库并使用以下命令关闭示例模型:

rmpath (fullfile (matlabroot,“工具箱”“环球套票”“rtwdemos”“crl_demo”));sl_refresh_customizations;close_system (“rtwdemo_crladdsub”, 0) close_system(“rtwdemo_crl_cbo_cao”, 0) close_system(“rtwdemo_crlmuldiv”, 0) close_system(“rtwdemo_crlfixpt”, 0) close_system(“rtwdemo_crlmath”, 0) close_system(“rtwdemo_crlmatops”, 0) close_system(“rtwdemo_crlblas”, 0) close_system(“rtwdemo_crlscalarops”, 0) close_system(“rtwdemo_crlcustomentry”, 0) close_system(“rtwdemo_crlcoderreplace”, 0) close_system(“rtwdemo_crlalign”, 0)现在抽;如果存在(“h”“var”&& ishhandle (h) close(h);结束如果~ isempty()我delete(结束);结束清晰的h;清晰的;清晰的isDaDemo金宝appSupported;清晰的crl;rtwdemoclean;