主要内容

控制定点效用函数的生成

使用指定的最小值和最大值优化生成的代码

Fixed-Point Designer™软件使用可表示的最小值、最大值和常数值来确定是否有可能优化生成的代码,例如,通过消除生成代码中不必要的实用函数和饱和代码。

这个优化结果是:

  • 减少ROM和RAM的消耗

  • 提高执行速度

当你选择使用指定的最小值和最大值进行优化配置参数时,软件考虑的输入范围信息也称为设计最小和最大,您为模型中的信号和参数指定的。它使用这些最小值和最大值来导出模型中下游信号的范围信息,然后在可能的情况下使用导出的范围信息来简化生成代码中的数学运算。

先决条件

使用指定的最小值和最大值进行优化参数只出现在基于ert的目标上,并且需要一个嵌入式编码器®在生成代码时使用许可。

如何配置您的模型

为了让优化更有可能:

  • 提供尽可能多的设计、最小和最大的信息。为模型中的信号和参数指定最小值和最大值:

    • 轮廓尺寸外港

    • 块输出

    • 块输入,例如MATLAB函数Stateflow图表

    • 金宝app仿真软件。信号对象

  • 在生成代码之前,测试信号和参数的最小值和最大值。否则,优化可能导致数值与模拟不匹配。您可以在启用模拟范围检查的情况下模拟您的模型。如果出现错误或警告,请在生成代码之前修复这些问题。

    如何启用模拟范围检查

  • 使用具有二进制点(2的幂)伸缩性的定点数据类型。

  • 在区块上游提供设计的最小和最大信息,尽可能接近区块的输入。如果您为块输出指定了最小值和最大值,那么这些值很可能会直接影响下游块的输出。有关更多信息,请参见使用指定的最小值和最大值消除不必要的实用函数

如何启用优化

  1. 在“配置参数”对话框中设置代码生成>系统目标文件选择嵌入式实时系统()目标(需要嵌入式编码器许可证)。

  2. 在模型中指定信号和参数的设计最小值和最大值如何配置您的模型

  3. 选择优化>先进的参数>使用指定的最小值和最大值进行优化配置参数。

限制

  • 这种优化不会发生在:

    • 多字的操作

    • 具有斜率和偏差缩放的定点数据类型

    • 除非分数长度为零

  • 该优化不考虑最小值和最大值:

    • 合并块的输入。要解决这个问题,请使用金宝app仿真软件。信号对象的合并块输出并指定该对象上的范围。

    • 总线的元素。

    • 有条件执行的子系统(例如被触发的子系统)块输出直接连接到外港块。

      外港有条件执行的子系统中的块可以有一个指定的初始值,仅在系统未触发时使用。在这种情况下,优化不能使用块输出的范围,因为该范围可能不会覆盖块的初始值。

  • 精度有限制,因为您将最小值和最大值指定为双精度值。如果最小值或最大值的真实值不能用双精度表示,请确保正确四舍五入最小值和最大值,以便它们涵盖真实的设计范围。

  • 如果您的模型包含可重用子系统的多个实例,并且每个实例使用具有不同指定的最小值和最大值的输入信号,则此优化可能会为每个子系统生成不同的代码,因此不会发生代码重用。如果没有这种优化,金宝app仿真软件编码器™软件只为子系统生成一次代码,并在子系统的多个实例之间共享此代码。

使用指定的最小值和最大值消除不必要的实用函数

这个示例展示了定点设计器软件如何使用除法操作的输入范围来确定是否可以从生成的代码中删除不必要的实用函数。它使用fxpdemo_min_max_optimization模型。首先,在生成代码时不使用指定的最小值和最大值,以查看生成的代码是否包含实用函数,以确保不会出现除零的情况。然后打开优化,并再次生成代码。通过优化,生成的代码不包含实用程序函数,因为输入范围不需要它。

不使用最小值和最大值生成代码

首先,生成代码时不考虑第一次输入的除法运算的设计最小值和最大值,以显示没有优化的代码。在这种情况下,软件使用两个输入的可表示范围,它们都是uint16.对于这些输入范围,不可能使用移位来实现指定精度的除法,因此生成的代码包括除法实用函数。

  1. 运行fxpdemo_min_max_optimization的例子。

  2. 在示例窗口中,双击视图的优化配置按钮。

    出现“配置参数”对话框的“优化”窗格。

    请注意,使用指定的最小值和最大值进行优化参数未被选中。

  3. 双击生成代码按钮。

    代码生成报告将出现。

  4. 在模型中,右键单击带有增加的分数长度输出类型的除法块。

    出现上下文菜单。

  5. 从上下文菜单中选择C / c++代码>导航到C/ c++代码

    代码生成报告突出显示为该块生成的代码。生成的代码包括对div_repeat_u32效用函数。

    而无。Out3 =div_repeat_u32((uint32_T) rtU。In5 << 16, (uint32_T)rtU。In6 1 u);

  6. 单击div_repeat_u32链接以查看实用程序函数,该函数包含处理除零的代码。

使用最小值和最大值生成代码

接下来,为相同的除法操作生成代码,这一次考虑到第一次输入的设计最小值和最大值产品块。这些最小值和最大值在轮廓尺寸直接阻断上游产品块。对于这些输入范围,生成的代码通过简单地使用移位来实现除法。它不需要生成除法实用函数,减少了内存使用和执行时间。

  1. 双击轮廓尺寸块标记5打开块参数对话框。

  2. 在块参数对话框中,选择信号的属性窗格,并注意:

    • 最低这个信号的值是1

    • 最大这个信号的值是One hundred.

  3. 点击好吧关闭对话框。

  4. 双击视图的优化配置按钮。

    出现“配置参数”对话框的“优化”窗格。

  5. 在此窗格中,选择使用指定的最小值和最大值进行优化参数,然后单击应用

  6. 双击生成代码按钮。

    代码生成报告将出现。

  7. 在模型中,右键单击带有增加的分数长度输出类型的除法块。

    出现上下文菜单。

  8. 从上下文菜单中选择C / c++代码>导航到C/ c++代码

    代码生成报告突出显示为该块生成的代码。这一次,生成的代码使用移位操作实现除法,并且没有除法实用函数。

    tmp = rtU.In6;而无。Out3 = (uint32_T)tmp == (uint32_T)0 ?MAX_uint32_T:(rtU (uint32_T)。In5 << 17) / (uint32_T)tmp;

修改指定的最小值和最大值

最后,修改第一个除法运算输入的最小值和最大值,使其输入范围过大,以保证移位时不溢出。在这里,您无法在不溢出32位容器的情况下将16位数字向右移动17位。为除法运算生成代码,再次考虑最小值和最大值。对于这些输入范围,生成的代码包含一个除法实用函数,以确保不会发生溢出。

  1. 双击轮廓尺寸块标记5打开块参数对话框。

  2. 在块参数对话框中,选择信号的属性窗格并设置最大价值40000,然后单击好吧关闭对话框。

  3. 双击生成代码按钮。

    代码生成报告将出现。

  4. 在模型中,右键单击带有增加的分数长度输出类型的除法块。

    出现上下文菜单。

  5. 从上下文菜单中选择C / c++代码>导航到C/ c++代码

    代码生成报告突出显示为该块生成的代码。生成的代码包括对div_repeat_32效用函数。

    而无。Out3 = div_repeat_u32 (rtU (uint32_T)。In5 << 16, (uint32_T)rtU。In6 1 u);