Real-Time Workshop User's Guide | ![]() ![]() |
操作の概要
rt_OneStep
の操作は、生成しているモデルがシングルレートかマルチレートかにより異なります。コンパイルは、シンボルNUMST
によって制御され、これは、モデル内のサンプル時間の数(レート)を表わします。 NUMST
は、シングルレートモデルに対しては、1に定義され、そうでない場合は、NUMST
は1より大きくなります。NUMST
は生成されたmakeファイルmodel
.mk
で定義されます。
シングルレート操作. つぎの擬似コードは、シングルレートプログラムでのrt_OneStep
の設計を示します。
rt_OneStep() { 割り込みオーバフローまたはその他のエラーをチェック "rt_OneStep"(タイマ) 割り込みを可能にする ModelStep-- 時間ステップは、出力、ロギング、アップデートを統合します。 }
シングルレートrt_OneStep
は、単一のクロック周期内でmodel
_step
を実行するために設計されています。このタイミングの制限を強制するために、rt_OneStep
は、タイマのオーバランフラグを保持してチェックします。入力時に、タイマ割り込みは、オーバランフラグとその他のエラー条件がチェックされるまで不可能です。オーバランフラグがクリアされると、rt_OneStep
はフラグをテンポラリに設定し、タイマ割り込みを可能にして進めます。
model
_step
からの出力が成功すると、オーバランフラグはクリアされます。
タイマによるrt_OneStep
の再割り込みは、エラー条件です。この条件がオーバランフラグにより検出された場合は、rt_OneStep
はエラーを発生し直ちに出力します。
マルチレート操作. つぎの擬似コードは、マルチレートプログラムでのrt_OneStep
の設計を示します。
rt_OneStep() { ベースレートの割り込みオーバフローをチェック "rt_OneStep"割り込みを可能にする ModelStep(tid
=0) --ベースレートの時間ステップ For i=1:NumTasks -- サブレートタスクを繰り返す サブレート割り込みオーバフローをチェック If (sub-rate task i is scheduled) ModelStep(tid
=i) --サブレート時間ステップ EndIf EndFor }
マルチレートシステムでは、rt_OneStep
は、優先度が付けられたプリエンプティブなマルチタスクスキームを使って、異なるサンプルレートで実行するモデルコード部分を実行します。
異なるサンプルレートをもつブロックの実行は、タスクに分割されます。与えられたサンプルレートで実行する各ブロックは、タスク識別子 (tid
)を割り当てられます。これは、そのレートで実行するタスクとブロックを関連付けます。システム内にNUMST
のタスクがあるとき、タスク識別子の範囲は、0..NUMST
-1です。
rt_OneStep
は、レートの降順にタスクに優先度を付けます。ベースレートタスクは、システムの最速のレート(ハードウェアクロックレート)で実行するタスクです。ベースレートタスクは、高い優先度をもちます。ベースレートタスクのtid
は0です。つぎに速いタスク(tid
1)は、つぎに高い優先度をもち、もっとも遅いタスクはもっとも低い優先度をもちます(tid
NUMST
-1).
ベースレートの約数で実行する遅いタスクは、 サブレートタスクと呼ばれます。
各呼び出しで、rt_OneStep
は、1回または複数のmodel
_step
の呼び出しを行い、tid
を渡します。tid
は、そのtid
をもつすべてのブロックが実行されることをmodel
_step
に通知します。ベースレートタスクは各クロックステップで実行されなければならないので、rt_OneStep
は常にmodel
_step(tid = 0)
を呼び出します。
各クロック点で、rt_OneStep
は、各サブレートタスク用のスケジューリングカウンタとイベントフラグを保持します。カウンタとイベントフラグは、tid
でインデックス付けられた配列として実現されます。
実際に、カウンタは、各サブレートタスクに関連するサンプル間隔をカウントアップするクロックレート除算器です。イベントフラグは、与えられたタスクが実行に対してスケジューリングされるかどうかを示します。カウンタがタスクのサンプル間隔が経過したことを示すとき、rt_OneStep
は、そのタスクに対するイベントフラグを設定します。
スケジューリングデータ構造体をアップデートし、ベースレートタスクに進んだ後で、rt_OneStep
はフラグがtid
であるタスクに対して、tidの順番にスケジューリングフラグについてmodel
_step(tid)
の呼び出しを繰り返します。これは、タスクが優先度順に実行されることを保証します。
rt_OneStep
で用いられるイベントフラグ配列とループ変数は、ローカル(スタック)変数として格納されます。これは、rt_OneStep
は再入力であることを保証します。rt_OneStep
が再割り込みされる場合は、優先度が高いタスクが低いタスクより策に実行されます。割り込みから戻ると、優先度が低いタスクは、以前にスケジューリングされた順番で再開されます。
マルチレートrt_OneStep
は、タイマのオーバランフラグの配列を保持します。rt_OneStep
は、シングルレートrt_OneStep
と同じロジックによって、タスク毎にタイマのオーバランを検出します。
rt_OneStepの変更のガイドライン
rt_OneStep
は、広範囲の変更を必要としません。必要な変更は、オーバランフラグとエラー条件がチェックされた後に割り込みを再度可能にすることだけです。rt_OneStep
のコメントは、ユーザコードを付加するための適切な位置を示しています。
マルチレートrt_OneStep
では、for
およびwhile
ループローリングを解除することで、性能を改良できます。
MODEL_STEP
マクロ呼び出しをモデル固有の呼び出しで置き換えたい場合があります。そのときは、「エントリポイントを直接呼び出す方法」を参照してください。
rt_OneStep
に対するその他の変更は避けてください。タイミングデータ構造体(リアルタイムオブジェクトを含む)とロジックは、ERTプログラムの正しい操作にとって重要です。
![]() | メインプログラム | モデルのエントリポイント | ![]() |