2012-04-11 10 views
0

私はタスクAと2つのメッセージキューQ1、Q2を作成しました。タスクAが2つのメッセージ待ち行列を待つことは可能ですか?RTOS:シングルタスク用に2つのMessage Queueを持つことは可能ですか?

私はそれが不可能であることを知っているので、メッセージQコールをブロックする場合、処理するメッセージがないときにタスクはブロックされます(ブロックされた状態)。

たとえば、Q1にmsgがあり、Q2にmsgがない場合、Q1の場合、タスクは準備完了状態にあり、Q2の場合はタスクがブロックされた状態でなければなりません。

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

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

+1

RTOSによって異なります。たとえば、MicriumのμC/ OS-IIIではこれが可能です。あなたはどちらを使っていますか?ユーザーマニュアルには何が書かれていますか? – Dan

+0

そして、RTOSがこれを直接許可しないとしても、これを可能にする2つのキューの周りにいつでも独自のラッパーをコード化することができます。もちろん、レース/デッドロックなどを導入するバグがないことを確認する責任があります。キューにメッセージをドロップするものは、RTOS APIの代わりにラッパーを使用する必要があります。 –

答えて

0

私はそれがRTOSの実装に依存すると思います。あなたは確かに2つのキューで保留を呼び出す能力を持つRTOSを書くことができます。 2つの引数を持つRTOS呼び出しです。次に、RTOSはこれらの2つのキューを管理し、タスクが両方とも保留中であることを認識します。しかし、私はこれを実装するRTOSを見たことがありません。

1

正確な方法はRTOSに依存しますが、基本的にはイベントやセマフォを待ってからキューをポーリングする必要があります(ノンブロッキング/ゼロタイムアウト読み出し)。送信タスクは、適切なキューにメッセージを配置してから、イベントまたはセマフォを設定する必要があります。これは、単一のタスクインターフェイス関数で実行する必要があります。送信タスクは、受信タスクのコミュニケーションに関するメカニックを知る必要はありません。

イベントフラグを使用する場合は、キューごとに別々のフラグを使用できるため、どのキューから読み込むかを知ることができますが、イベントフラグはオブジェクトをカウントしないため、待ち行列にメッセージ以上のメッセージがある場合にそれが使い果たされるまで待ち行列を繰り返しポーリングする。

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

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

0

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

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

関連する問題