度量时间差

时钟中断由定时硬件以周期性的间隔产生,这个间隔由内核根据HZ值设定,HZ是一个与体系结构有关的常数,定义在<linux/param.h>或者该文件包含的某个子平台相关的文件中。

可以通过修改HZ值来改变系统时钟中断发生的频率,但必须重新编译内核以及所有模块。

每次当时钟中断发生时,内核内部计数器的值就增加1,这个计数器的值在系统引导时被初始化为0。这个计数器是64位的,称为jiffies_64,但驱动程序开发者通常访问的是jiffies变量,它是unsigned
long型变量,要么和jiffies_64相同,要和是其低32位。通常首选jiffies,比较快。

使用jiffies计数器

该计数器和读取计数器的工具函数包含在<linux/jiffies.h>中,但通常只需包含<linux/sched.h>后者会自动放入jiffies.h。jiffies和jiffies_64是只读变量。

jiffies快照比较:

#include<linux/jiffies.h>

int
time_after(unsigned long a, unsigned long b); //a比b靠后返回真

int
time_before(unsigned long a, unsigned long b);

int
time_after_eq(unsigned long a, unsgined long b);

int
time_before_eq(unsigned long a, unsigned long b);

这些宏会将计数器值转换为signed
long,相减,然后比较结果。如果需要以安全的方式计算两个jiffies实例的差,也可以使用相同的技巧:

diff=(long)t2-(long)t1;

转换为毫秒值:

msec=diff*1000/HZ;

与用户空间timeval和timespec的转换:

#include<linux/time.h>

unsigned
long timespec_to_jiffies(struct timespec *value);

void
jiffies_to timespec(unsigned long jiffies, struct timespec *value);

unsigned
long timeval_to jiffies(struct timeval *value);

void
jiffies_to_timeval(unsigned long jiffies, struct timeval *value);

在32处理器上访问64位不是原子的,直接读取jiffies_64是很靠不住的。使用:

#include<linux/jiffies.h>

u64
get_jiffies_64(void);

实际的时钟频率对用户空间来讲几乎是完全不可见的。当用户空间程序访问包含param.h,HZ宏始终被拓展为100。要想获得确切值,可以通过/proc/interrupts获得计数值,除以/proc/uptime报告的系统运行时间。

时间: 2024-10-24 02:41:51

度量时间差的相关文章

Linux设备驱动程序 之 度量时间差

概述 内核通过定时器中断来跟踪事件流: 时钟中断由系统定时硬件以及周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个细节结构有关的常数:作为一般性规则,即使知道对应平台上的确切HZ值,也不应该在编程时依赖该HZ值: 如果想改变系统时钟中断发生的频率,可以通过修改HZ值来进行,但是,如果修改了头文件中的HZ值,则必须使用新的值重新编译内核以及所有模块: 每当时钟中断发生时,内核内部计数器的值增加一:这个计数器的值在系统引导值初始化为0,因此,它的值就是上次操作系统引导以来的时钟滴答数:这

《Linux Device Drivers》 第七章 时间、延时及延缓操作——note

度量时间差 内核通过定时器中断来跟踪时间流 时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据HZ的值设定,在常见的x86 PC平台上,默认定义为1000 <linux/param.h> <linux/timex.h> jiffies_64 unsigned long jiffies 使用jiffies计数器 <linux/jiffies.h> int time_after(unsigned long a, unsigned long b); int time

手把手教你写Linux设备驱动---定时器(一)(基于友善之臂4412开发板)

这个专题我们来说下Linux中的定时器. 在Linux内核中,有这样的一个定时器,叫做内核定时器,内核定时器用于控制某个函数,也就是定时器将要处理的函数在未来的某个特定的时间内执行.内核定时器注册的处理函数只执行一次,即不是循环执行的. 如果对延迟的精度要求不高的话,最简单的实现方法如下---忙等待: Unsigned long j = jiffies + jit_delay * HZ; While(jiffies < j) { -- } 下面来说下具体的参数代表的含义: jiffies:全局变

时间、延迟(Linux设备驱动程序)

时间延迟 如何度量时间差,比较时间 如何获得当前时间 如何将操作延迟指定的一段时间 如何调度异步函数到指定的时间之后执行 度量时间差 内核通过定时器中断来跟踪时间流. 时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个与体系结构有关的常数. 每当时钟中断发生时,内核内部计数器的值就增加一. 这个计数器的值在系统引导时被初始化为0,它的值就是自上次操作系统引导以来的时钟滴答数. 驱动程序开发者通常访问的是jiffies变量. 比较缓存值和当前值时,应该使用下面的宏

LDD读书笔记_时间,延迟和延缓操作

Agenda ?如何获得当前时间 ?如何度量时间差, 如何比较时间 ?如何将操作延迟指定的一段时间 ?如何调度异步函数到指定的时间之后执行 ?如何获得当前时间 ?HZ: 宏定义, 每秒的时间中断次数 ?Jiffies变量: 系统引导时初始化为0, 每发生一次时间中断就加1 –#include <linux/jiffies.h> –unsigned long j, stamp_1, stamp_half, stamp_n; –j = jiffies; /* current value */ –s

LINUX设备驱动程序(第3版)pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介编辑<LINUX设备驱动程序(第3版)>已针对Linux内核的2610版本彻底更新过了.内核的这个版本针对常见任务完成了合理化设计及相应的简化,如即插即用.利用sysfs文件系统和用户空间交互,以及标准总线上的多设备管理等等.要阅读并理解本书,您不必首先成为内核黑客:只要您理解C语言并具有Unix系统调用的一些背景知识即可.您将学到如何为字符设备.块设备和网络接口编写驱动程序.为此,<LINUX设备驱动程序(第3版)>提供了完整的示例

mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法

mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差.其结果的单位由interval 参数给出.interval 的法定值同TIMESTAMPADD()函数说明中所列出的相同. mysql> SELECT TIMESTAMPDIFF(MONTH,'200

Qt自定义sleep延时函数(巧妙的使用时间差,但这样似乎CPU满格,而不是沉睡)

Qt不像VC++的win32/MFC编程那样,提供了现成的sleep函数可供调用.Qt把sleep函数封装在QThread类中.子线程可以调用sleep函数.但是如果用户想在主线程实现延时功能,该怎么办呢?方法是自定义sleep延时函数.通过QDateTime来实现时间差. #include <QDateTime> void MainWindow::sleep(int msec)//自定义Qt延时函数,单位毫秒 { QDateTime last = QDateTime::currentDate

C语言实现时间差、星期、天数算日期(转)

原文地址:http://blog.csdn.net/coder_xia/article/details/6566708 最近因为一个项目需要,默认一个时间值,即当天的前一天日期,顺手就将其他的几个功能一并实现了,主要为 1.两个日期之间的时间差 2.某个日期之后,绝对值差值之后的某个日期 3.某年日期,算出星期几 下面见源码: #ifndef CALCULATE_H #define CALCULATE_H typedef struct { int year; int month; int day