主要内容

使用模型顾问优化生成的代码

您可以使用simulink金宝app®Model Advisor来帮助您配置定点模型,以实现更有效的设计并优化生成的代码。使用Model Advisor检查定点模型:

  1. 在里面建模您要分析的模型的选项卡,请单击模型的顾问

  2. 在系统选择器中,选择要分析的系统。

  3. 在模型顾问左窗格中,展开通过产品节点,然后嵌入式编码器节点。

  4. 对于固定点代码生成,要选择的最重要的复选框是识别生成昂贵的定点和饱和代码的块确定有问题的定点操作识别生成昂贵的圆形代码的块, 和检查硬件实现

    从模型顾问启用与所选节点关联的所有模型顾问检查编辑菜单中,选择选择所有

  5. 点击选择运行检查.用于提高固定点模型效率的任何提示出现在模型顾问窗口中。

接下来的部分将讨论在Model Advisor中找到的定点相关检查和子检查。这些部分解释检查,讨论它们在定点代码生成中的重要性,并提供调整模型以优化生成代码的建议。

识别生成昂贵的固定点和饱和码的块

识别有问题的定点操作的Sum块

  • 当输入范围的输入范围总和块超出输出范围,范围错误发生。属性之前和/或之后插入数据类型转换块,可以得到应用程序需要的任何加法或减法总和块。

  • 当一个总和块具有输入的输入,其斜率调节因子不等于输出的斜率调整因子,不匹配需要总和块,以便在每次将输入转换为数据类型并缩放输出时执行乘法操作。不匹配可以通过改变输出或输入的比例来消除。

  • 总和块输入偏差不等于输出偏差,生成的代码包括一个额外的加法或减法指令,以正确地说明净偏差调整。改变输出缩放的偏差可以使净偏差调整为零,消除额外操作的需要。

确定有问题的定点操作的最小最大值块

  • 当输入和输出的输入和输出极大极小块具有不同的数据类型,每次执行块时都需要转换操作。使用相同的数据类型时,模型的效率更高。

  • 当数据类型和缩放的输入极大极小块与输出的数据类型和缩放不匹配,在执行关系操作之前需要转换。这可能导致铸造时的范围误差,或者每次执行转换时都会产生精度损耗。更改输入或输出的缩放以生成更高效的代码。

  • 当输入极大极小块具有不同的斜率调整因子,而不是输出,极大极小块需要每次执行块以将输入转换为数据类型和输出的缩放时乘法操作。您可以通过更改输入或输出的缩放来纠正不匹配。

识别有问题的定点操作的离散积分器块

  • 当初始条件离散时间集成商块用于初始化状态和输出,输出方程生成过多的代码,并且需要额外的全局变量。建议您设置功能块参数>初始条件设置参数国家(最有效)

识别有问题的定点操作的比较常量块

  • 的输入数据类型比较零块不能准确地表示零,将输入信号与最接近的可表示值零进行比较,导致参数溢出。要避免此参数溢出,请选择可以表示零的输入数据类型。

  • 如果是恒定值参数的比较常数在输入数据类型可以表示的范围之外,将输入信号与恒定的最接近的可表示值进行比较。这导致参数溢出。要避免此参数溢出,请选择可以表示的输入数据类型恒定值,或改变恒定值转换为输入数据类型可以容纳的值。

为有问题的定点操作标识查询表块

中描述了与查找表数据相关的效率权衡间距对速度,误差和内存使用量的影响.基于这些权衡,模型顾问标识了有效率改进的块,例如:

  • 查找表输入数据不会均匀间隔。

  • 查找表输入数据量化时均匀间隔,但它非常接近均匀间隔。

  • 查询表输入数据是均匀间隔的,但间距不是2的幂。

有关查找表优化的更多信息,请参见查找表优化

检查优化和硬件实现设置

  • Integer Division生成的代码包含针对算术例外的保护,例如归零,int_min / -1和long_min / -1。如果构建模型使其不可能进行异常触发输入组合以达到划分操作,则作为划分操作的一部分生成的保护代码是冗余的。

  • 索引搜索方法等间隔点需要一个除法操作,这可能是计算昂贵的。

确定将调用净斜率计算的块

当定点斜率的变化不是两个的功率时,需要净斜率计算。通常,使用整数乘法实现净斜率计算,后跟偏移。在某些条件下,替代实施只需要一个整数分割。其中一个条件是净斜率可以非常精确地表示为整数的倒数。当满足这种情况时,划分实现产生更准确的数字行为。根据您的编译器和嵌入式硬件,该划分实现可能比乘法和换档实现更可取。生成的代码在ROM大小或模型执行大小中可能更有效。

Model Advisor会在以下情况提醒您:

  • 你设置用除法进行定点网斜率计算优化参数到“上”,但您的模型配置与此选择不兼容。

  • 您的模型配置适合使用除法处理净斜率计算,但您没有设置用除法进行定点网斜率计算优化参数到“上”

有关更多信息,请参阅净斜率计算

识别效率较低的产品块

块执行的乘法和除法的数量对准确性和效率有很大的影响。Model Advisor检测到一些(但不是全部)情况,在这些情况下,重新安排操作可以提高准确性、效率或两者兼有。

其中一种情况是计算一个使用多个除法运算的计算。数值分析领域的一般指导原则是,首先将所有分母项相乘,然后只做一次除法。这提高了浮点数,特别是定点数的精度和速度。这可以在Simulink中通过级联实现金宝app产品块。注意,模型顾问未检测到在一系列块上传播的多个划分。

另一个情况是当单个产品块被配置为执行多个乘法或分割操作时。这是支持的,但如金宝app果输出数据类型是整数或固定点,则可能会在每个乘法或一个划分的多个块中拆分此操作,因此可能会更好的结果。使用多个块允许用户控制用于中间计算的数据类型和缩放。中间计算的数据类型的选择会影响精度,范围错误和效率。

检查昂贵的饱和代码

设置在整数溢出上饱和参数可以生成应用程序可能不需要的条件检查代码。

检查应用程序是否需要设置块参数>信号属性>在整数溢出上饱和.否则,清除此参数以获得生成的代码中最有效地实现块。

确定有问题的定点操作

此检查识别生成多字运算、繁琐的乘法和除法运算、昂贵的转换代码、查找表块效率低下和昂贵的比较代码的块。

检查多字操作

当操作导致数据类型大于处理器的最大字大小时,生成的代码包含多字操作。多字操作可以效率低下。为了防止多字操作,将输入的单词长度调整为操作,以便它们不超过处理器的最大字大小。有关在生成代码中控制多字操作的详细信息,请参阅生成代码中的定点多字操作

检查昂贵的乘法代码

  • 针对嵌入式处理器讨论嵌入式处理器的功能和限制。设计规则建议乘法运算的输入的字长不应大于处理器的基本整数类型。软件中总是可以处理较大单词长度的乘法,但这种方法需要更多的代码,速度也慢得多。Model Advisor识别需要不需要的软件复制的块。可视化地检查生成的代码,包括生成的乘法实用函数,将使这些操作的成本变得清晰。强烈建议您调整模型以避免这些操作。

  • 算术运算规则讨论了固定点乘法和划分的实现细节。当具有非零偏差的信号涉及乘法和分割时,发生复杂性的显着增加。强烈建议您进行更改以消除对这些复杂操作的需求。额外的步骤需要实现乘法。插入A.数据类型转换在执行乘法的块之前和之后块允许将偏差删除并允许用户控制数据类型和缩放以进行中间计算。在许多情况下数据类型转换块可以移动到(子)系统的“边缘”。转换只完成一次,所有块都可以从更简单的无偏置数学中受益。

检查昂贵的除法码

符号整数划分的圆形行为不完全由C语言标准指定。因此,对于划分的生成代码太大,无法在仿真和代码生成之间提供位真的协议。要避免Integer Division生成的代码太大,请在“配置参数”对话框中硬件实现窗格中,设置签名整数分裂圆参数到推荐值。

识别具有不均匀断点间距的查找块

中描述了与查找表数据相关的效率权衡间距对速度,误差和内存使用量的影响.基于这些权衡,Model Advisor识别出有提高效率潜力的区块,并在以下情况下发出警告:

  • 查找表输入数据不会均匀间隔。

  • 查找表输入数据量化时均匀间隔,但它非常接近均匀间隔。

  • 查询表输入数据是均匀间隔的,但间距不是2的幂。

检查昂贵的预查找除法

对于一个Prelookup要么一天的查找表块,索引搜索方法均匀的间隔点.断点数据没有2间距的功率。

如果断点数据是无法运内的,建议您调整数据以具有2间距的功率。否则,在“块参数”对话框中,指定不同的索引搜索方法避免计算密集型划分操作。

检查开销大的数据类型转换

当配置块时,使得它将生成数据类型转换的低效代码,模型顾问生成警告,并提出了如何使模型更高效的建议。

检查具有预定结果的定点比较

当你选择isinf.isNaN,或isFinite作为操作关系运营商块,块切换到单输入模式。在此模式下,如果输入数据类型是固定点,布尔值或内置整数,则输出为falseisinf.isNaN,真实isFinite.这可能会导致死代码,而死代码将被金宝appSimulink Coder™

检查昂贵的二进制比较操作

  • 的输入数据类型关系运营商块不相同,则每次执行块时都需要一个转换操作。如果其中一个输入是不变的,那么更改数据类型并将不变输入缩放以匹配另一个输入可以提高模型的效率。

  • 当一个输入的输入关系运营商块有不同的范围,铸件时会有一个范围误差,并且每次执行转换时都会进行精度损耗。你可以插入数据类型转换块面前关系运营商块将两个输入转换为具有足够范围和精度来表示每个输入的公共数据类型。

  • 当一个输入的输入关系运营商块体有不同的坡度调整因素,其坡度变化不大关系运营商每当具有更大正范围的数据类型和输入的数据类型转换为数据类型时,需要块需要执行乘法操作。额外的乘法需要额外的代码,减慢执行速度,通常介绍额外的精度损耗。通过调整输入的缩放,可以消除不匹配的斜坡。

检查昂贵的比较代码

当您的模型配置为生成的代码包含昂贵的比较代码时,model Advisor将生成一个警告。

在生成的代码中检查昂贵的定点数据类型

当设计包含目标硬件上不存在的整数或定点字长时,生成的代码可能包含额外的饱和码、移位和多字操作。通过将数据类型更改为目标硬件支持的数据类型,可以提高生成代码的效率。金宝appModel Advisor在模型中标记这些昂贵的数据类型。例如,如果目标硬件是32位,Model Advisor将标记一个字长为17的定点数据类型。

识别生成昂贵的圆形代码的块

此检查在提供舍入优化时提醒您。要检查生成昂贵的圆形代码的块,模型顾问执行以下子系统:

  • 检查乘法和部门的昂贵的圆形操作

  • 检查优化和硬件实现设置(查找块)

  • 检查数据类型转换中是否存在昂贵的舍入

  • 检查模型中昂贵的圆形模式

传统的手写代码,特别是对于控制应用,几乎总是使用“无需努力”舍入。例如,对于无符号整数和两个补码符号整数,转换右侧和丢弃位等同于舍入到地板。要获得与传统手写代码的期望的结果相当或更好,请使用最简单的舍入模式。通常,最简单的模式提供最小成本解决方案,没有溢出。如果最简单的模式不可用,请舍入到地板上。

该规则的主要例外是有符号整数除法的舍入行为。C标准没有规定这种舍入行为,但对于大多数生产目标来说,“不努力”模式是舍入为零。对于无符号除法,所有的都是非负的,所以舍入到下位和舍入到零是相同的。为了提高舍入效率,设置型号配置参数>硬件实现>设备详细信息> Signed integer division round to使用您的生产目标使用的模式。

使用整数舍入模式参数来模拟用于编译从模型生成的代码的C编译器的舍入行为。该设置显示在信号属性可以执行符号整数算法的块的参数对话框窗格,例如产品块。要获得最有效的生成代码,请更改整数舍入模式参数设置为推荐设置。

有关选择舍入模式时要考虑的属性的更多信息,请参阅选择圆形方法