複数の for
構造の組み合わせによる生成コードの最適化
この例では、コード ジェネレーターで for
ループを組み合わせる方法を説明します。生成コードは for
構造を使用して、行列信号または Iterator ブロックなどのさまざまなモデル化パターンを表します。データの依存関係の解析を使用して、このコード ジェネレーターは for
構造を組み合わせて静的なコード サイズとランタイム分岐を削減します。
for
ループの最適化のメリットは、次のとおりです。
ROM と RAM の消費を低減する。
実行速度が上がる。
for
ループのモデル化パターン
モデル rtwdemo_forloop では、Switch ブロックおよび MATLAB Function ブロックが for
構造を表します。In1
のブロック パラメーター ダイアログ ボックスで、[端子の次元] パラメーターが 10
に設定されています。
コード生成
このモデルには、for
ループ反復全体でデータの依存性はありません。したがって、for
ループがコード ジェネレーターで 1 つのループに組み合わされます。Simulink Coder アプリまたは Embedded Coder アプリを開きます。次に、コードを生成して表示します。
### Starting build procedure for: rtwdemo_forloop ### Successful completion of build procedure for: rtwdemo_forloop Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================ rtwdemo_forloop 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 13.733s
生成ファイル rtwdemo_forloop.c
には 1 つの for
ループのコードが含まれます。
/* Model step function */ void rtwdemo_forloop_step(void) { int32_T k; /* MATLAB Function: '<Root>/Accum' */ /* MATLAB Function 'Accum': '<S1>:1' */ /* '<S1>:1:3' */ /* '<S1>:1:4' */ rtwdemo_forloop_Y.Out1 = 0.0; /* '<S1>:1:5' */ for (k = 0; k < 10; k++) { /* Switch: '<Root>/Switch' incorporates: * Gain: '<Root>/G1' * Gain: '<Root>/G3' * Inport: '<Root>/In1' * Sum: '<Root>/Sum1' * Sum: '<Root>/Sum2' * UnitDelay: '<Root>/Delay' */ if (3.0 * rtwdemo_forloop_U.In1[k] >= 0.0) { rtwdemo_forloop_DW.Delay_DSTATE[k] = rtwdemo_forloop_U.In1[k] - rtwdemo_forloop_DW.Delay_DSTATE[k]; } else { rtwdemo_forloop_DW.Delay_DSTATE[k] = (rtwdemo_forloop_DW.Delay_DSTATE[k] - rtwdemo_forloop_U.In1[k]) * 5.0; } /* End of Switch: '<Root>/Switch' */ /* MATLAB Function: '<Root>/Accum' */ /* '<S1>:1:5' */ /* '<S1>:1:6' */ rtwdemo_forloop_Y.Out1 += ((real_T)k + 1.0) + rtwdemo_forloop_DW.Delay_DSTATE[k]; } }
モデルを閉じます。