我现在正在使用ubuntu 11.04并使用v2lin从vxWorks tolinux移植我的程序。我有clock_getres()的问题。
使用此代码:
struct timespec res;
clock_getres(CLOCK_REALTIME, &res);
我有 res.tv_nsec = 1 ,这在某种程度上是不正确的。
就像这个人显示:http://forum.kernelnewbies.org/read.php?6,377,423,内核2.4和2.6之间存在差异。
那么内核2.6中时钟分辨率的正确值应该是什么
由于
答案 0 :(得分:1)
根据内核源代码中的“include / linux / hrtimer.h”文件,clock_getres()
将始终为高分辨率计时器返回1ns(1纳秒)(如果系统中有这样的计时器)。此值是硬编码的,这意味着:“计时器的值将四舍五入到它”
http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/hrtimer.h
269 /*
270 * The resolution of the clocks. The resolution value is returned in
271 * the clock_getres() system call to give application programmers an
272 * idea of the (in)accuracy of timers. Timer values are rounded up to
273 * this resolution values.
274 */
275 # define HIGH_RES_NSEC 1
276 # define KTIME_HIGH_RES (ktime_t) { .tv64 = HIGH_RES_NSEC }
277 # define MONOTONIC_RES_NSEC HIGH_RES_NSEC
278 # define KTIME_MONOTONIC_RES KTIME_HIGH_RES
对于低分辨率定时器(如果没有hrtimer硬件,对于MONOTONIC和REALTIME时钟),linux将返回1 / HZ(典型的HZ从100到1000;因此值将是1到10 ms):< / p>
http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/ktime.h#L321
321 #define LOW_RES_NSEC TICK_NSEC
322 #define KTIME_LOW_RES (ktime_t){ .tv64 = LOW_RES_NSEC }
来自低分辨率计时器的值可以四舍五入到如此低的精度(实际上它们就像jiffles
,linux内核“滴答”)。
PS:据我所知,这篇文章http://forum.kernelnewbies.org/read.php?6,377,423比较了没有启用hrtimers(实现)的2.4 linux和2.6内核可用的hrtimers。所以所有的数值都是正确的。
答案 1 :(得分:0)
尝试从procfs获取它。
cat / proc / timer_list
答案 2 :(得分:0)
为什么你认为它不正确?
例如,在现代x86 CPU上,内核使用TSC提供高分辨率时钟 - 任何高于1Ghz的CPU都有一个比每纳秒刻度更快的TSC,所以纳秒分辨率非常普遍。 p>