Main Content

複数の 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)

関連するトピック