我可以在Linux上获得最佳时序分辨率

时间:2012-09-28 16:07:36

标签: c++ resolution timing

我正在尝试测量并行端口上2个信号之间的时差,但首先我要知道我的测量系统有多准确和精确(AMD Athlon(tm)64 X2双核处理器5200+×2 )在SUSE 12.1 x64上。

所以经过一些阅读后我决定使用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调用之间的时间,time3和time4被声明但在本例中没有使用,因为我正在用它们进行测试。

此示例中的输出在978和1467 ns之间波动。这两个数字都是489的倍数,这让我觉得489 ns是我的真实分辨率。远离上面获得的1 ns。

我的问题:有什么方法可以获得更好的结果吗?我错过了什么吗?

我的项目确实需要至少10ns的分辨率。来吧! GPS可以获得比PC更好的分辨率吗?

2 个答案:

答案 0 :(得分:1)

据我所知,Linux 在PC上运行通常无法在纳秒范围内为您提供计时器精度。这主要是由于内核中使用的任务/进程调度程序的类型。这与内核和硬件的结果一样多。

如果你需要纳秒分辨率的时间,我担心你运气不好。但是,您应该能够获得微秒级分辨率,这对于大多数情况应该足够好 - 包括您的并行端口应用程序。

如果您需要纳秒级的时间精确到纳秒级,您将需要一个专用的硬件解决方案;使用非常精确的振荡器(相比之下,大多数x86 CPU的基本时钟频率在乘法器之前的兆赫兹范围内)

最后,如果您希望用计算机替换示波器的功能,那么除了相对较低频率的信号之外,它不会起作用。投资范围你会好得多 - 甚至a simple, portable, hand-held that plugs into your computer用于显示数据。

答案 1 :(得分:1)

AMD Athlon 64 X2上的

RDTSCP将根据您的时钟为您提供time stamp counter分辨率。但是,精度与分辨率不同,您需要锁定线程关联并禁用中断(请参阅IRQ路由)。

这需要使用MSVC 2008 instrinsics下载到汇编程序或Windows开发人员。

使用RHEL5的RedHat引入了用高分辨率gettimeofday调用取代RDTSCP的用户空间填充程序:

另外,检查你的硬件AMD 5200有一个2.6Ghz时钟,间隔为0.4ns,gettimeofday RDTSCP的成本是221个周期,最多等于88ns。