6

私が書いているプログラムで非同期タスクを処理する方法がわかりません。経験豊富な誰かが少なくとも私を正しい方向に向けてくれることを願っています。

組み込み ARM プロセッサで Angstrom Linux を実行しています。私のプログラムは、公開されたハードウェア PWM と PTP 経由のカメラを介して複数のサーボを制御します。さらに、任意のクライアント (この場合は Android) からコマンドを受け取るのはソケット デーモンです。カメラの PTP は遅いです。プログラムの残りの部分が応答する必要があるため、タスクが完了するまで待ちたくありません。

スレッドを試してみましたが、カメラ スレッドに問題があると、プロセス全体が停止するようです。理想的には、カメラを単独で送信して、それが終了したらメイン機能に知らせたいと考えています。これは適切なフォーク手法ですか、それともスレッド化を不適切に実装しましたか?

さらに、クロスコンパイルの問題を回避するために、大規模な二次ライブラリには近づかないようにしたいと考えています。ご提案いただきありがとうございます。

4

3 に答える 3

3

あなたの問題は、ある種のプロセス間通信 (IPC) と通信する複数のプロセスの典型的なケースのように聞こえます。

カメラには独自のプロセスが必要であり、そのプロセスが停止しても、メイン プロセスに問題はありません。init(8)プロセスでカメラ プロセスを管理することもできます。何らかの理由でプロセスが停止した場合、プロセスを自動的に再起動できます。

名前付きパイプを永続的に設定すると、カメラ プロセスは、失敗後に再起動するたびに再度開くことができます。

名前付きパイプに関するドキュメントは次のとおりです。

http://www.tldp.org/LDP/lpg/node15.html

ウィキペディアのページからこれを見つけました:

http://en.wikipedia.org/wiki/Named_pipe

StackOverflow を検索したところ、名前付きパイプとソケットの議論が見つかりました。

IPC パフォーマンス: 名前付きパイプとソケット

于 2012-06-12T01:19:16.960 に答える
1

steveha の回答の基本的な方法を使用しますが、init(8) と名前付きパイプはスキップします。

fork()カメラコードを含む子であり、通常のパイプまたはドメインソケットを介して通信します。親で SIGCHLD のシグナル ハンドラーをコーディングしwait()ます。単独で停止した場合は、クリーンアップして再起動します。正常に終了した場合は、その場合に適切な処理を行います。あなたが選んだIPCを通して子供とコミュニケーションを取ってください。これにより、特にドメインソケットまたはパイプよりも子をより詳細に制御initできるようになり、FIFO のファンキーなセマンティクスをいじるよりも、親と子の間のセットアップと通信が容易になります。

もちろん、カメラのコードに実際に問題がある場合は、プログラム全体を削除せずに、失敗を管理しやすくするだけです。それがあなたの力の範囲内であれば、理想的にはカメラコードを完璧に動作させるべきです。

于 2012-06-12T02:25:06.047 に答える
0

スレッドを試してみましたが、カメラ スレッドに問題があると、プロセス全体が停止するようです。

プロセス全体を強制終了すると言うと、実際には何が起こるでしょうか?

フォークされたプロセスでバグをラップしようとするよりも、上記の問題をデバッグしたほうがよいと私は言います。信頼性の低いカメラを備えた信頼性の高いコア システムよりも、信頼性の高いカメラを備えた信頼性の高いシステムが必要です。

于 2012-06-12T02:33:13.503 に答える