メインコンテンツ

ゼロに設定されたローカル変数の初期化コードの生成を制御

既定では、コード ジェネレーターはローカル変数を明示的にゼロに初期化しません。これによって、より効率的なコードが生成されますが、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;
}

最適化の無効化

[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[コード生成] ノードを展開し、[最適化] をクリックします。3 つのドットをポイントし、[詳細設定パラメーター] をクリックします。[ローカル変数のゼロ値への初期化を削除] パラメーターをオフにします。

あるいは、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)

トピック