2016-05-24 14 views
0

私は現在、IRビーコンを経由してナビゲートするロボット以下の小さなラインを設計しています。それはすべてC++でコード化されていますが、次の行とIRの受信を統合すると壊れているようです。 IRは割り込みサービスルーチンを使用してインターバルタイマーとSIGALRMを使用してIR信号を探します。 pathfinding関数は、他のいくつかのロボット操作とともに、sleep()を使用します。それは今SIGALRMが途中でプロセスを目覚めるとあなたは同じプログラムでSIGALRMと睡眠を()を使用することはできません私の注意に来ています。 sleep()関数の全プログラムを単純に削除するだけでなく、これを回避するには良い方法がありますか?SIGALRMと睡眠()C++

+0

私が考えることができる唯一の選択肢は、sleep()をpoll()またはselect()に置き換えて、空のファイル記述子をタイムアウトに設定するという醜いハッカーです。 –

答えて

0

ワンバンドエイド修正はsleepの代わりにnanosleep機能を使用することです。 nanosleepが時期尚早に起きると、残りの時間が時間構造に保存されるため、再試行できます。 sleepのような独自の関数でこれをラップすることができます。 nanosleepSIGALRMで実装されていないため、早期に目を覚ます理由はありません。アラーム信号ハンドラを設定するには、必ずsigactionを使用し、フラグにはすべてSA_RESTARTを指定してください。これにより、再起動可能なシステムコールにシグナルが影響しないようになります。

+0

ありがとう、これは私の問題を完全に解決!私は、すべての時間が経過するまで、nanosleepを再帰的に呼び出すラッパーを使用し、割り込みは休止時間を変更するようには見えません。 – Bwood94