2017-01-05 40 views
0

VxWorks 5.5とPPC8260には、非常に大規模なマルチタスク通信システムが実装されています。システムは大量のイーサネットトラフィックを処理し、RS-232、メモリマップI/Oなどを介して周期的なペリフェラル制御アクティビティを処理する必要があります。ある時点で、タスク間通信に使用しているメッセージキューがオーバーフローしますログ検査で参照してください)。このメッセージキューの処理を担当するタスクの状態を確認すると(受信を行っています)、READYに表示されます。キューのmsgQShowを調べると、キューはいっぱいですが、ブロックされているタスクはありません。しかし、タスク・スタック・トレースを見ると、実際にmsgQReceive内で保留中のタスクが呼び出されます。具体的には、qJobGetカーネル・コールまたは同様のものです。vxworksメッセージキューがブロックされたタスクが「失われました」。理由は何でしょうか?

+0

優先度の高いタスクが 'qJobGet'の実行中にブロックされているタスクを妨げている可能性がありますか? –

答えて

0

メッセージキューがブロックされたタスクを「失う」という極端な場合はありません。我々が想定することができ、あなたの説明から

  1. キューがオーバーフローしたメッセージ。おそらく、タイムアウト値またはNO_WAITで呼び出されたmsgQSendの戻り値をチェックすることでこれを検出しているはずです。
  2. msgstr "Qがいっぱいであることを確認してください。
  3. キューを読み込むタスクはREADY状態です。

READY状態は、タスクの実行が可能な状態です。タスクはキュー(厳密には優先レベルごとに1つのキュー)に保持され、キューの先頭に到達するとスケジュールされます。

タスクがREADYとして持続的に表示されている場合は、CPU時間が得られていないことが示唆されます。 msgQが空でないように見えるという事実は、それをサポートしています。

システムビューアなどのツールを使用して診断する必要があります。リーダータスクの優先度を上げる必要があるかもしれません。あなたのmsgQSendがNO_WAITを使用している場合、タイムアウト値を使用する必要があります

関連する問題