主要内容

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

要优化为模型生成的代码,您可以选择一个选项来使用输入范围信息,也称为设计最小值和最大值,你在信号和参数上指定。这些最小值和最大值通常表示环境限制,如温度,或机械和电气限制,如传感器的输出范围。

在“配置参数”对话框中,在优化窗格中显示使用指定的最小值和最大值进行优化复选框时,软件使用最小值和最大值来导出模型中下游信号的距离信息。然后,它使用这个派生的范围信息来确定是否有可能通过以下方式简化生成的代码:

  • 将表达式简化为常量

  • 移除条件语句的死分支

  • 消除不必要的数学运算

此优化结果为:

  • 减少ROM和RAM消耗

  • 提高执行速度

配置您的模型

为了使优化更有可能:

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

    • 轮廓尺寸外港

    • 块输出

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

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

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

    启用模拟距离检查

  • 在尽可能靠近模块输入的上游提供最小和最大的设计信息。如果您为一个块输出指定了最小值和最大值,这些值很可能会直接影响下游块的输出。

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

这个例子展示了如何使用模型中信号和参数上指定的最小值和最大值来优化生成的代码。

概述

指定的最小值和最大值通常表示环境限制,如温度,或机械和电气限制,如传感器的输出范围。

此优化使用这些值来简化生成的代码。例如,它将表达式简化为常量或删除条件语句的死分支。

注意:确保您指定的最小值和最大值是有效的限制。否则,这种优化可能会导致数值与模拟不匹配。

优化生成的代码的好处是:

  • 减少ROM和RAM的消耗。

  • 提高执行速度。

查看最小和最大信息

考虑模型rtwdemo_minmax.在此模型中,在输入和增益块的增益参数上指定了最小值和最大值。

模型=“rtwdemo_minmax”;open_system(模型);

在没有此优化的情况下生成代码

首先,在不考虑最小值和最大值的情况下为该模型生成代码。

currentDir = pwd;[~,cgDir] = rtwdemodir();rtwconfiguredemo(模型,“导”) rtwbuild(模型)
###开始构建过程:rtwdemo_minmax成功完成构建过程:rtwdemo_minmax构建摘要构建的顶级模型目标:模型动作重建原因=============================================================================================== rtwdemo_minmax生成和编译的代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 32.189s

一部分rtwdemo_minmax.c如下所示。

cfile = fullfile(cgDir,“rtwdemo_minmax_ert_rtw”“rtwdemo_minmax.c”);rtwdemodbtype(用'/*模拟步骤'/*模型初始化, 1, 0);
/*模型步长函数*/ void rtwdemo_minmax_step(void) {int32_T tmp;/* Sum: '<根>/Sum'合并:* Inport: '<根>/U1' * Inport: '<根>/U2' * Sum: '<根>/Sum2' * Switch: '<根>/Switch' */ tmp = U1 + U2;/*交换机:“<根>/交换机”合并:*增益:“<根>/增益”*输入:“<根>/U3”* RelationalOperator:“<根>/关系操作员”* Sum:“<根>/Sum”*/ if (tmp <= k * U3){/*输出端口:“<根>/Out1”合并:* Sum:“<根>/Sum2”*/ rtY。Out1 = tmp + U3;}其他{/*输出端口:'<根>/Out1'合并:*输入:'<根>/U1' *输入:'<根>/U2' *产品:'<根>/Product' */ rtY. 0。Out1 = U1 * U2 * U3;}}

启用此优化

  1. 打开“配置参数”对话框。

  2. 优化窗格中,选择使用指定的最小值和最大值进行优化

或者,您也可以通过设置命令行参数来启用这种优化。

set_param(模型,“UseSpecifiedMinMax”“上”);

使用此优化生成代码

在模型中,用指定的最小值和最大值为U1U2的和。U1U2最小值为50。考虑到U3以及指定的增益块参数的最小值和最大值,则增益块输出的最大值为40。

Relational Operator块的输出仍然是false,而Switch块的输出仍然是三个输入的乘积。

使用嵌入式编码器配置和构建模型。

rtwconfiguredemo(模型,“导”) rtwbuild(模型)
###开始构建过程:rtwdemo_minmax成功完成构建过程:rtwdemo_minmax构建摘要构建的顶级模型目标:模型动作重建原因============================================================================== rtwdemo_minmax生成和编译的代码生成的代码已经过时。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 16.43s

查看优化后的代码rtwdemo_minmax.c

cfile = fullfile(cgDir,“rtwdemo_minmax_ert_rtw”“rtwdemo_minmax.c”);rtwdemodbtype(用'/*模拟步骤'/*模型初始化, 1, 0);
/*模型步函数*/ void rtwdemo_minmax_step(void){/*输出口:'<根>/Out1'合并:*输入口:'<根>/U1' *输入口:'<根>/U2' *输入口:'<根>/U3' *产品:'<根>/Product' *交换机:'<根>/交换机' */ rtY。Out1 = U1 * U2 * U3;}

关闭模型并清理。

bdclose rtwdemoclean(模型);cd (currentDir)

限制

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

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

    • 总线的元素。

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

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

  • 如果你使用Polyspace®用于验证使用此优化生成的代码的软件,可能会将以前的绿色代码标记为橙色。例如,如果您的模型包含一个分母范围不包括零的除法,则生成的代码不包括防止被零除法的保护。Polyspace可能会将此代码标记为橙色,因为它没有关于除法输入的最小值和最大值的信息。

    Polyspace Code Prover™自动捕获MATLAB中指定的一些最小值和最大值®例如,用于工作空间金宝app仿真软件。信号金宝app仿真软件。参数对象。在本例中,要向Polyspace软件提供范围信息,请使用金宝app仿真软件。信号对象的除法输入,并指定不包括零的范围。

    多空间代码证明将这些值存储在数据范围规范(DRS)文件中。但是,它们不能捕获Simulink中的所有最小值和最大值金宝app®模型。要向Polyspace提供额外的最小值和最大值信息,可以手动定义DRS文件。

  • 如果使用双精度数据类型和非谓语形式的数字如果选择了配置参数,则不会进行此优化。

  • 如果您的模型包含一个可重用子系统的多个实例,并且每个实例使用的输入信号具有不同的最小值和最大值,这种优化可能会导致为每个子系统生成不同的代码,因此代码重用不会发生。如果没有这种优化,代码只为子系统生成一次,并在子系统的多个实例之间共享该代码。

  • Model Advisor检查检查安全相关的优化设置(金宝app仿真软件检查)如果选择此选项,则生成警告。对于许多安全关键型应用程序,自动删除死代码是不可接受的,因为这样做可能会使代码不可跟踪。

另请参阅

相关的话题