私はしばらくタイマーで作業していましたが、私の状況に有望な解決策を得ることができませんでした。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を使っていますので、新しいカーネルや他の方法では私のものよりも正確である可能性が高いアプローチについて知っていますか?
timer_create()でタイマーを設定します。 – EOF
@EOF:ジッタが少ないとは限りません。 OP:Linuxや他の完全に成長したOSで、ナノ秒の精度を持つことはできません。 RTOSの場合でも、それよりもはるかに大きい下限があります(RTは「ジッタなし」を保証しません)。それはXY問題のように叫ぶ。あなたの**実際の**と具体的な問題は何ですか? – Olaf
@Olaf:確かに、あなたは統計的*ジッタを得るでしょう。しかし、OPの現在のアプローチと違って、段階的な変化はほとんどありません。 – EOF