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