Real-Time Workshop User's Guide    

チュートリアル4: 生成コードの調査

このチュートリアルでは、簡単なモデルから生成されたコードを調べて、Real-Time Workshopで利用可能なコード最適化機能の効果を確認します。

図 1-5 は、ソースモデルを示しています。

図 1-5: example.mdl

モデルの設定

最初に、モデルを作成し、つぎのように基本的なSimulinkおよびReal-Time Workshopパラメータを設定します。

  1. ディレクトリexample_codegen を作成して、作業ディレクトリとします。
  2. 新規のモデルを作成し、example.mdlとして保存します。
  3. モデルにSine Wave, Gain, Out1ブロックを加え、 図 1-5のように接続します。図のように信号にラベルを付けます。
  4. Simulationから「シミュレーションパラメータ」を選択します。シミュレーションパラメータダイアログボックスがオープンします。
  5. ソルバタブをクリックし、ソルバページにつぎのパラメータ値を入力します。

    Solver options: TypeFixed-stepを設定します。ソルバアルゴリズムに ode5 (Dormand-Prince)を選択します。

    他のソルバページパラメータはデフォルトの値のままにします。

  1. Applyをクリックします。
  2. Workspace I/Oタブをクリックし、すべてのチェックボックスが選択されていないことを確認します。
  3. Applyをクリックします。
  4. Real-Time Workshopタブをクリックします。 from the CategoryプルダウンメニューからTarget configuration を選択します。つぎに、Generate code only オプションを選択します。このオプションにより、Real-Time Workshop は、コードのコンパイルおよびリンクのためmake を呼び出さずにコードを生成します。このオプションは、生成コードを見ることのみに関与するので、この例題にとって便利です。 BuildボタンのキャプションがGenerate codeに変わることに注意してください。

    一般的リアルタイム(GRT)ターゲットが選択されていることも確認してください。ページは、以下のように表示されます。

  1. Applyをクリックします。
  2. モデルを保存します。

バッファの最適化を行わずにコードを生成

ブロックのI/O最適化機能が利用可能なとき、Real-Time Workshopは、可能な場合すべてのブロック出力をローカルに格納します。生成コードの記述を調べるためにこのオプションを利用不可能にします

  1. Simulation からシミュレーションパラメータを選択します。シミュレーションパラメータダイアログボックスがオープンします。
  2. Advancedタブをクリックします。Signal storage reuse オプションを選択し、以下のようにOff ラジオボタンを選択します。

  3. Applyをクリックします。
  4. Real-Time Workshopタブをクリックし、Target configurationcategoryを選択します。その後Generate codeボタンをクリックします。
  5. Generate code only オプションが選択されたため、Real-Time Workshopはmakeユーティリティを呼び出しません。コード生成プロセスは、つぎのメッセージで終了します。

    ### Successful completion of Real-Time Workshop build procedure for model: example

  1. 生成されたコードは、ビルドディレクトリexample_grt_rtwにあります。ファイルexample_grt_rtw\example.c には、モデルに対する出力の計算が含まれます。このファイルをMATLABエディタでオープンします。

    edit example_grt_rtw\example.c

  1. example.cで、関数 MdlOutputsを検索します。

生成されたCコードは、Simulinkブロック線図で定義されたアルゴリズムを実現する手順で構成されます。ターゲットの実行エンジンは、進行する時間に従って手順を実行します。実行エンジンやその他の機能を実現するモジュールは、ランタイムインタフェースモジュールとして集合的に参照されます。

この例題では、生成されたMdlOutputs f関数は、ゲインによって正弦波を乗算するための実際のアルゴリズムを実現します。関数MdlOutputs は、モデルのブロック出力を計算します。ランタイムインタフェースは、各時間ステップでMdlOutputs を呼び出す必要があります。

バッファの最適化がオフのとき、MdlOutputsはバッファを各ブロックの入力と出力に割り当てます。これらのバッファ(rtB.sin_out, rtB.gain_out) は、グローバルデータ構造体rtBのメンバです。コードは以下のようになります。

バッファの最適化をオンにして、コードがどのように改良されるかを確認します。

バッファの最適化を用いてコードを生成

以下のようにバッファの最適化を利用可能にし、コードを再生成します。

  1. Simulationメニューから、 choose シミュレーションパラメータを選択します。シミュレーションパラメータ ダイアログボックスがオープンします。
  2. Advancedタブをクリックします。Signal storage reuse オプションを選択し、On ラジオボタンを選択します。
  3. Applyをクリックします。
  4. Real-Time Workshopタブをクリックします。CategoryプルダウンメニューからGeneral code generation options を選択します。

  1. Local block outputsオプションが上記のように有効で、選択されていることを確認してください。
  2. Applyをクリックし、Target Configuration を再度選択します。
  3. Generate code ボタンをクリックします。
  4. 先ほどのように、Real-Time Workshopはexample_grt_rtwディレクトリにコードを生成します。以前に生成したコードが上書きされることに注意してください。
  5. example_grt_rtw/example.cを変更し、関数MdlOutputsを再利用します。

バッファの最適化が利用可能なとき、MdlOutputsのコードは、各入力および出力にグローバルなバッファを割り当てずに、ローカルなテンポラリバッファrtb_temp0を再利用します。

このコードは、メモリ使用量に関してより効率的です。 Local block outputsを利用することによって得られる効率の改善は、多くの信号をもつ大規模モデルにおいてより重要です。

デフォルトでは、Local block outputsは利用可能であることに注意してください。第3章「コード生成とビルドプロセス」 に、その詳細やコード生成オプションについて記述されています。

model.cファイルの構造と実行に関する詳細は、第6章「プログラムアーキテクチャ」を参照してください。


 チュートリアル3:コードの検証 本マニュアルの情報の見つけかた