ゼロに設定されたローカル変数の初期化コードの生成を制御
既定では、コード ジェネレーターはローカル変数を明示的にゼロに初期化しません。これによって、より効率的なコードが生成されますが、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);
参考
ローカル変数のゼロ値への初期化を削除 | MISRA C++:2008 Rule 0-1-4
(Polyspace Bug Finder)