生成コードからの reset 関数と disable 関数の削除
この例では、モデル参照階層を含む ERT ベースのシステムの生成コードから reset 関数と disable 関数の到達不能 (デッド コード) インスタンスをコード ジェネレーターで削除する方法を示します。生成コードを最適化して到達不能コードを削除することは、セーフティ クリティカルなシステムのための要件となります。この最適化によって、実行速度も向上し、ROM の消費も低減されます。
状態をもつブロックがモデルに含まれている場合、生成コードに reset 関数と disable 関数が含まれます。モデルが Enabled Subsystem などの条件付き実行システムの一部でなければ、disable 関数が生成コードで呼び出されることはないため、コード ジェネレーターで削除できます。モデルが制御入力によるイネーブル時に状態をリセットできる条件付き実行システムの一部でなければ、reset 関数が生成コードで呼び出されることはないため、コード ジェネレーターで削除できます。
モデル例
DisableResetFunctionBottom は DisableResetFunctionTop の参照モデルです。この参照モデルには状態をもつブロックが 2 つあります。Delay ブロックと Discrete-Time Integrator ブロックです。


この最適化を使用しないコードの生成
DisableResetFunctionTop モデルを開き、コードを生成します。
modelTop = 'DisableResetFunctionTop'; open_system(modelTop); evalc('slbuild(modelTop)');
DisableResetFunctionBottom.c ファイルに次の reset 関数と disable 関数が含まれます。
cfileReset = fullfile('slprj','ert','DisableResetFunctionBottom','DisableResetFunctionBottom.c'); coder.example.extractLines(cfileReset,'/* System reset for referenced model:', '/* Enable for referenced model:', 1, 0);
/* System reset for referenced model: 'DisableResetFunctionBottom' */
void DisableResetFunctionBottom_Reset(DisableResetFunctionBottom_DW_f *localDW)
{
/* InitializeConditions for Delay: '<Root>/Delay' */
localDW->Delay_DSTATE = 0.0;
/* InitializeConditions for DiscreteIntegrator: '<Root>/Discrete-Time Integrator' */
localDW->DiscreteTimeIntegrator_DSTATE = 3.0;
}
cfileDisable = fullfile('slprj','ert','DisableResetFunctionBottom','DisableResetFunctionBottom.c'); coder.example.extractLines(cfileDisable,'/* Disable for referenced model', '/* Output and update for referenced model:', 1, 0);
/* Disable for referenced model: 'DisableResetFunctionBottom' */
void DisableResetFunctionBottom_Disable(real_T *rty_Out1,
DisableResetFunctionBottom_DW_f *localDW)
{
/* Disable for DiscreteIntegrator: '<Root>/Discrete-Time Integrator' */
localDW->DiscreteTimeIntegrator_DSTATE = *rty_Out1;
}
モデルが条件付き実行システムの一部ではないため、DisableResetFunctionBottom_Disable 関数が DisableResetFunctionTop_step で呼び出されることはありません。モデルが制御入力によるイネーブル時に状態をリセットできる条件付き実行システムの一部ではないため、DisableResetFunctionBottom_Reset 関数が DisableResetFunctionTop_step 関数で呼び出されることはありません。
この最適化を使用したコードの生成
DisableResetFunctionBottom モデルを開きます。
modelBottom = 'DisableResetFunctionBottom';
open_system(modelBottom);DisableResetFunctionBottom の [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[インターフェイス] ペインの [詳細設定パラメーター] セクションで、[関数 disable の削除] パラメーターと [関数 reset の削除] パラメーターを選択します。
あるいは、コマンド ライン API を使用して最適化を有効にします。
set_param(modelBottom, 'RemoveResetFunc','on'); set_param(modelBottom, 'RemoveDisableFunc','on');
DisableResetFunctionTop モデルのコードを生成します。
evalc('slbuild(modelTop)');
slprj フォルダー内の ert フォルダーに移動し、DisableResetFunctionBottom.c ファイルを開きます。コードに DisableResetFunctionBottom_Reset 関数や DisableResetFunctionBottom_Disable 関数は含まれていません。
モデルとコード生成レポートを閉じます。
bdclose(modelTop) bdclose(modelBottom)