主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

控制将局部变量设置为零的初始化代码的生成

默认情况下,代码生成器不会明确地将局部变量初始化为零。这会产生更高效的代码,但违反某些编码标准,例如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);

另请参阅

| (Polyspace Bug Finder)

主题