このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
複数の 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)
### Searching for referenced models in model 'ForLoopConstruct'. ### Total of 1 models to build. ### Starting build procedure for: ForLoopConstruct ### Successful completion of build procedure for: ForLoopConstruct Build Summary Top model targets: Model Build Reason Status Build Duration =================================================================================================================== ForLoopConstruct Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 13.048s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 13.526s
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)