問題定義:
Linux を実行する産業用組み込みシステム用のアプリケーションを設計しています。
システムは、外界からのイベントによって駆動されます。システムへの入力は、次のいずれかになります。
- デジタル IO ラインの形でのシステムへの入力はほとんどありません (e-stop のようなプロセッサの GPIO に接続されています)。
- このシステムは、システムを Web ブラウザ経由で制御できるようにする Web サーバーを実行します。
- システムは TCP サーバーを実行します。どの PC または HMI デバイスも、TCP/IP 経由でコマンドを送信できます。
システムは、Modbus を使用して UART 経由で RS485 スレーブ デバイスを駆動または制御する必要があります。システムは、クーラーのオン/オフなどのいくつかの IO ラインも制御する必要があります。このアプリケーションを定義するには、ステート マシンが不可欠であると考えています。コアアプリケーションは、次のスレッドを持つマルチスレッドアプリケーションでなければなりません...
- メインスレッド
- RS485 スレーブを制御するスレッド。
- Web インターフェイスからのイベントを処理するスレッド。
- デジタル I/O イベントを処理するスレッド。
- TCP/IP(ソケット)経由でコマンドを処理するスレッド
スレッド間通信には、Pthread 条件シグナル & 待機を使用しています。初期の設計アプローチ (メイン スレッドに 1 つのステート マシン) に従って、システムへの入力イベント (Web または tcp/ip またはデジタル I/O) はメイン スレッドに中継され、適切なスレッドと通信する必要があります。イベントは予定です。一般的なシナリオは、Web インターフェイスを介して RS485 スレーブのステータスを取得することです。この場合、Web インターフェイス スレッドはイベントをメイン スレッドにリレーし、メイン スレッドは状態を変更してから、RS485 スレーブを制御して応答するスレッドにイベントを伝達します。メイン スレッドは、応答を Web インターフェイス スレッドに送り返します。
質問:
- 各スレッドに独自のステート マシンを持たせて、メイン スレッドの複雑さを軽減する必要がありますか? そのような場合でも、メイン スレッドにステート マシンを用意する必要がありますか?
- 入力イベントを処理するスレッドは、メインスレッドをバイパスしてイベントを処理するスレッドと直接通信できますか? たとえば、Web インターフェイス スレッドは、RS485 スレーブを制御するスレッドと直接通信できますか?
- pthread 条件シグナルを使用してスレッド間通信を待機しても問題ありませんか、それともより良いアプローチがありますか?
- 外部からのイベントと他のスレッドからの応答を 1 つのスレッドで待機させるにはどうすればよいでしょうか。たとえば、Web インターフェイス スレッドは通常、Web サーバーの CGI ビンからのプロセス間通信のために、POSIX メッセージ キューでイベントを待ちます。CGI ビンは、このメッセージ キューを介して Web インターフェイス スレッドにイベントを送信します。このイベントを処理するとき、Web インターフェイス スレッドは他のスレッドからの応答を待ちます。このような状況では、前のイベントの処理が完了し、POSIX メッセージ キューでの待機に戻るまで、Web インターフェイスからの新しいイベントを処理できませんでした。
説明が長すぎて申し訳ありません...他の人が理解して助けてくれるように、可能な限り最善の方法で説明を進めたことを願っています。
必要に応じて、さらに情報を提供できます。