2011-07-04 34 views
3

我现在在使用ubuntu 11.04并使用v2lin从vxWorks tolinux移植我的程序。 clock_getres()有问题。clock_getres和kernel 2.6

与此代码:

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

是什么让你觉得这是不正确的? – nos

回答

0

尝试从procfs的得到它。

cat/proc/timer_list

0

为什么你认为这是不正确的?例如,在现代的x86 CPU上,内核使用TSC来提供高分辨率时钟 - 任何运行速度高于1Ghz的CPU都具有比每纳秒快于tick的TSC,因此纳秒分辨率非常普遍。

1

根据来自内核源文件的“include/linux/hrtimer.h”文件,clock_getres()将始终为高分辨率定时器(如果系统中有这样的定时器)返回1ns(1纳秒)。该值是硬编码,这意味着:(如果没有hrtimer硬件和单调和实时时钟)“定时器的值将被舍入到它”

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 

对于低分辨率计时器,Linux的将返回1/HZ(典型HZ是从100至1000,所以值将是从1到10毫秒):

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内核“ticks”)。

PS:This post http://forum.kernelnewbies.org/read.php?6,377,423据我所知,比较2.4 linux没有启用hrtimers(已实现)的2.6内核与可用的hrtimers。所以所有的值都是正确的。