0

システムに何か異常が見られます。アプリケーション タスク 'xxxx' の 1 つは、セマフォに対して「保留中」です。その優先度は 94 で、以下は tt です。

This task is pending:
(de009e8)   329220 vxTaskEntry +5c: yyyy()
....
(de003a8)  1453384 aaaaaa +3fc: fdprintf()
(de00328)   37ea54 fdprintf +60: fioFormatV()
(de00100)   37f0ac fioFormatV +4f0: fioFormatV()
(de000e8)   37fb44 fioFormatV +f88: write()
(de000c8)   383218 write +50: iosWrite()
(de00050)   385218 iosWrite +d0: tyWrite()
(de00028)   394d80 tyWrite +60: semTake()
(de00008)   3de698 semTake +90: semBTake()

Sem Id: 0xf7dfa40  BINARY EMPTY Owner: 0x7a42e78 (yyyy)
Pended Tasks:   xxxx @ 94

ただし、タスク yyyy の tt は次のようになります。ここで最も重要な点は、このタスクが「READY」状態にあるということです。このタスクの優先度は 100 です。

<This task is ready>
(7a42e18)   329220 vxTaskEntry +5c: gggg()
....
(7a42cd8)   37e590 printf +84: fioFormatV()
(7a42ab0)   37fab8 fioFormatV +efc: fioFormatV()
(7a42a98)   37fb44 fioFormatV +f88: write()
(7a42a78)   383218 write +50: iosWrite()
(7a42a00)   385218 iosWrite +d0: devConsCreate()
(7a429e8)   127a18 devConsCreate +f8: write()
(7a429c8)   383218 write +50: iosWrite()
(7a42950)   385218 iosWrite +d0: tyWrite()
(7a42928)   394d80 tyWrite +60: semTake()
(7a42908)   3de698 semTake +90: semBTake()

'yyyy' が所有するセマフォに対してタスク 'xxxx' を保留するにはどうすればよいsemBtake()ですか?

4

2 に答える 2

0

同じセマフォを使用する 2 つのタスクがあるため、共有リソースを使用するコードの重要なセクションを保護するためにセマフォを使用していると思います。この仮定は正しくない可能性があります。その場合はお知らせください。

無制限の優先順位の逆転を扱っている可能性があります。タスク yyyy がセマフォを取得しました。タスク xxxx は保留中で、セマフォで待機しています。タスク yyyy は、CPU を使用し、タスク yyyy を許可しない 94 から 100 の間 (無制限の優先度反転) または 94 を超える (通常の優先度の高いタスクの干渉) よりも優先度の高いタスクがシステム内にあるため、プロセッサ上で実行されていません。完了するまで実行します。

これがすべて当てはまる場合は、バイナリ セマフォをミューテックスに置き換え、優先順位を継承することを検討してください。これにより、タスク XXX がミューテックスで保留中になると、タスク YYYY の優先度が一時的に 94 に昇格され、タスク XXXX に一致するようになります。したがって、タスク XXXX によってミューテックスが要求されている間、優先度 94 から 100 の間のタスクの実行がブロックされます。

プロセッサを放棄していない優先度 94 を超えるタスクである場合は、システム全体とそのタスクの実装方法を調べて、他の優先度の低いタスクを実行できるように何かを変更する必要があるかどうかを判断する必要があります。 CPU。

于 2013-12-13T20:27:08.287 に答える