2

私は組み込み RTOS (CMX) を使用していますが、これはどの組み込み RTOS にも当てはまると思います。さまざまなタスク間でメッセージを渡したい。問題は、1 つのタスクが他のすべてのタスクを長期間 (数秒) 'ロック' することがあります。

約 100 ミリ秒後にメッセージが ACK されるのをもう待たないので、この間にメールボックス メッセージを送信すると、メッセージを送信したタスクは応答を待機しなくなりますが、受信タスクはメッセージに基づいて行動してみてください。問題は、受信タスクがメッセージへのポインターを持っていることですが、送信タスクが移動したため、ポインターがメッセージを指しなくなり、大きな問題を引き起こす可能性があります。

キューに入ったメッセージを削除する方法はありません。このエラーを適切に処理するにはどうすればよいですか?

4

1 に答える 1

4

この質問は、実際にはいくつかの異なる問題/ポイントをカバーしています。

まず第一に、なぜ 1 つのタスクが一度に数秒間 CPU を占有するのか疑問に思っています。通常、これは設計上の問題を示しています。しかし、私はあなたのシステムを知りません.合理的な説明があるかもしれないので、そのうさぎの穴には入りません.

したがって、説明から、メッセージのコピーではなく、メッセージへのポインターをキューに入れています。本質的に悪いことは何もありません。しかし、あなたが説明した問題に正確に遭遇する可能性があります。

この問題には、少なくとも2 つの解決策があります。もっと知らなければ、どちらが良いとは言えません。

最初のアプローチは、メッセージへのポインターではなく、メッセージのコピーを渡すことです。たとえば、VxWorks メッセージ キュー (明らかに CMX キューではない) では、メッセージのコピーをキューに入れます。CMX がそのようなモデルをサポートしているかどうかはわかりません。また、そのようなアプローチをサポートする帯域幅/メモリがあるかどうかもわかりません。通常、私はできる限りこのアプローチを避けますが、場合によってはその場所もあります。

このような状況で可能な限り使用する2番目のアプローチは、送信者にメッセージバッファーを割り当てさせることです(通常は自分のメッセージ/バッファープールから、通常は固定サイズのメモリブロックのリンクリストですが、それは実装です詳細 -私が話していることの説明については、この「メモリ プール」の説明を参照してください)。とにかく -- 割り当ての後、送信者はメッセージ データを入力し、メッセージへのポインタをキューに入れ、メモリ ブロック (つまり、メッセージ) の制御 (所有権) を解放します。受信者は、メッセージを読み取った後にメモリを解放/返す責任があります

この質問で提起される可能性のある他の問題があります。たとえば、送信者がメッセージを複数の受信者に「ブロードキャスト」した場合はどうなりますか? 最後のリーダーだけがメモリを解放する (ガベージ コレクション) ように、受信者はどのように調整/通信しますか? しかし、うまくいけば、あなたが尋ねたことから、2番目の解決策がうまくいくでしょう.

于 2010-09-26T04:01:11.970 に答える