文档

控制定点效用函数的生成

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

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

这个优化的结果是:

  • 减少ROM和RAM的消耗

  • 提高执行速度

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

先决条件

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

如何配置您的模型

为了使优化更有可能:

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

    • 轮廓尺寸而且外港

    • 块输出

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

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

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

    如何启用模拟范围检查

  • 使用定点数据类型和仅二进制点(2的幂)缩放。

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

如何启用优化

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

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

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

限制

  • 此优化不会发生在以下情况:

    • 多字的操作

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

    • 除非分数长度为零,否则为加法

  • 此优化不考虑以下情况的最小值和最大值:

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

    • 总线的元素。

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

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

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

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

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

这个例子展示了Fixed-Point Designer软件如何使用除法运算的输入范围来确定是否可以从生成的代码中消除不必要的实用函数。它使用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: ((uint32_T)rtU。In5 << 17) / (uint32_T)tmp;

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

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

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

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

  3. 双击生成代码按钮。

    出现代码生成报告。

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

    出现上下文菜单。

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

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

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