控制设置为零的局部变量的初始化代码的生成
默认情况下,代码生成器不会将局部变量显式初始化为零。这会生成更高效的代码,但会违反某些编码标准,例如 MISRA C++:2008 Rule 0-1-4 (Polyspace Bug Finder)。此示例说明如何禁用此优化,以从设置为零的局部变量中删除初始化代码。
示例模型
打开 LocalVariableZeroInitialization 模型。该模型包含一个子系统,后者包含 Sum 模块和 Gain 模块。
model = 'LocalVariableZeroInitialization';
open_system(model);
生成代码并进行优化
使用 Embedded Coder 编译模型。
evalc('slbuild(model)');以下代码包含在文件 LocalVariableZeroInitialization.c 中。生成代码不会将局部变量初始化为零。
/* Model step function */
void LocalVariableZeroInitialization_step(void)
{
real_T rtb_Gain4;
real_T rtb_Sum1;
/* Gain: '<S1>/Gain4' incorporates:
* Gain: '<S1>/Gain3'
* Inport: '<Root>/In3'
*/
rtb_Gain4 = 2.0 * rtU.In3 * 2.0;
/* Sum: '<S1>/Sum1' incorporates:
* Gain: '<S1>/Gain1'
* Gain: '<S1>/Gain5'
* Inport: '<Root>/In2'
*/
rtb_Sum1 = 2.0 * rtU.In2 * 2.0 + rtb_Gain4;
/* Outport: '<Root>/Out1' incorporates:
* Gain: '<S1>/Gain'
* Gain: '<S1>/Gain2'
* Inport: '<Root>/In1'
* Sum: '<S1>/Sum'
*/
rtY.Out1 = (2.0 * rtU.In1 + rtb_Sum1) * 2.0;
/* Outport: '<Root>/Out2' */
rtY.Out2 = rtb_Sum1;
/* Outport: '<Root>/Out3' */
rtY.Out3 = rtb_Gain4;
}
禁用优化
打开“配置参数”对话框。展开代码生成节点并点击优化。点击高级参数并清除删除初始化为零值的局部变量参数。
您也可以使用 MATLAB 命令行窗口禁用优化。将模型参数 RemoveLocalVariableInitialization 设置为 'off'。
set_param(model, 'RemoveLocalVariableInitialization', 'off');
生成代码但不进行优化
使用 Embedded Coder 编译模型。
evalc('slbuild(model)');以下代码包含在文件 LocalVariableZeroInitialization.c 中。生成代码将局部变量初始化为零。
/* Model step function */
void LocalVariableZeroInitialization_step(void)
{
real_T rtb_Gain4 = 0.0;
real_T rtb_Sum1 = 0.0;
/* Gain: '<S1>/Gain4' incorporates:
* Gain: '<S1>/Gain3'
* Inport: '<Root>/In3'
*/
rtb_Gain4 = 2.0 * rtU.In3 * 2.0;
/* Sum: '<S1>/Sum1' incorporates:
* Gain: '<S1>/Gain1'
* Gain: '<S1>/Gain5'
* Inport: '<Root>/In2'
*/
rtb_Sum1 = 2.0 * rtU.In2 * 2.0 + rtb_Gain4;
/* Outport: '<Root>/Out1' incorporates:
* Gain: '<S1>/Gain'
* Gain: '<S1>/Gain2'
* Inport: '<Root>/In1'
* Sum: '<S1>/Sum'
*/
rtY.Out1 = (2.0 * rtU.In1 + rtb_Sum1) * 2.0;
/* Outport: '<Root>/Out2' */
rtY.Out2 = rtb_Sum1;
/* Outport: '<Root>/Out3' */
rtY.Out3 = rtb_Gain4;
}
关闭模型。
bdclose(model);
另请参阅
删除初始化为零值的局部变量 | MISRA C++:2008 Rule 0-1-4 (Polyspace Bug Finder)