2017-02-07 6 views
-1

私はしばらくタイマーで作業していましたが、私の状況に有望な解決策を得ることができませんでした。CLOCK_REALTIMEを使用したカーネル4.X用のナノ秒精度可変タイマー

基本的には、特定の時刻にパケットを送信したいと考えています。 >待つ - - > 1486500721.000000000

のにnanosleep(1000000000)

第二PACKET - >を待つ - >にnanosleep(1000000000)

1486500720.000000000

第一PACKET:たとえば 3番目のパケットは1486500722.000000000

- >待機 - >ナノスリープ(1000000000)

第四PACKET 1486500723.000000000

でそれらの間の時間間隔が正確1.000000000秒ですが、私は、パケットを送信するときに、その都度、それは異なる時間がかかります。

たとえば、1番目のパケットの場合、送信には0.005025045秒、次にナノスリープが開始されます。

したがって、私の2番目のパケットは、1486500721.000000000ではなく、486500721.005025045で送信されます。

毎回、gettimeコマンドのオーバーヘッドのオフセットを含む残りの時間を引いてclockgettime(CLOCK_REALTIME)を使用して、ナノスリープ値を調整する必要があります。

ナノ秒の精度のループでこれを行う必要があります(私は可能ではありませんが、できるだけ具体的にしたいと思います)。単純なforループを使用します。

私の質問は、より正確にこれを行うための良い方法がありますか?私はカーネル4.4を使っていますので、新しいカーネルや他の方法では私のものよりも正確である可能性が高いアプローチについて知っていますか?

+0

timer_create()でタイマーを設定します。 – EOF

+0

@EOF:ジッタが少ないとは限りません。 OP:Linuxや他の完全に成長したOSで、ナノ秒の精度を持つことはできません。 RTOSの場合でも、それよりもはるかに大きい下限があります(RTは「ジッタなし」を保証しません)。それはXY問題のように叫ぶ。あなたの**実際の**と具体的な問題は何ですか? – Olaf

+0

@Olaf:確かに、あなたは統計的*ジッタを得るでしょう。しかし、OPの現在のアプローチと違って、段階的な変化はほとんどありません。 – EOF

答えて

0

clock_nanosleepを使用すると、相対時間のみを使用するnanosleepではなく、絶対時間を待つことができます。しかし、あなたが求めている精度の程度を得る方法はありません。クロックが切れた後にユーザー空間に戻るだけでは、1000以上でなければ少なくとも数百ナノ秒かかるでしょう。また、目を覚ました後にパケットを送信するのに予測できない遅延もあります。

あなたの目を覚ます時間も、​​目的に合わせて「十分に近い」ものにすることができます。

+0

代わりに 'timer_create()'を使ってインターバルタイマーを設定することをお勧めします。 – EOF

+0

@ EOF:なぜですか?シグナルハンドラは実行するためのひどいコンテキストであるため、 'clock_nanosleep'を呼び出すスレッドは他のプログラムとやりとりする方法に関してはるかに優れたコンテキストです。どちらも、パフォーマンス/タイミングの面で他の面に比べて利点がありません。 –

+0

シグナルハンドラでコードを実行する必要はなく、 'timer_create()'はスレッドコンテキストでコードを実行できます。あるいは、 'sigwait()'を実行することもできます。いずれにしても、インターバルタイマーを使用すると、コードがウェイトの間に実行されるまでにウェイトタイムをシフトさせないようにすることができます。 – EOF

関連する問題