1

パラレル ポートで 2 つの信号間の時間差を測定しようとしていますが、最初に、SUSE の測定システム (AMD Athlon(tm) 64 X2 デュアル コア プロセッサ 5200+ × 2) がどれほど正確で正確かを知りました。 12.1×64。

したがって、いくつか読んだ後、clock_gettime() を使用することにしました。まず、このコードを使用して clock_getres() 値を取得します。

/*
 * This program prints out the clock resolution.
 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main( void )
  {
    struct timespec res;

    if ( clock_getres( CLOCK_REALTIME, &res) == -1 ) {
      perror( "clock get resolution" );
      return EXIT_FAILURE;
    }
    printf( "Resolution is %ld nano seconds.\n",
          res.tv_nsec);
    return EXIT_SUCCESS;
  }

出力は 1 ナノ秒でした。そして、私はとても幸せでした!!

しかし、この他のコードでその事実を確認しようとしたとき、ここに私の問題があります:

#include <iostream>
#include <time.h>
using namespace std;

timespec diff(timespec start, timespec end);

int main()
{
    timespec time1, time2, time3,time4;
    int temp;
    time3.tv_sec=0;
    time4.tv_nsec=000000001L;
    clock_gettime(CLOCK_REALTIME, &time1);
        NULL;
    clock_gettime(CLOCK_REALTIME, &time2);
    cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
    return 0;
}

timespec diff(timespec start, timespec end)
{
    timespec temp;
    if ((end.tv_nsec-start.tv_nsec)<0) {
        temp.tv_sec = end.tv_sec-start.tv_sec-1;
        temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
    } else {
        temp.tv_sec = end.tv_sec-start.tv_sec;
        temp.tv_nsec = end.tv_nsec-start.tv_nsec;
    }
    return temp;
}

これは、clock_gettime の 2 つの呼び出し間の時間を計算します。time3 と time4 は宣言されていますが、この例ではテストを行っていたため使用されていません。

この例の出力は、978 ~ 1467 ns の間で変動しています。どちらの数値も 489 の倍数です。これにより、489 ns が私の実際の解像度であると思います。上記で得られた 1 ns からはかけ離れています。

私の質問: より良い結果を得る方法はありますか? 私は何かを逃していますか?

私のプロジェクトには、少なくとも 10ns の解像度が本当に必要です。来て!GPS は PC よりも優れた解像度を得ることができますか??

4

3 に答える 3

3

私の知る限り、PC上で実行されているLinuxは、通常、ナノ秒の範囲のタイマー精度を提供することはできません。これは主に、カーネルで使用されるタスク/プロセススケジューラのタイプによるものです。これは、ハードウェアの結果であると同時にカーネルの結果でもあります。

ナノ秒の解像度でタイミングが必要な場合は、運が悪いと思います。ただし、マイクロ秒の解像度を取得できるはずです。これは、パラレルポートアプリケーションを含むほとんどのシナリオで十分なはずです。

ナノ秒の範囲のタイミングをナノ秒まで正確にする必要がある場合は、専用のハードウェアソリューションが必要になる可能性があります。非常に正確な発振器を使用(比較のために、ほとんどのx86 CPUのベースクロック周波数は、乗算器の前のメガヘルツの範囲にあります)

最後に、オシロスコープの機能を、比較的低周波数の信号を超えて機能しないコンピュータに置き換えることを検討している場合。データを表示するためにコンピューターに接続する、シンプルでポータブルなハンドヘルドでさえ、スコープに投資するほうがはるかに良いでしょう。

于 2012-09-28T16:15:13.643 に答える
2

RDTSCPAMD Athlon 64 X2 では、クロックに応じた解像度のタイムスタンプ カウンターが表示されます。ただし、精度は解像度とは異なります。スレッド アフィニティをロックし、割り込みを無効にする必要があります (IRQ ルーティングを参照)。

これには、アセンブラーまたはMSVC 2008組み込み関数を使用する Windows 開発者向けのドロップダウンが伴います。

RHEL5 を使用する RedHat ではgettimeofday、高解像度のRDTSCP呼び出しに置き換わるユーザー空間シムが導入されました。

また、ハードウェアを確認してください。AMD 5200 のクロックは 2.6Ghz で、間隔は 0.4ns で、コストgettimeofdayRDTSCP221 サイクルで、せいぜい 88ns です。

于 2012-09-28T16:38:08.060 に答える