要优化为模型生成的代码,可以选择使用输入范围信息的选项,也称为设计最小和最大,你可以在信号和参数上指定。这些最小值和最大值通常表示环境限制,如温度,或机械和电气限制,如传感器的输出范围。
在“配置参数”对话框中,单击优化选项卡,当您选择使用指定的最小值和最大值进行优化复选框时,软件使用最小值和最大值来推导模型中下游信号的范围信息。然后,它使用这个派生的范围信息来确定是否可以通过以下方法简化生成的代码:
将表达式简化为常量
删除条件语句的死分支
消除不必要的数学运算
这个优化结果是:
减少ROM和RAM的消耗
提高执行速度
为了让优化更有可能:
提供尽可能多的设计、最小和最大的信息。为模型中的信号和参数指定最小值和最大值:
轮廓尺寸和外港块
块输出
块输入,例如MATLAB函数和Stateflow图表块
万博1manbetx仿真软件。信号
对象
在生成代码之前,测试信号和参数的最小值和最大值。否则,优化可能导致数值与模拟不匹配。您可以在启用模拟范围检查的情况下模拟您的模型。如果出现错误或警告,请在生成代码之前修复这些问题。
在区块上游提供设计的最小和最大信息,尽可能接近区块的输入。如果您为块输出指定了最小值和最大值,那么这些值很可能会直接影响下游块的输出。
这个示例展示了如何使用在模型中的信号和参数上指定的最小值和最大值来优化生成的代码。
概述
指定的最小值和最大值通常表示环境限制,如温度,或机械和电气限制,如传感器的输出范围。
这种优化使用这些值来简化生成的代码。例如,它将表达式简化为常量或删除条件语句的死分支。
注意:确保您指定的最小值和最大值都是有效的限制。否则,这种优化可能导致数值与模拟不匹配。
优化生成代码的好处是:
减少ROM和RAM的消耗。
提高执行速度。
检查最小和最大信息
考虑到模型rtwdemo_minmax.在这个模型中,在Inports和增益块的增益参数上有指定的最小值和最大值。
模型=“rtwdemo_minmax”;open_system(模型);
生成没有此优化的代码
首先,为这个模型生成代码而不考虑最小值和最大值。
currentDir = pwd;[~, cgDir] = rtwdemodir ();rtwconfiguredemo(模型,“导”) rtwbuild(模型)
###启动模型的构建过程:rtwdemo_minmax
的一部分rtwdemo_minmax.c
下面列出的。
用= 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;/* Switch: ' /Switch'合并:* Gain: ' /Gain' * Inport: ' /U3' * RelationalOperator: ' /Relational Operator' * Sum: ' /Sum' */ if (tmp <= k * U3) {/* Outport: ' /Out1'合并:* Sum: ' /Sum2' */ rtY. log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log . log。Out1 = tmp + U3;其他}{/ *外港:“< Root > /着干活”包含:*尺寸:‘< Root > / U1’*尺寸:< Root > / U2的*产品:根> < /产品的* /而无。Out1 = U1 * U2 * U3;} }
使这种优化
打开“配置参数”对话框。
在优化窗格中,选择使用指定的最小值和最大值进行优化.
或者,您可以通过设置命令行参数来启用此优化。
set_param(模型,“UseSpecifiedMinMax”,“上”);
使用此优化生成代码
在模型中,用指定的最小值和最大值U1
和U2
的和U1
和U2
最小值为50。考虑到U3
和指定的最小值和最大值的增益块参数,增益块的输出最大值为40。
Relational Operator块的输出仍然为false, Switch块的输出仍然是这三个输入的乘积。
使用Embedded Coder配置和构建模型。
rtwconfiguredemo(模型,“导”) rtwbuild(模型)
###启动模型的构建过程:rtwdemo_minmax
查看优化的代码rtwdemo_minmax.c
.
用= fullfile (cgDir,“rtwdemo_minmax_ert_rtw”,“rtwdemo_minmax.c”);rtwdemodbtype(用“/ *模型步骤”,/ *初始化模型的1 0);
/ *模型阶跃函数* /空白rtwdemo_minmax_step (void){/ *外港:“< Root > /着干活”包含:*尺寸:‘< Root > / U1’*尺寸:< Root > / U2的*尺寸:< Root > / U3的*产品:根> < /产品的*开关:“< Root > /开关”* /而无。Out1 = U1 * U2 * U3;}
关闭模型并进行清理。
bdclose rtwdemoclean(模型);cd (currentDir)
该优化不考虑最小值和最大值:
合并块的输入。要解决这个问题,请使用万博1manbetx仿真软件。信号
对象的合并块输出并指定该对象上的范围。
总线的元素。
有条件执行的子系统(如触发的子系统)块输出直接连接到外港块。
外港有条件执行的子系统中的块可以有一个指定的初始值,仅在系统未触发时使用。在这种情况下,优化不能使用块输出的范围,因为该范围可能不会覆盖块的初始值。
如果你使用Polyspace®软件来验证使用此优化生成的代码,它可能会将以前的绿色代码标记为橙色。例如,如果您的模型包含分母范围不包括零的除法,则生成的代码不包括防止被零除法的保护。Polyspace可能会将此代码标记为橙色,因为它没有关于除法输入的最小值和最大值的信息。
Polyspace代码验证™自动捕获在MATLAB中指定的最小值和最大值®例如,工作空间万博1manbetx仿真软件。信号
和万博1manbetx仿真软件。参数
对象。在本例中,要向Polyspace软件提供范围信息,请使用万博1manbetx仿真软件。信号
对象,并指定不包含零的范围。
Polyspace代码验证将这些值存储在数据范围规范(DRS)文件中。然而,它们不会捕获Simulink中的所有最小值和最大值万博1manbetx®模型。要向Polyspace提供额外的最小和最大信息,可以手动定义DRS文件。
如果您使用双精度数据类型和代码生成>接口>万博1manbetx支持非谓语形式的数字选择配置参数,则不会发生此优化。
如果您的模型包含可重用子系统的多个实例,并且每个实例使用具有不同最小值和最大值的输入信号,则此优化可能会为每个子系统生成不同的代码,因此不会发生代码重用。如果不进行此优化,则只为子系统生成一次代码,并在子系统的多个实例之间共享此代码。
模型顾问DO-178C/DO-331检查检查与安全相关的优化设置如果选择此选项,则生成警告。对于许多安全关键型应用程序来说,自动删除死代码是不可接受的,因为这样做可能会使代码无法跟踪。有关使用check来遵守DO-178C/DO-331的更多信息,请参见检查与安全相关的优化设置(万博1manbetx仿真软件检查)。