このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
複数の for
構造の組み合わせによる生成コードの最適化
この例では、コード ジェネレーターで for
ループを組み合わせる方法を説明します。生成コードは for
構造を使用して、行列信号または Iterator ブロックなどのさまざまなモデル化パターンを表します。データの依存関係の分析を使用して、このコード ジェネレーターは for
構造を組み合わせて静的なコード サイズとランタイム分岐を削減します。
for
ループの最適化のメリットは、次のとおりです。
ROM と RAM の消費を低減する。
実行速度が上がる。
for
ループのモデル化パターン
モデル例 ForLoopConstruct
を開きます。Switch ブロックおよび MATLAB Function ブロックが for
構造を表します。In1
のブロック パラメーター ダイアログ ボックスで、[端子の次元] パラメーターが 10
に設定されています。
model = 'ForLoopConstruct';
open_system(model);
コードの生成
このモデルには、for
ループ反復全体でデータの依存性はありません。したがって、for
ループがコード ジェネレーターで 1 つのループに組み合わされます。
モデルを作成します。
slbuild(model)
### Starting build procedure for: ForLoopConstruct ### Successful completion of build procedure for: ForLoopConstruct Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================== ForLoopConstruct 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 29.517s
ForLoopConstruct.c
内の最適化されたコードを確認します。
cfile = fullfile('ForLoopConstruct_grt_rtw','ForLoopConstruct.c'); coder.example.extractLines(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void ForLoopConstruct_step(void) { real_T In1; real_T rtb_y; int32_T k; /* MATLAB Function: '<Root>/Accum' */ /* MATLAB Function 'Accum': '<S1>:1' */ /* '<S1>:1:3' */ /* '<S1>:1:4' */ rtb_y = 0.0; /* '<S1>:1:5' */ for (k = 0; k < 10; k++) { /* Gain: '<Root>/G1' incorporates: * Inport: '<Root>/In1' */ In1 = ForLoopConstruct_U.In1[k]; /* Switch: '<Root>/Switch' incorporates: * Gain: '<Root>/G1' * Gain: '<Root>/G3' * Sum: '<Root>/Sum1' * Sum: '<Root>/Sum2' * UnitDelay: '<Root>/Delay' */ if (3.0 * In1 >= 0.0) { In1 -= ForLoopConstruct_DW.Delay_DSTATE[k]; } else { In1 = (ForLoopConstruct_DW.Delay_DSTATE[k] - In1) * 5.0; } /* End of Switch: '<Root>/Switch' */ /* MATLAB Function: '<Root>/Accum' */ /* '<S1>:1:6' */ rtb_y += ((real_T)k + 1.0) + In1; /* Update for UnitDelay: '<Root>/Delay' */ ForLoopConstruct_DW.Delay_DSTATE[k] = In1; } /* Outport: '<Root>/Out1' */ ForLoopConstruct_Y.Out1 = rtb_y; }
生成コードには 1 つの for
ループのコードが含まれています。
モデルを閉じる
bdclose(model)
関連するトピック
- 効率的なコード生成に向けてモデルを最適化する設計手法
- ループ展開のしきい値の構成
- for ループ (Embedded Coder)