質問

タスクを切り替えることができるように、スケジューラがどのように呼び出されるかを知りたいです。プリエンプティブスケジューリングまたはラウンドロビンスケジューリングであっても、スケジューラは、あらゆる種類のタスクスイッチングを行うために想像する必要があります。優先度の低いタスクに無限のループがあると仮定します - スケジューラはいつ介入してより高い優先度タスクに切り替えますか?

クエリは次のとおりです。1。スケジューラを呼び出すのは誰ですか? [VXWorksで] 2.定期的に呼び出された場合、そのメカニズムはどのように実装されていますか?

前もって感謝します。

- アシュウィン

役に立ちましたか?

解決

簡単な答えは、VXWorksがシステムの実行中に固定間隔で継続的に発生するシステムタイマーからハードウェア割り込みを介して制御することです。

詳細があります:

VXWorksが起動すると、ハードウェアを構成してタイマーを生成します 割り込み 毎日 n Milliseconds、Where n 多くの場合10ですが、ハードウェアに完全に依存します。タイマー間隔は通常、VXWorksによって設定されます ボードサポートパッケージ(BSP) それが始まるとき。

タイマーが割り込みを発射するたびに、システムはタイマーの実行を開始します 割り込みハンドラー. 。タイマー割り込みハンドラーはVXWorksの一部であるため、VXWorksが制御できます。それが最初に行うことは、CPU状態(レジスタなど)をに保存することです。 タスクコントロールブロック(TCB) 現在実行中のタスクの。

その後、最終的にVXWorksはスケジューラを実行して、次に誰が実行されるかを決定します。タスクを実行するために、VXWorksはタスクの状態をTCBからマシンレジスタにコピーし、その後タスクがCPUを制御していることをコピーします。

ボーナス情報:

VXWorksが提供します フック タスクの切り替えロジックに、タスクが先制されるたびに関数が呼び出されるようにすることができます。

他のヒント

Indivは非常に良い答えを提供しますが、それは部分的にしか正確です。
システムの実際の作業はやや複雑です。

スケジューラは、同期操作または非同期操作の結果として実行できます。

同期とは、現在実行中のタスクのコードの結果として引き起こされる操作を指します。これの代表的な例は、セマフォ(Semtake)を取ることです。
セマフォが利用できない場合、現在実行中のタスクは抑制され、実行できなくなります。この時点で、スケジューラが呼び出され、実行する必要のある次のタスクを決定し、コンテキストスイッチを実行します。

非同期操作は、基本的に割り込みを指します。タイマー割り込みは、Indivによって非常によく説明されていました。ただし、多くの異なる要素により、割り込みが実行される可能性があります:ネットワークトラフィック、センサー、シリアルデータなど...

また、タイマー割り込みが必ずしもコンテキストスイッチを引き起こすとは限らないことを覚えておくのも良いことです!はい、割り込みが発生し、遅延タスクと時間スライスカウンターが減少します。ただし、時間スライスが期限切れになっていない場合、または より高い PriorityタスクがPEDINTから準備完了状態に移行すると、スケジューラは実際に呼び出されず、実行が中断された正確なポイントで元のタスクに戻ります。

スケジューラには独自のコンテキストがないことに注意してください。それはタスクではありません。それは、それが呼び出されるどんなコンテキストでも実行される単純なコードです。割り込みコンテキスト(非同期)または呼び出しタスクコンテキスト(同期)から。

ターゲットビルドが大きくなっている場合を除き、スケジューラはタイマー割り込みによって呼び出されます。ただし、詳細はプラットフォーム固有です。

現在のタスクが完了するかブロックされた場合、スケジューラは呼び出されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top