最大限度地减少块输出中间结果的计算和存储
Expression Folding
表达式折叠
表达式折叠优化代码,以最小化块输出处中间结果的计算,并将这些结果存储在临时缓冲区或变量中。启用“表达式折叠”时,代码生成器将块计算折叠(折叠)为单个表达式,而不是为模型中的每个块生成单独的代码语句和存储声明。大多数Simulink块支持表达式折叠。
表达式折叠提高了生成代码的效率,经常获得比手工优化代码更好的结果。在许多情况下,整个模型计算组被折叠成一行高度优化的代码。
可以在自己的内联S函数块中使用表达式折叠。有关详细信息,请参见支持表达式折叠的S函数。
Example Model
Generate Code
关闭expression folding后,在explfld.c文件中,代码生成器生成此代码。
/* Model step function */
void exprfld_step(void)
{
/* Gain: '<Root>/Gain' incorporates:
* Inport: '<Root>/In1'
*/
exprfld_B.S1 = exprfld_P.Gain_Gain * exprfld_U.i1;
/* Gain: '<Root>/Gain1' incorporates:
* Inport: '<Root>/In2'
*/
exprfld_B.S2 = exprfld_P.Gain1_Gain * exprfld_U.i2;
/* Outport: '<Root>/Out1' incorporates:
* Product: '<Root>/Product'
*/
exprfld_Y.Out1 = exprfld_B.S1 * exprfld_B.S2;
}
两个增益块都有单独的代码语句。在最终输出之前,这些代码语句计算增益块的临时结果。
启用优化
默认情况下,“表达式折叠”(Expression folding)处于启用状态。要查看现有模型是否启用了表达式折叠,请执行以下操作:
1.表达式折叠仅在选择配置参数>信号存储重用参数时可用,因为表达式折叠仅对涉及局部变量的表达式进行操作。启用信号存储重用参数。
2.选择“信号存储重用”时,“启用本地块输出”、“重用本地块输出”和“消除多余的局部变量(表达式折叠)”参数默认都处于启用状态。
优化生成代码
使用表达式折叠,代码生成器生成单行输出计算,如expfld.c文件所示。生成的注释记录了表达式中出现的块参数。
/* Model step function */
void exprfld_step(void)
{
/* Outport: '<Root>/Out1' incorporates:
* Gain: '<Root>/Gain'
* Gain: '<Root>/Gain1'
* Inport: '<Root>/In1'
* Inport: '<Root>/In2'
* Product: '<Root>/Product'
*/
exprfld_Y.Out1 =
exprfld_P.Gain_Gain *
exprfld_U.i1 *
(exprfld_P.Gain1_Gain * exprfld_U.i2);
}
更复杂模型上下文中的表达式折叠示例,请单击rtwdemo_slexprfold,或在命令提示下键入:
rtwdemo_slexprfold