生成コードでのグローバル ブロック出力の再利用
ROM と RAM の消費量とデータ コピーを削減し、生成コードの実行速度を向上させます。モデル コンフィギュレーション パラメーター [グローバル ブロック出力の再利用] を選択することで、グローバル変数を再利用するようにコード ジェネレーターを設定します。
モデル例
コマンド ウィンドウで、GlobalReuse
モデルを開きます。
model='GlobalReuse'; open_system('GlobalReuse')
最適化を使用しないコードの生成
[コンフィギュレーション パラメーター] ダイアログ ボックスで、[信号ストレージの再利用] が選択されていることを確認します。
[コード生成]、[レポート] ペインで、[静的コード メトリクスの生成] がオンになっていることを確認します。
[グローバル ブロック出力の再利用] をオフにして、[適用] をクリックします。あるいは、このパラメーターをプログラムで設定することもできます。
set_param(model,'GlobalBufferReuse', 'off');
Ctrl+B を押してコードを生成します。
slbuild(model);
### Starting build procedure for: GlobalReuse ### Successful completion of build procedure for: GlobalReuse Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================= GlobalReuse Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 18.781s
最適化を行わない生成コードを表示します。ここで GlobalReuse.c
の一部を示します。
cfile = fullfile('GlobalReuse_ert_rtw','GlobalReuse.c'); coder.example.extractLines(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */ void GlobalReuse_step(void) { /* Sum: '<Root>/Sum' incorporates: * Delay: '<Root>/Delay' * Inport: '<Root>/In1' */ rtDW.Delay_DSTATE += rtU.In1; /* Outport: '<Root>/Out1' incorporates: * Delay: '<Root>/Delay' */ rtY.Out1 = rtDW.Delay_DSTATE; }
生成コードにはグローバル変数 rtDW.Delay_DSTATE
のデータ コピーが含まれています。静的コード メトリクス レポートを開きます。グローバル変数に対する読み取りと書き込みの合計回数は 8 回です。合計サイズは 32 バイトです。
最適化を使用したコードの生成
[コンフィギュレーション パラメーター] ダイアログ ボックスで、[グローバル ブロック出力の再利用] を選択し、[適用] をクリックします。あるいは、このパラメーターをプログラムで設定することもできます。
set_param(model,'GlobalBufferReuse', 'on');
コードを生成します。
slbuild(model);
### Starting build procedure for: GlobalReuse ### Successful completion of build procedure for: GlobalReuse Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================ GlobalReuse Code generated and compiled. Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 15.175s
最適化を行った生成コードを表示します。ここで GlobalReuse.c
の一部を示します。
cfile = fullfile('GlobalReuse_ert_rtw','GlobalReuse.c'); coder.example.extractLines(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */ void GlobalReuse_step(void) { /* Sum: '<Root>/Sum' incorporates: * Delay: '<Root>/Delay' * Inport: '<Root>/In1' */ rtY.Out1 += rtU.In1; }
コード ジェネレーターはデータ コピーを排除し、ステートメントの数を 2 つから 1 つに、グローバル変数の数を 3 つから 2 つに削減します。
静的コード メトリクス レポートを開きます。グローバル変数については、この最適化によってグローバル変数に対する読み取りおよび書き込みの合計回数が 8 回から 5 回に、合計サイズは 32 バイトから 24 バイトに削減されます。
bdclose(model)