我正在尝试测量并行端口上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更好的分辨率吗?
答案 0 :(得分:1)
据我所知,Linux 在PC上运行通常无法在纳秒范围内为您提供计时器精度。这主要是由于内核中使用的任务/进程调度程序的类型。这与内核和硬件的结果一样多。
如果你需要纳秒分辨率的时间,我担心你运气不好。但是,您应该能够获得微秒级分辨率,这对于大多数情况应该足够好 - 包括您的并行端口应用程序。
如果您需要纳秒级的时间精确到纳秒级,您将需要一个专用的硬件解决方案;使用非常精确的振荡器(相比之下,大多数x86 CPU的基本时钟频率在乘法器之前的兆赫兹范围内)
最后,如果您希望用计算机替换示波器的功能,那么除了相对较低频率的信号之外,它不会起作用。投资范围你会好得多 - 甚至a simple, portable, hand-held that plugs into your computer用于显示数据。
答案 1 :(得分:1)
RDTSCP
将根据您的时钟为您提供time stamp counter分辨率。但是,精度与分辨率不同,您需要锁定线程关联并禁用中断(请参阅IRQ路由)。
这需要使用MSVC 2008 instrinsics下载到汇编程序或Windows开发人员。
使用RHEL5的RedHat引入了用高分辨率gettimeofday
调用取代RDTSCP
的用户空间填充程序:
另外,检查你的硬件AMD 5200有一个2.6Ghz时钟,间隔为0.4ns,gettimeofday
RDTSCP
的成本是221个周期,最多等于88ns。