これは非常に基本的な質問/デザインですが、私はここで定義しようとしているシステムを扱う正しい方法に苦労しています。LinuxのTCPクライアント/サーバ
私は、TCP/IPプロトコルを介して組み込みLinuxボード(Raspberry Pi)に接続する単一のクライアント(PC)を持つシステムを持っています。これは、PCが何かを尋ねるコマンド/レスポンスシステムとなり、ラズベリーのPIが結果に応答します。例については
:
CMD =>読む/リターンADCチャンネルX
RSP => ADCチャンネルXデータ
私はすでにこれを許可するパケットプロトコルを定義しているこのタイプのシステムのためにインタラクション。私の問題は、これをRaspberry PIで処理する方法です。私は、TCP接続を扱う単一のスレッドを持つことを想定しています。取り込みデータをスレッドセーフ待ち行列に入れ、スレッドセーフ待ち行列から引き出すデータを引き出すこと。メインスレッドは定期的にキューをポーリングしてデータを探します。データが見つかると、コマンドが処理され、応答が生成されます。すべてのコマンドには応答があります。
メインスレッドは、他のタイムクリティカルなタスク(PID制御ループ)も実行し、受信データまたは送信データを待つことはできません。
私の推測では、このタイプのシステムはかなり一般的です。このタイプのシステムを実装するには、おそらく良いアプローチがあります。私はLinuxプログラミングにとって非常に新しいですが、私は高度に組み込みシステム(OSなし)を永遠にプログラミングしてきました。このタイプのデザインには正しいアプローチで苦労しています。
注意障害が発生した場合の再試行を処理するため、TCP/IPを選択しました。私の場合、すべてのコマンドには応答がありますので、設計をより簡単に/より柔軟にするためにUDPを使用することができます。
ご協力いただきまして誠にありがとうございます。
また、コマンドの数とパケットのサイズが大きく異なることにも言及しておきます。したがって、このシステムは、アプリケーションが実行されている時間全体を実行する必要があります。常にクライアントが接続されているとは限りません。 –
重要なスレッドは、このデータをとにかく持っていますか?それとも、リクエストに反応するためにそれを取得/計算する必要がありますか?データがすでに利用可能になっている場合、クライアントを処理するスレッドは単純な読み取り/処理/書き込みループを実行でき、キューは必要ありません。 「プロセス」部分は、スレッドセーフなストレージからデータにアクセスするだけです。 –
質問はそれほど広くありません。あなたが試みると、より質の高い回答が得られ、それが不満足な理由についての投稿を書いてください。 – jxh