1

Ubuntu12.04を実行しているBeagleBoardで実行されるホームオートメーションプロジェクトのプログラムを作成する必要があります。プログラムの機能は次のとおりです。

  1. シリアルポート(私の場合はLinuxバージョンに既存のFTDIドライバーを使用する仮想COMポート)からデータを取得します。XBEEモジュールはUSBポートに接続され、USBポートは、Zigbeeプロトコルを介して受信し、Beagleボードにシリアルに送信します。

  2. 上記のデータをMySQLDBにダンプします。

  3. TCP / IPプロトコルを介してコマンドを送信し、TCP/IPを介して要求された情報を送信するタブレットからの指示を聞きます。小さなデータの場合もあれば、データの連続ストリームの場合もあります。

上記の機能を実装しました。詳細は以下のとおりです。

  1. シリアルの読み取りと書き込みに使用したコードは、次のWebサイトhttp://www.teuniz.net/RS-232/で提供されているヘッダーファイルを使用しています。while(1)ループを使用して、シリアルポートを継続的に読み取り、値をフェッチします。このために別のスレッドを作成しました。

  2. MySQLDBにデータをダンプするための別のスレッドを作成しました。

  3. TCP/IPサーバー用の別のスレッド。将来、複数のクライアント接続を受け入れる機能が追加されたときに、スレッドはより多くのスレッドを生成する可能性があります。

私の質問は次のとおりです。

  1. 1GhZ ARM 7コアを備えた組み込みプラットフォームで実行されていることを考えると、複数のスレッドを生成するこのプログラミング方法は優れたプログラミング方法ですか?

  2. それを行うためのより良い方法はありますか?

  3. シリアルポート経由で同時に読み書きできる方法を教えてください。これを行うには、読み取り機能と書き込み機能を別々のスレッドに再度配置する必要がありますか?

4

2 に答える 2

1

複数のスレッドを生成するこのプログラミング方法は、1GhZ ARM 7 コアを搭載した組み込みプラットフォームで実行されていることを考えると、適切なプログラミング方法ですか?

現在、シリアル ポート用のリスナー スレッド、データベース管理スレッド、および TCP/IP 用のスレッドの 3 つのスレッドがあるとおっしゃいました。

ここでの答えは、ハードウェアから絞り出したいパフォーマンスに大きく依存するということです。これらの各スレッドが消費する CPU リソースはどれくらいですか?

私の意見では、スレッドはソフトウェアの設計と外観を簡素化します (ほとんどの場合)。ただし、コストがかかります。

  • それらにはcontext-switchingが必要です。頻繁に実行すると、パフォーマンスが大幅に低下します。
  • それらはデバッグをより困難にします。

プラットフォームのパフォーマンス限界に近づくつもりがない場合、私の無知な推測では、今のところ 3 つのスレッドで問題ないはずです。


それを行うためのより良い方法はありますか?

これはあなたの前の質問に非常に関連しています。私はあなたのプロジェクトのボトルネックと制約に精通していません。いくつかあるかもしれませんし、まったくないかもしれないので、もっと良い方法があるかどうかはわかりません。それはまた、あなたが本当に達成したいことにもよります。もちろん、それを行うの方法もあります。

たとえば、複数のスレッドの代わりに、複数のプロセスを実装できます。マルチプロセッシングには、独自の長所と短所があります。

  • 文脈上、より重いです。また、通常、IPCはより複雑です。
  • より安定しています。1 つのプロセスでエラーが発生しても、別のプロセスが停止することはありません。


シリアルポート経由で同時に読み書きできる方法を教えてください。これを行うには、読み取り機能と書き込み機能を別のスレッドに配置する必要がありますか?

while(1)読み取りと書き込みの両方 (データのチャンクの読み取り、データのチャンクの書き込み、データのチャンクの読み取り、データのチャンクの書き込みなど) を処理する1 つのフラット スピニング ループとして、シリアル通信スレッドを実装することができます。 .)。

そうは言っても、シリアル通信スレッドを 2 つの別々のもの (Rx と Tx) に分割することは有効な (そして正しい) 提案だと思います。私はそのように実装された多くのプロジェクトに参加してきましたが、シリアルプロトコルがより複雑になるにつれて、通常は有益であることが証明されています.
ただし、シリアルポートが USB なのか RS-232 なのかはわかりません。


とにかく、私の答えが役に立ち、洞察に満ちていることを願っています。幸運を。

于 2012-06-23T10:52:59.017 に答える
0

複数のスレッドに代わるものは、複数のステート マシンです。

複数のステート マシンの背後にある理論は、1 つのスレッドが複数のステート マシンをポーリングするというものです。そのため、ステート マシンへの各呼び出しは「完了するまで実行」し、できるだけ早く戻る必要があります。

ステート マシンは、複数のスレッドよりもテストとデバッグが容易です。

これは、ポーリング ループが短時間スリープしない限り、常に 1 つのコアの時間の 100% を消費することを意味します。

したがって、RS232 読み取り、RS232 書き込み、DB アクセス、および TCP ポーリングのそれぞれに対してステート マシンを使用できます。

また、これは、プログラムの他の部分、または実際に他のプログラムを実行するために他のスレッドを持つことを妨げるものではありません。

于 2012-06-23T11:09:11.463 に答える