Linux设备驱动---获知当前时间(高于jiffies精度)
来源:互联网 发布:mac看视频卡死如何退出 编辑:程序博客网 时间:2024/05/17 07:06
内核一般通过jiffies值来获取当前时间。尽管该数值表示的是自上次系统启动到当前的时间间隔,但因为驱动程序的生命期只限于系统的运行期 (uptime),所以也是可行的。驱动程序利用jiffies的当前值来计算不同事件间的时间间隔。硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率,即节拍率(tick rate),每一个周期称作一个tick(节拍)。Linux内核从2.5版内核开始把频率从100调高到1000(当然带来了很多优点,
也有一些缺点)。jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数。譬如,如果计算系统运行了多长时间,可以用 jiffies/tick rate 来计算。
jiffies定义在文件<linux/jiffies.h>
如果您需要更精确的时间来测量或者记录某些事情的话,内核中有个xtime全局变量,类型是struct timespec {time_t tv_sec; long tv_nsec;}按照这个数据结构,它是ns级的。
而且还有一个current_kernel_time函数,通过它就可以获取xtime的值。但是xtime是在时钟中断里更新的,而一个tick往往是 10ms或者100ms,它只能保证在时钟中断ISR调用时刻,它返回的值是精确到ns级,并不能保证任何一个调用这个函数的时刻都能这样,原因是xtime的更新速度比它差几个数量级。
如果需要精确到微妙级别,可以使用do_gettimeofday函数。该函数并不返回今天是本周的星期几或类似的信息;它是用微秒值来填充一个指向struct timeval的指针变量。相应的原型如下:
#include <linux/time.h>
void do_gettimeofday(struct timeval *tv);
源码中声明的do_gettimeofday在Alpha和Sparc之外的体系结构上有“接近微秒级的分辨率” ,在Alpha和Sparc上和jiffies值的分辨率一样。Sparc的移植版本在2.1.34版的内核中升级了,可以支持更细粒度的时间度量。
void do_gettimeofday(struct timeval *tv)
{
unsigned long flags;
unsigned long seq;
unsigned long nsec, sec, lost;
do {
seq = read_seqbegin_irqsave(&xtime_lock, flags);
usec = system_timer->offset();
lost = jiffies - wall_jiffies;
if (lost)
usec += lost * USECS_PER_JIFFY;
sec = xtime.tv_sec;
nsec += xtime.tv_nsec;
} while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
/* usec may have gone up a lot: be safe */
while (nsec >= 1000000000) {
nsec -= 1000000000;
sec++;
}
tv->tv_sec = sec;
tv->tv_usec = usec;
}
从中可以发现,我们只要稍微的修改一下代码就可以达到纳秒的精确度了
void do_gettimeofday_nsec(struct timespec *tv)
{
unsigned long flags;
unsigned long seq;
unsigned long usec, sec, lost;
do {
seq = read_seqbegin_irqsave(&xtime_lock, flags);
usec = system_timer->offset();
lost = jiffies - wall_jiffies;
if (lost)
usec += lost * USECS_PER_JIFFY;
sec = xtime.tv_sec;
usec += xtime.tv_nsec / 1000;
} while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
/* usec may have gone up a lot: be safe */
while (usec >= 1000000) {
usec -= 1000000;
sec++;
}
tv->tv_sec = sec;
tv->tv_usec = usec;
}
注意这里使用了不同的时间结构。
转自:http://www.360doc.com/content/09/0415/21/26398_3145249.shtml
- Linux设备驱动---获知当前时间(高于jiffies精度)
- Linux设备驱动---jiffies与jiffies_64
- 在linux内核中获得比jiffies精度更高的时间值
- 在linux内核中获得比jiffies精度更高的时间值
- linux时间管理 之 jiffies
- 【Linux设备驱动程序(第三版)】----获取当前时间
- 加法器(基于Swing,计算精度高于Excel)
- Linux驱动学习11(内核中jiffies的回绕问题)
- linux jiffies
- jiffies溢出与时间先后比较 + linux的HZ, Tick, Jiffies
- jiffies溢出与时间先后比较 + linux的HZ, Tick, Jiffies
- Linux设备驱动(二)字符设备
- Linux设备驱动(三)块设备
- Linux设备驱动(2)字符设备
- Linux设备驱动--字符设备(一)
- 【Linux开发】linux设备驱动归纳总结(七):1.时间管理与内核延时
- Linux设备驱动(一)
- LINUX 设备驱动 (一)
- Java Optimize
- 模板写的单链表(list)
- 设计模式学习之Observer模式
- live555学习笔记4-计划任务(TaskScheduler)深入探讨
- (转)不同linux内核映像的区别
- Linux设备驱动---获知当前时间(高于jiffies精度)
- 字符编码GBK,UTF-8
- 内存
- 每日一案:出资入股协议中欺诈行为的认定与处理---摘自“成都法院网”
- Web 不安全代码只会在使用 /unsafe 编译的情况下出现
- 一则柯西数列证明的实例
- 黑马程序员--java技术--网络编程
- Objective-C 的“多继承”
- B类 继承自A类。 A类有一虚方法,无任何实现。 B类重写.........输出结果