| 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プログラムの正しい操作にとって重要です。
| メインプログラム | モデルのエントリポイント | ![]() |