正確な方法はRTOSに依存しますが、基本的にはイベントやセマフォを待ってからキューをポーリングする必要があります(ノンブロッキング/ゼロタイムアウト読み出し)。送信タスクは、適切なキューにメッセージを配置してから、イベントまたはセマフォを設定する必要があります。これは、単一のタスクインターフェイス関数で実行する必要があります。送信タスクは、受信タスクのコミュニケーションに関するメカニックを知る必要はありません。
イベントフラグを使用する場合は、キューごとに別々のフラグを使用できるため、どのキューから読み込むかを知ることができますが、イベントフラグはオブジェクトをカウントしないため、待ち行列にメッセージ以上のメッセージがある場合にそれが使い果たされるまで待ち行列を繰り返しポーリングする。
カウントセマフォはいくつか使用されていますが、メッセージの総数だけを示し、どのキューにあるのか分からないため、セマフォを取得するたびに両方のメッセージをチェックする必要があります。これにより、1つのセマフォカウント(各キューから1つ)に対して2つのメッセージが読み取られ、その後に対応するメッセージがないsem-takeが続きます。セマフォを共有データで補強したり、RTOSがキュー内のメッセージ数を報告したりする可能性があります。
バイナリセマフォーはイベントフラグのように動作しますが、どちらのキューにメッセージがあるかを示す方法がないため、両方をポーリングする必要があります。
RTOSによって異なります。たとえば、MicriumのμC/ OS-IIIではこれが可能です。あなたはどちらを使っていますか?ユーザーマニュアルには何が書かれていますか? – Dan
そして、RTOSがこれを直接許可しないとしても、これを可能にする2つのキューの周りにいつでも独自のラッパーをコード化することができます。もちろん、レース/デッドロックなどを導入するバグがないことを確認する責任があります。キューにメッセージをドロップするものは、RTOS APIの代わりにラッパーを使用する必要があります。 –