2011-02-04 14 views
0

私たちにはLinux組み込みプロジェクトがあり、私たちはパフォーマンスに関心があります。シリアルポートの制限事項非同期入力機能?

シリアルポート非同期入力の例: http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html#AEN105 私たちが望むものはほとんどありません。

しかし ループスリープ呼び出しによって失われたCPU性能にチャージオブジェクト内のエンジニア。彼は、プログラムが代わりに応答処理コードを実行するシグナルを待つようにしたいと考えています。

私はすなわち、信号関数内に)(メインからそのコードを動かしてみました:

void signal_handler_IO (int status) 
{ 
    // I moved my code here 
} 

を結果が動作しない、その関数で作られたシリアルポートへの書き込みを迅速に失敗し、プログラムが完全になり、応答しない。

なぜですか?

そして、誰もがただ1つのシリアルポートのためのシグナル駆動I/Oの良いオンライン例がありますか?私はKerriskの "The Linux Priogramming Interface"の第63章を見ていて、狂ったようにグーグルを探しています。私は最初の例を行うより良い方法がないかもしれないと考え始めています。事前に

おかげで、一般的には

バート

+2

コメント「は、通常、我々はここに何か役に立つだろう」を参照してください。ノンブロッキングI/Oをセットアップしてスリープを呼び出したり、ノンブロッキングI/Oをセットアップしたりして、そのスレッドで役に立つ何かを実行しないでください。それ以外の場合は、マルチスレッドに移行する場合は、スレッドをシリアルに見せてブロックI/Oを使用するようにしてください。カーネルは何かするまでスレッドを一時停止します。または、selectを使用して複数の入力ソースを監視するI/Oスレッドがあり、そのいずれかに入力がある場合にのみ目覚めるようになります。一般的に –

+0

が、それは同じ質問に(「なぜ?つまり」と「誰でも例がありますか?」)は、2つの別々の質問をする悪い考えです。 http://meta.stackexchange.com/questions/39223/one-post-with-multiple-questions-or-multiple-postsを参照してください。 –

答えて

0

は、複雑な何もすることは危険であるシグナルハンドラ内(すなわち、即時のスタックを超えたものに触れる) - かなり完全な説明のためのhttp://www.gnu.org/s/libc/manual/html_node/Nonreentrancy.htmlを参照してください。 I/O操作は、ハードウェアなどの割り当てや突き止めを行う傾向があるため、特に安全ではありません。

明示的な待機ループが気に入らない場合は、セマフォーを試してみてください。詳細は、 http://linux.die.net/man/7/sem_overviewを参照してください。あなたがusleepの代わりにあなたの読み取りループにsem_waitに(ブロッキング)呼び出しを入れ、その後、あなたのシグナルハンドラでsem_postを呼び出してブロックを解除することができますので、特に、sem_postは明示的に、シグナルハンドラで使用するために安全であると記載されています。

1

使用可能な入力がない場合usleep()呼び出しから定期的に目を覚ます心配している場合は、単純にSIGIOが発生するまで、あなたのプロセスを一時停止しますpause()、とusleep()呼び出しを置き換えます。

関連する問題