メインコンテンツ

Data Store Read ブロックと Data Store Write ブロックのバッファーの再利用

Data Store Read ブロックと Data Store Write ブロックの一時的なバッファーを除去する

モデル コンフィギュレーション ペイン: [コード生成] / [最適化]

説明

[Data Store Read ブロックと Data Store Write ブロックのバッファーの再利用] パラメーターは、コード ジェネレーターに、Data Store Read ブロックと Data Store Write ブロックの一時的なバッファーを削除するように指示します。可能な場合は、Data Store Memory ブロックを直接使用します。

依存関係

このパラメーターは [信号ストレージの再利用] パラメーターを選択すると有効になります。

設定

on (既定値) | off
オン

可能な場合、Embedded Coder®Data Store Memory ブロックから直接読み取り、Data Store Memory ブロックに直接書き込みます。Data Store Memory ブロックを直接使用することで、生成されたコードにおいてデータのコピーが除去されて、RAM の消費が抑えられ、コード実行速度が向上します。

オフ

Embedded Coder は Data Store Read ブロックと Data Store Write ブロックの生成コードにバッファーを挿入します。

すべて展開する

この例では、コード ジェネレーターで Data Store Read ブロックおよび Data Store Write ブロックの一時的なバッファーを削除する方法を示します。この最適化により、実行速度が向上し、RAM の消費量が減ります。

モデル例

モデル rtwdemo_optimizedatastorebuffers には、Simulink 関数 DefineUpdateFunc を呼び出す関数呼び出し元 UpdateFunc が含まれています。Data Store Read ブロック DSRmem から読み取ります。Data Store Write ブロック DSWmem に書き込みます。

model='rtwdemo_optimizedatastorebuffers';
open_system(model);

最適化を使用しないコードの生成

[コンフィギュレーション パラメーター] ダイアログ ボックスで "[Data Store Read ブロックと Data Store Write ブロックのバッファーの再利用] パラメーター" の選択を解除するか、MATLAB® コマンド プロンプトで次のコマンドを入力します。

set_param(model,'OptimizeDataStoreBuffers','off');

モデルをビルドします。

slbuild(model)
### Searching for referenced models in model 'rtwdemo_optimizedatastorebuffers'.
### Total of 1 models to build.
### Starting build procedure for: rtwdemo_optimizedatastorebuffers
### Successful completion of build procedure for: rtwdemo_optimizedatastorebuffers

Build Summary

Top model targets:

Model                             Build Reason                                         Status                        Build Duration
===================================================================================================================================
rtwdemo_optimizedatastorebuffers  Information cache folder or artifacts were missing.  Code generated and compiled.  0h 0m 20.563s

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 22.695s

最適化を行わない生成コードを表示します。このコードは rtwdemo_optimizedatastorebuffers.c に含まれています。

cfile = fullfile('rtwdemo_optimizedatastorebuffers_ert_rtw',...
    'rtwdemo_optimizedatastorebuffers.c');
coder.example.extractLines(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void step(void)
{
  real_T rtb_DSR_last;
  real_T rtb_SimFuncCall_o1;
  real_T rtb_Sum_p;

  /* DataStoreRead: '<Root>/DSR' */
  rtb_DSR_last = mem.last;

  /* Switch: '<Root>/Switch' incorporates:
   *  Constant: '<Root>/Constant'
   *  DataStoreRead: '<Root>/DSR'
   *  Inport: '<Root>/Clear'
   */
  if (rtU.Clear) {
    rtb_SimFuncCall_o1 = 0.0;
  } else {
    rtb_SimFuncCall_o1 = mem.max;
  }

  /* End of Switch: '<Root>/Switch' */

  /* FunctionCaller: '<Root>/SimFuncCall' incorporates:
   *  Inport: '<Root>/DataNew'
   */
  UpdateFunc(rtb_SimFuncCall_o1, rtU.DataNew, &rtb_SimFuncCall_o1, &rtb_Sum_p);

  /* DataStoreWrite: '<Root>/DSW' */
  mem.last = rtb_SimFuncCall_o1;
  mem.max = rtb_Sum_p;

  /* Outport: '<Root>/Delta' incorporates:
   *  DataStoreRead: '<Root>/DSR'
   *  Inport: '<Root>/DataNew'
   *  Sum: '<Root>/Sum'
   */
  rtY.Delta = rtU.DataNew - rtb_DSR_last;
}

生成されたコードには、Data Store Read ブロックおよび Data Store Write ブロックのデータ コピーがそれぞれ含まれています。

最適化を使用したコードの生成

[コンフィギュレーション パラメーター] ダイアログ ボックスで [Data Store Read ブロックと Data Store Write ブロックのバッファーの再利用] パラメーターをクリアするか、MATLAB コマンド プロンプトで次のコマンドを入力します。

set_param(model,'OptimizeDataStoreBuffers','on');

モデルをビルドします。

slbuild(model)
### Searching for referenced models in model 'rtwdemo_optimizedatastorebuffers'.
### Total of 1 models to build.
### Starting build procedure for: rtwdemo_optimizedatastorebuffers
### Successful completion of build procedure for: rtwdemo_optimizedatastorebuffers

Build Summary

Top model targets:

Model                             Build Reason                     Status                        Build Duration
===============================================================================================================
rtwdemo_optimizedatastorebuffers  Generated code was out of date.  Code generated and compiled.  0h 0m 8.1245s

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 8.7772s

最適化を行った生成コードを表示します。このコードは rtwdemo_optimizedatastorebuffers.c に含まれています。

cfile = fullfile('rtwdemo_optimizedatastorebuffers_ert_rtw',...
    'rtwdemo_optimizedatastorebuffers.c');
coder.example.extractLines(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void step(void)
{
  real_T rtb_DSR_last;
  real_T tmp;

  /* DataStoreRead: '<Root>/DSR' */
  rtb_DSR_last = mem.last;

  /* Switch: '<Root>/Switch' incorporates:
   *  Constant: '<Root>/Constant'
   *  DataStoreRead: '<Root>/DSR'
   *  Inport: '<Root>/Clear'
   */
  if (rtU.Clear) {
    tmp = 0.0;
  } else {
    tmp = mem.max;
  }

  /* FunctionCaller: '<Root>/SimFuncCall' incorporates:
   *  DataStoreWrite: '<Root>/DSW'
   *  Inport: '<Root>/DataNew'
   *  Switch: '<Root>/Switch'
   */
  UpdateFunc(tmp, rtU.DataNew, &mem.last, &mem.max);

  /* Outport: '<Root>/Delta' incorporates:
   *  DataStoreRead: '<Root>/DSR'
   *  Inport: '<Root>/DataNew'
   *  Sum: '<Root>/Sum'
   */
  rtY.Delta = rtU.DataNew - rtb_DSR_last;
}

Data Store Write ブロックのデータ コピーは生成されたコードに含まれていません。Sum ブロックが Data Store Write ブロックの後に実行されるため、コードには Data Store Read ブロックのデータ コピーが含まれています。生成されたコードには、Sum ブロックの出力を保持する変数 rtb_DSR_last が含まれています。したがって、Sum ブロックは、次のタイム ステップにおける値ではなく、SimFuncCall が当該タイム ステップの開始時に計算した値を取得します。Sum ブロックの優先順位が SimFuncCall より低い場合、コード ジェネレーターは Data Store Read ブロックのデータ コピーを削除することがあります。コード ジェネレーターがデータ コピーを削除しない可能性があるその他のケースは次のとおりです。

  • Simulink 関数が内部で Data Store Memory ブロックに書き込みを行う場合。

  • Data Store Read ブロックまたは Data Store Write ブロックが、Data Store Memory ブロックから配列の要素を選択する場合。

  • Data Store Memory ブロックがカスタム ストレージ クラスをもつ場合。

  • Data Store Read ブロックと Data Store Write ブロックが同一ブロックにある場合 (ただし、そのブロックが Bus Assignment ブロックまたは Assignment ブロックである場合を除く)。

モデルを閉じ、クリーンアップします。

bdclose(model)

推奨設定

アプリケーション設定
デバッグ影響なし
トレーサビリティオフ
効率性オン
安全対策

推奨なし

プログラムでの使用

パラメーター: OptimizeDataStoreBuffers
型: 文字ベクトル
値: 'on' | 'off'
既定の設定: 'on'

バージョン履歴

R2017a で導入