1

SMP をサポートする VxWorks で実行する優先度の異なる 2 つのタスク「A」と「B」があるとします。'A' と 'B' の両方が I/O デバイス (ディスクや NIC など) にコマンドを発行し、どちらもブロックして結果を待ちます。つまり、「A」と「B」の両方が同時にブロックされます。しばらくして、I/O デバイスが割り込みを発生させ、ISR が呼び出されます。次に、ISR は延期された作業 (別名「下半分」) をワーカー タスクにディスパッチします。質問: ワーカー タスクの優先度は?

VxWorks Device Driver Developer's Guide は少しあいまいです。ワーカータスクの優先度はアプリオリに設定されているようです。結果を待ってブロックされているタスク (「A」と「B」) の優先度に基づいてワーカー タスクの優先度を上げる自動継承メカニズムはありません。これは、PREEMPT_RT Linux でスレッド化された割り込み優先度がどのように機能するかに似ています。ただし、QNX Neutrino と LynxOS の両方が、ブロックされたタスクの最大優先度でワーカー タスクをスケジュールします。優先度(ワーカー) = max_priority(A, B)。

誰でも明確にできますか?

4

1 に答える 1

1

それは、「ISR ディスパッチ遅延作業」が使用するメカニズムに正確に依存します。

セマフォ/メッセージ キュー/イベントが使用されている場合、受信側タスク (A または B) は、タスクの作成時に指定された優先度で実行されます。このシナリオでは、割り込みは基本的に終了し、タスク (A および/または B) は実行する準備ができています。

最も優先度の高いタスクが実行され、その作業が実行されます。タスクは、割り込みコンテキストからの情報にアクセスできないことに注意してください。グローバル構造 (yuk) を使用するか、メッセージ キューを介してデータを渡す場合、タスクはそれらの要素にアクセスできます。

ネットワーク スタック タスク (tNetTask) はこのアプローチを使用し、パケットが受信されるとセマフォが tNetTask に通知します。tNetTask がパケットを処理すると (パケットの再構成など)、対応するソケットで待機しているタスクに転送されます。

ISR から tExcTask への作業を延期することができます (excJobAdd への呼び出しを介して)。このアプローチでは、excJobAdd は関数へのポインターを取得し、tExcTask (システムで最高の優先度) のコンテキストで関数を実行することに注意してください。自己完結型のタスクとしては機能しません。

ファイル システム、SCSI ドライバー、USB などのようなものは、割り込みを伴う単純なドライバー以上のものであることに注意してください。それらには、残念ながら複雑さを増すさまざまなコンポーネントが多数含まれています。

于 2012-09-24T01:38:49.967 に答える