转换jiffies到毫秒

如何在Linux中手动将jiffies转换为毫秒,反之亦然? 我知道内核2.6有一个这样的function,但我正在2.4(家庭作业),虽然我看了代码,它使用了很多macros常量,我不知道它们是否定义在2.4中。

Solutions Collecting From Web of "转换jiffies到毫秒"

正如前面的答案所说, jiffies递增的速率是固定的。

为接受jiffies的函数指定时间的标准方法是使用常量HZ

这是赫兹的缩写,或每秒钟的滴答数。 在计时器滴答设置为1ms的系统上,HZ = 1000。 一些发行版或体系结构可能会使用另一个数字(100以前是常见的)。

为函数指定jiffies计数的标准方法是使用HZ ,如下所示:

 schedule_timeout(HZ / 10); /* Timeout after 1/10 second */ 

在最简单的情况下,这工作正常。

 2*HZ /* 2 seconds in jiffies */ HZ /* 1 second in jiffies */ foo * HZ /* foo seconds in jiffies */ HZ/10 /* 100 milliseconds in jiffies */ HZ/100 /* 10 milliseconds in jiffies */ bar*HZ/1000 /* bar milliseconds in jiffies */ 

最后两个有一个问题,但是,如在一个10毫秒计时器滴答的系统, HZ/100是1,精度开始受到影响。 您可能会延迟0.0001至1.999个计时器滴答(0-2 ms,基本上)。 如果你试图在10ms的tick系统上使用HZ/200 ,那么整数部分给你0 jiffies!

因此,经验法则是,使用HZ来处理微小的值(接近1 jiffie)。

换一种方式,你可以使用:

 jiffies / HZ /* jiffies to seconds */ jiffies * 1000 / HZ /* jiffies to milliseconds */ 

你不应该期望比毫秒精度更好的东西。

Jiffies在Linux 2.4中是硬编码的。 检查在体系结构特定的param.h定义的HZ定义。 它通常为100赫兹,每10秒一个(1秒/ 100个滴答* 1000毫秒/秒)。

这适用于i386,HZ在include/asm-i386/param.h

include/linux/time.h有函数叫timespec_to_jiffiesjiffies_to_timespec ,你可以在struct timespecjiffies之间来回转换:

  #define MAX_JIFFY_OFFSET ((~0UL >> 1)-1) static __inline__ unsigned long timespec_to_jiffies(struct timespec *value) { unsigned long sec = value->tv_sec; long nsec = value->tv_nsec; if (sec >= (MAX_JIFFY_OFFSET / HZ)) return MAX_JIFFY_OFFSET; nsec += 1000000000L / HZ - 1; nsec /= 1000000000L / HZ; return HZ * sec + nsec; } static __inline__ void jiffies_to_timespec(unsigned long jiffies, struct timespec *value) { value->tv_nsec = (jiffies % HZ) * (1000000000L / HZ); value->tv_sec = jiffies / HZ; } 

注意:我在版本2.4.22中检查了这个信息。

我在kernelnewbies上找到了这个示例代码。 确保你链接到-lrt

 #include <unistd.h> #include <time.h> #include <stdio.h> int main() { struct timespec res; double resolution; printf("UserHZ %ld\n", sysconf(_SC_CLK_TCK)); clock_getres(CLOCK_REALTIME, &res); resolution = res.tv_sec + (((double)res.tv_nsec)/1.0e9); printf("SystemHZ %ld\n", (unsigned long)(1/resolution + 0.5)); return 0; } 

#3875801的答复也可能是相关的