0

タスクAと2つのメッセージキューQ1、Q2を作成しました。タスクAが2つのメッセージキューで待機することは可能ですか?

私が知っているように、それは不可能です。メッセージQ呼び出しをブロックする場合、処理するメッセージがないときにタスクはそれ自体をブロックします(ブロックされた状態)。

たとえば、Q1にメッセージがありQ2にメッセージがない場合、Q1の場合、タスクは準備完了状態になり、Q2の場合、タスクはブロック状態になっている必要があります。

タスクを一度に2つの状態にすることはできません。

私の理解は正しいですか?

4

3 に答える 3

2

正確な方法は RTOS によって異なりますが、基本的には、イベントまたはセマフォを待機してから、キューをポーリングする必要があります (ノンブロッキング/ゼロ タイムアウト読み取り)。送信タスクは、メッセージを適切なキューに入れ、イベントまたはセマフォを設定する必要があります。これは、単一のタスク インターフェイス関数で行う必要があります。送信タスクは、受信タスクの通信の仕組みを知る必要はありません。

イベント フラグを使用する場合は、キューごとに個別のフラグを使用できるため、どのキュー (一方または他方、または両方) から読み取るかがわかりますが、イベント フラグはオブジェクトをカウントしないため、キューをポーリングする必要があります。キューに複数のメッセージがある場合は、使い果たされるまで繰り返します。

カウントセマフォはある程度役に立ちますが、メッセージがどのキューにあるかではなく、メッセージの総数を通知するだけなので、セマフォが取得されるたびに両方をチェックする必要があります。これにより、1 つのセマフォ カウント (各キューから 1 つ) に対して 2 つのメッセージが読み取られ、その後に対応するメッセージのない sem-take が続く可能性があります。共有データを使用してセマフォを拡張するか、RTOS でキュー内のメッセージ数を報告できる場合があります。

バイナリ セマフォはイベント フラグのように機能しますが、どちらのキューにメッセージがあるかを知る方法がないため、両方をポーリングする必要があります。

于 2012-04-11T20:59:15.660 に答える
0

RTOSの実装次第だと思います。確かに、2 つのキューで保留する呼び出しを行う機能を持つ RTOS を作成できます。これは、2 つの引数を持つ単なる RTOS 呼び出しです。次に、RTOS はこれら 2 つのキューを管理し、両方でタスクが保留中であることを認識します。ただし、これを実装する RTOS は見たことがありません。

于 2012-04-11T05:40:16.013 に答える
0

ほとんどの RTOS はこの機能を提供していませんが、実装することはできます。

RTOSの例として; GHS-INTEGRITY にはこの機能が組み込まれており、1 つまたは複数を待機できます。メッセージ キュー受信イベント、タイマー期限切れイベント、デバイス rx バッファー取得イベント、デバイス tx バッファー送信イベントが同じ行 (時間) で発生しました。

于 2012-05-05T00:36:10.543 に答える