Main Content

複数の 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];
  }
}

モデルを閉じます。

関連するトピック