web-dev-qa-db-ja.com

生産者-リアルタイムオペレーティングシステム(RTOS)のシグナリングアーキテクチャを備えた消費者

私はmbed-OS(RTOS for ARMアーキテクチャ)を利用してリアルタイムシステムを開発しています。私はソフトウェアエンジニアではないので、次の解決策があるかどうか知りたいです。実用的かどうか、そしてそれを改善する方法。

図に示すように、ソフトウェアの要素は次のとおりです。

3つの異なるクラス(ClassA、...)は、インスタンスが3つの異なるスレッド(スレッドa、...)に参照によって渡される3つの異なるモジュールからデータを収集するための低レベルのペリフェラルを記述します。 3つのキュー(queueA、...)を使用して、他の3つのスレッドからデータを収集しているスレッドdにデータを送信し、それらを結合して目的の形式(合成)の文字列を形成します。結合されたデータはスレッドeのキューに入れられ、いくつかのシナリオ(最初の3つのスレッドで発生)が満たされると、そのデータがスレッドgに送信されます。今の質問は:

最初の3つのスレッドは、異なる更新レートでデータを収集しています。スレッドdでそれらを同期する方法は?他のスレッド(イベントまたはシグナル?!)を認識するための最良のシグナリングソリューションは何ですか?言及されたアーキテクチャは実用的ですか?ありがとう。

ブロック図: block diagram

2
sohaami

あなたが逆転したような優先順位があります。

通常、ペリフェラルと通信するソフトウェアはドライバーレベルであり、抽象化の最低レベルです。ドライバーは、レベルを超えるロジックやデータについて何も知る必要はなく、周辺機器との通信方法とデータの配置場所についてのみ知る必要があります。

その次は、マネージャーレベルです。このレベルは、ドライバーと通信してデータを取得し、フォーマット、並べ替え、またはその他のタイプのアルゴリズムを実行します。

それらの上に、アプリケーションレベルがあります。このレベルは通常、包括的な状態マネージャーまたは「ビジネス」ロジックとして使用されます。

Embedded Software Architecture

ハードウェア割り込みは、RTOSスレッド/タスクではなく、ADCや通信デバイスなどの低レベルの周辺機器を処理するために適しています。これらの割り込みの処理とサービスは、ドライバーレベルで処理するのが最適です。したがって、「スレッド」A、B、Cは、ハードウェア割り込みからの割り込みになります。

また、RTOSタスク、b/cスレッドは同時に実行でき、典型的ではないという意味だと思います。 -)組み込み開発で。

データが受信されると、割り込みコンテキストからのイベント/メッセージ/フラグ/シグナルを取得して、データがその特定のデータ型の準備ができていることをマネージャータスクDに通知する必要があります。これにより、割り込み処理が最小限に抑えられ、コードの同期を安全に保つ複雑さが軽減されます。

メッセージキューが最適であるため、別の周辺機器からデータを収集しているときに、他の周辺機器の1つからメッセージが失われる心配が少なくなります。

覚えておくべきもう1つのことは、データにアクセスしている周辺機器/ドライバーの割り込みを無効にすることです。そうしないと、割り込みを受け取ったときに、アクセスしようとしているデータを操作するデータを移動/コピーしている可能性があり、データが破損する可能性があります。または、ドライバにFIFO循環バッファを設定する必要があります。この場合、割り込みは書き込みのみを行い、マネージャはドライバからの読み取りのみを行います。

タスクEはアプリケーションレベルで、外部アプリケーションがデータを要求するのを待つか、消費者が誰であれ、データを送信/ブロードキャストするサービスを提供します。

タスクFまたはGが必要な理由がわかりません。

これが長々とした答えである場合は申し訳ありませんが、組み込みソフトウェアアーキテクチャは非常に大きな知識空間です。

1
Spectrem

質問者はソフトウェアエンジニアではないことを理解していますが、質問に答えるには、リアルタイムエンジニアだけが理解する可能性が高い追加の異なる情報が必要です。

リアルタイムアーキテクチャの観点から重要な問題は、インバウンドデータレートとデータサイズ、およびシステムにデータを提供するコンポーネントのサービスに関連する問題です(バッファと期限はありますか?)。 CPUハードウェアのスケジューリング特性。 OSが優先順位を処理する方法。データ損失に対する許容度。このシステムが満たさなければならない集約の期限など。

リアルタイムのコンテキストでは、「スレッド」と「キュー」は高レベルであるため、具体的な数とコンポーネントが必要です。

0
Jonah Benton