Real-Time Workshop User's Guide | ![]() ![]() |
チュートリアル4: 生成コードの調査
このチュートリアルでは、簡単なモデルから生成されたコードを調べて、Real-Time Workshopで利用可能なコード最適化機能の効果を確認します。
図 1-5 は、ソースモデルを示しています。
モデルの設定
最初に、モデルを作成し、つぎのように基本的なSimulinkおよびReal-Time Workshopパラメータを設定します。
example_codegen
を作成して、作業ディレクトリとします。
!mkdir example_codegen
cd example_codegen
example.mdl
として保存します。
Solver options: Type に Fixed-step
を設定します。ソルバアルゴリズムに ode5
(Dormand-Prince)
を選択します。
他のソルバページパラメータはデフォルトの値のままにします。
make
を呼び出さずにコードを生成します。このオプションは、生成コードを見ることのみに関与するので、この例題にとって便利です。 BuildボタンのキャプションがGenerate codeに変わることに注意してください。
一般的リアルタイム(GRT)ターゲットが選択されていることも確認してください。ページは、以下のように表示されます。
バッファの最適化を行わずにコードを生成
ブロックのI/O最適化機能が利用可能なとき、Real-Time Workshopは、可能な場合すべてのブロック出力をローカルに格納します。生成コードの記述を調べるためにこのオプションを利用不可能にします
### Successful completion of Real-Time Workshop build procedure
for model: example
example_grt_rtw
にあります。ファイルexample_grt_rtw\example.c
には、モデルに対する出力の計算が含まれます。このファイルをMATLABエディタでオープンします。
edit example_grt_rtw\example.c
example.c
で、関数 MdlOutputs
を検索します。
生成されたCコードは、Simulinkブロック線図で定義されたアルゴリズムを実現する手順で構成されます。ターゲットの実行エンジンは、進行する時間に従って手順を実行します。実行エンジンやその他の機能を実現するモジュールは、ランタイムインタフェースモジュールとして集合的に参照されます。
この例題では、生成されたMdlOutputs
f関数は、ゲインによって正弦波を乗算するための実際のアルゴリズムを実現します。関数MdlOutputs
は、モデルのブロック出力を計算します。ランタイムインタフェースは、各時間ステップでMdlOutputs
を呼び出す必要があります。
バッファの最適化がオフのとき、MdlOutputs
はバッファを各ブロックの入力と出力に割り当てます。これらのバッファ(rtB.sin_out, rtB.gain_out) は、グローバルデータ構造体rtBのメンバです。コードは以下のようになります。
void MdlOutputs(int_T tid) { /* Sin Block: <Root>/Sine Wave */ rtB.sin_out = rtP.Sine_Wave_Amp * sin(rtP.Sine_Wave_Freq * ssGetT(rtS) + rtP.Sine_Wave_Phase); /* Gain Block: <Root>/Gain */ rtB.gain_out = rtB.sin_out * rtP.Gain_Gain; /* Outport Block: <Root>/Out1 */ rtY.Out1 = rtB.gain_out; }
バッファの最適化をオンにして、コードがどのように改良されるかを確認します。
バッファの最適化を用いてコードを生成
以下のようにバッファの最適化を利用可能にし、コードを再生成します。
example_grt_rtw
ディレクトリにコードを生成します。以前に生成したコードが上書きされることに注意してください。example_grt_rtw/example.c
を変更し、関数MdlOutputs
を再利用します。バッファの最適化が利用可能なとき、MdlOutputs
のコードは、各入力および出力にグローバルなバッファを割り当てずに、ローカルなテンポラリバッファrtb_temp0
を再利用します。
void MdlOutputs(int_T tid) { /* local block i/o variables */ real_T rtb_temp0; /* Sin Block: <Root>/Sine Wave */ rtb_temp0 = rtP.Sine_Wave_Amp * sin(rtP.Sine_Wave_Freq * ssGetT(rtS) + rtP.Sine_Wave_Phase); /* Gain Block: <Root>/Gain */ rtb_temp0 *= rtP.Gain_Gain; /* Outport Block: <Root>/Out1 */ rtY.Out1 = rtb_temp0; }
このコードは、メモリ使用量に関してより効率的です。 Local block outputsを利用することによって得られる効率の改善は、多くの信号をもつ大規模モデルにおいてより重要です。
デフォルトでは、Local block outputsは利用可能であることに注意してください。第3章「コード生成とビルドプロセス」 に、その詳細やコード生成オプションについて記述されています。
model
.c
ファイルの構造と実行に関する詳細は、第6章「プログラムアーキテクチャ」を参照してください。
![]() | チュートリアル3:コードの検証 | 本マニュアルの情報の見つけかた | ![]() |