转自:http://blog.chinaunix.net/uid-23228758-id-154820.html

定时器与时间管理:

次,为一秒。一般的情况下编程者不要改变这个值,因为内核编很多代码都是有时间要求的,而且内核编写都在很多地方都做了相应的优化与折衷处理,改变HZ的值会对系统的性能有很大的影响。

2、jiffies:这个值是用来记录系统自系统启动以来产生的节拍的总数,启动时,内核将这个变量初始化为0;在每次的时钟中断处理程序都会增加该变量的值,jiffies一秒内增加的值就是HZ,系统运行时间以秒为单位计算,则为系统运行了jiffies/HZ秒。

在如下定义(2.6内核):

extern u64 __jiffy_data jiffies_64;
extern unsigned long volatile __jiffy_data jiffies;

在2.6的内核中它的变量类型从无符号长整型变为了u64,也就是说,即使是32位的机器,也使用无符号的64位整型表示jiffies。大多数的代码只涉及jiffies的低32位,访问jiffies的代码中会读到jiffies_64的低32位,可以通过get_ jiffies_64()函数读取整个64位。在64位的体系结构中jiffies_64和jiffies指的同一个变量,代码可以既可以通过jiffies也可以通过get_ jiffies_64()读取。

3、为了避免jiffies值的回绕(溢出),内核中提供了几个API函数来比较节拍计数。定义在中。

/* time_is_before_jiffies(a) return true if a is before jiffies */
#define time_is_before_jiffies(a) time_after(jiffies, a)
/* time_is_after_jiffies(a) return true if a is after jiffies */
#define time_is_after_jiffies(a) time_before(jiffies, a) 
/* time_is_before_eq_jiffies(a) return true if a is before or equal to jiffies*/
#define time_is_before_eq_jiffies(a) time_after_eq(jiffies, a)
/* time_is_after_eq_jiffies(a) return true if a is after or equal to jiffies*/
#define time_is_after_eq_jiffies(a) time_before_eq(jiffies, a)

例:

可以利用jiffies设置超时等,譬如:

unsigned long timeout = jiffies + HZ * 2; // 2秒钟后超时
       if(time_before(jiffies, timeout){
       // 还没有超时
    }
    else{
       // 已经超时
    }

4、时间类型

Linux下常用的时间类型有4个:time_t,struct timeval,struct timespec,struct tm。一般用于实际时间(墙上时间),定义在文件中。

(1)time_t是一个长整型,一般用来表示用1970年以来的秒数,格林威治时间。

(2)Struct timeval有两个成员,一个是秒,一个是微妙。

struct timeval{
            long tv_sec; /**//* seconds */
            long tv_usec; /**//* microseconds */
 };

(3)struct timespec有两个成员,一个是秒,一个是纳秒。

struct timespec{

         time_t tv_sec; /**//* seconds */格林威治时间
         long tv_nsec; /**//* nanoseconds */
 };

(4)struct tm是直观意义上的时间表示方法:

struct tm {
        int tm_sec; /**//* seconds */
        int tm_min; /**//* minutes */
        int tm_hour; /**//* hours */
        int tm_mday; /**//* day of the month */
        int tm_mon; /**//* month */
        int tm_year; /**//* year */
        int tm_yday; /**//* day in the year */
        int tm_wday; /**//* day of the week */
        int tm_isdst; /**//* daylight saving time */
 };

:一般使用int gettimeofday(struct timeval *tv, struct timezone *tz);得到墙上时间,墙上时间一般会在用户空间里使用,而在内核空间里,大多数情况下只要获取相对时间就OK了,也就是说用jiffies搞定。

5、内核定时器

内核定时器可以理解为一个软件定时器,它可以被动态的创建、更改和销毁等,而且运行次数没有限制。

定时器同结构time_list表示,此结构体定义在中。

struct timer_list {
       struct list_head entry; //包含定时器的链表
       unsigned long expires; //以jiffies为单位的定时值
       void (*function)(unsigned long); //定时时间到的处理函数
       unsigned long data; //传给片处理函数的参数,可以用在共用一个处理函数的情况。
       struct tvec_base *base; //内部值,用户呼略是安全的
#ifdef CONFIG_TIMER_STATS
       void *start_site;
       char start_comm[16];
       int start_pid;
#endif
#ifdef CONFIG_LOCKDEP
       struct lockdep_map lockdep_map;
#endif
};

在使用定时器时,没有必要去深入了解这个数据结构体的成员。可以使用在中的API来操作。

增加定时器

void add_timer(struct timer_list * timer);
删除定时器

int del_timer(struct timer_list * timer);
修改定时器的expire

int mod_timer(struct timer_list *timer, unsigned long expires);
使用定时器的一般流程为:
(1)定义timer、编写function;
(2)为timer的expires、data、function赋值;
(3)调用add_timer将timer加入列表;
(4)在定时器到期时,function被执行;
(5)在程序中涉及timer控制的地方适当地调用del_timer、mod_timer删除timer或修改timer的expires。
补充:一般应该使用del_timer_sync()来代替del_timer(),在俺的板子上就同没有必要了,因为俺的板子是单处理器的,在SMP中一定要代替使用。

6、短延迟

前面所讲到的时间都是很长的了啦,在内核中提供了二个更短延迟的函数来供开发人员使用

udelay(unsigned long usecs);   //微秒
mdelay(unsigned long msecs);  //毫秒
前者用软件循环指定的微妙数,后者调用前者达到延迟毫秒级。udelay 函数只能用于获取较短的时间延迟,因为loops_per_second值的精度只有8位,所以,当计算更长的延迟时会积累出相当大的误差。尽管最大能允 许的延迟将近1秒(因为更长的延迟就要溢出),推荐的 udelay 函数的参数的最大值是取1000微秒(1毫秒)。延迟大于 11 毫秒时可以使用函数mdelay。
:要特别注意的是 udelay 是个忙等待函数(所以 mdelay 也是),在延迟的时间段内无法运行其他的任务,因此要十分小心,尤其是 mdelay,除非别无他法,要尽量避免使用。

Linux之定时器与时间管理 【转】的更多相关文章

  1. Linux内核——定时器和时间管理

    定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...

  2. 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/10/3070373.html 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务 ...

  3. Linux内核设计与实现 总结笔记(第十一章)定时器和时间管理

    时间管理在内核中占用非常重要的地位,内核中有大量的函数都需要基于时间驱动的,内核对相对时间和绝对时间都非常需要. 一.内核中的时间概念 内核必须在硬件的帮助下才能计算和管理时间,系统定时器以某种频率自 ...

  4. (笔记)Linux内核学习(八)之定时器和时间管理

    一 内核中的时间观念 内核在硬件的帮助下计算和管理时间.硬件为内核提供一个系统定时器用以计算流逝的时间.系 统定时器以某种频率自行触发,产生时钟中断,进入内核时钟中断处理程序中进行处理. 墙上时间和系 ...

  5. Linux内核设计基础(三)之定时器和时间管理

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/BlueCloudMatrix/article/details/29294529 内核知道连续两次时钟 ...

  6. kernel笔记——定时器与时间管理

    内核中时钟主要完成以下作用: 记录系统运行时间 完成时间相关的统计功能,如cpu占用率等 定时功能,设定某个进程一段时间后完成某项任务 为实现以上功能,硬件以及内核提供了不同类型的时钟. RTC 实时 ...

  7. linux 时间管理——概念、注意点(一)【转】

    转自:http://www.cnblogs.com/openix/p/3324243.html 参考:1.http://bbs.eyeler.com/thread-69-1-1.html        ...

  8. Linux内核入门到放弃-时间管理-《深入Linux内核架构》笔记

    低分辨率定时器的实现 定时器激活与进程统计 IA-32将timer_interrupt注册为中断处理程序,而AMD64使用的是timer_event_interrupt.这两个函数都通过调用所谓的全局 ...

  9. Linux时间管理涉及数据结构和传统低分辨率时钟的实现

    上篇文章大致描述了Linux时间管理的基本情况,看了一些大牛们的博客感觉自己写的内容很匮乏,但是没办法,只能通过这种方式提升自己……闲话不说,本节介绍下时间管理下重要的数据结构 设备相关数据结构 // ...

随机推荐

  1. Centos7安装Zabbix4.0步骤

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Centos7安装Zabbix4.0步骤 官方搭建zabbix4.0的环境要求: 1. 环境搭建L ...

  2. 【dp专题】NOIP真题-DP专题练习

    这里学习一下DP的正确姿势. 也为了ZJOI2019去水一下做一些准备 题解就随便写写啦. 后续还是会有专题练习和综合练习的. P1005 矩阵取数游戏 给出$n \times m$矩阵每次在每一行取 ...

  3. [2019/03/17#杭师大ACM]赛后总结(被吊锤记)

    前言 和扬子曰大佬和慕容宝宝大佬一组,我压力巨大,而且掌机,累死我了,敲了一个下午的代码,他们两个人因为比我巨就欺负我QwQ. 依旧被二中学军爆锤,我真的好菜,慕容宝宝或者是扬子曰大佬来掌机一定成绩比 ...

  4. 【转】C语言字符串与数字相互转换

    在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串.字符串是以“\0”作为结束符.C/C++提供了丰富的字符串处理函数,下面列出了几个最常用的函数. ● 字符串输出函数puts. ● ...

  5. Shell基础知识(二)

    对于一个shell脚本来说,第一行是 "#!/bin/bash",这条命令中的 "#!" 告诉系统该用哪一款解释器来对该脚本进行解释,后面的"/bin ...

  6. 洛谷 P4148 简单题 解题报告

    P4148 简单题 题意 维护单点加与矩形求和,强制在线 说明 \(n\le 500000,m\le 200000\),\(4000ms / 20MB\) kd-tree 复杂度我不懂 是一颗平衡树, ...

  7. python测试webservice接口

    1.下载库:https://pypi.python.org/pypi/suds-jurko 2.解压后,进入到解压目录,安装库:python3 setup.py install 3.测试获取手机归属地 ...

  8. detectMultiScale 读取冲突的一个解决方法

    背景:用的是opencv的HOGDescriptor检测行人,实例化为hog:使用默认的行人检测器: hog.setSVMDetector(cv::HOGDescriptor::getDefaultP ...

  9. poco

    源码安装: 1, ./configure --omit=Data/MySQL,Data/ODBC,Zip,Crypto,NetSSL_OpenSSL     --no-samples  --no-te ...

  10. 洛谷P1012 拼数 string

    又是大水题... 这一题过水,令人无法接受...... 但是如果我们不知道string的一个神奇的性质的话,就会很难受. 我一开始手写 < 号,但是发现如果 string a 的前一部分恰好是 ...