10

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

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

前もって感謝します。

-アシュウィン

4

4 に答える 4

14

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

詳細は次のとおりです。

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

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

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

ボーナス情報:

vxWorks はタスク スイッチング ロジックへのフックを提供するため、タスクがプリエンプトされるたびに関数を呼び出すことができます。

于 2010-06-08T18:13:39.220 に答える
6

indiv は非常に良い答えを提供しますが、部分的にしか正確ではありません。
システムの実際の動作はもう少し複雑です。

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

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

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

また、タイマー割り込みによって必ずしもコンテキスト スイッチが発生するとは限らないことも覚えておくとよいでしょう。はい、割り込みが発生し、遅延タスクとタイム スライス カウンターが減少します。ただし、タイム スライスの有効期限が切れていない場合、または優先度の高いタスクが保留状態から準備完了状態に遷移しない場合、スケジューラは実際には呼び出されず、実行が開始された正確な時点で元のタスクに戻ります。中断しました。

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

于 2011-02-15T00:32:25.900 に答える
0

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

于 2010-06-08T17:18:35.130 に答える
0

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

于 2010-06-08T11:52:12.213 に答える