Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115936
  • 博文数量: 11
  • 博客积分: 565
  • 博客等级: 中士
  • 技术积分: 267
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-02 17:17
文章分类
文章存档

2014年(1)

2012年(2)

2011年(4)

2010年(4)

我的朋友

分类: LINUX

2010-07-21 22:00:42

    时钟的处理类似中断,也是登记一个时间处理函数,在预定的时间过后,系统会调用这个函数,在include/linux/timer.h中声明。


struct timer_list{
       struct timer_list *next;
       struct timer_list *prev;
       unsigned long expires;
       unsigned long data;
       void (*function) (unsigned long);
};

void add_timer(struct timer_list *timer);
void del_timer(struct timer_list *timer);
void init_timer(struct timer_list *timer);


使用时钟,先声明一个timer_list结构,调用init_timer对它进行初始化。

timer_list结构里的expires标明这个时钟的周期,单位采用jiffies的单位。jiffieslinux一个全局变量,代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒钟最小时间间隔的数目。这样jiffies的单位就是1/HZ。启动时,kernel将该变量初始为0,每次时钟中断处理程序timer_interrupt()将该变量加1。因为一秒钟内增加的时钟中断次数等于HZ,所以jiffies一秒内增加的值也是HZ。Intel平台jiffies的单位是1/100s,这就是系统所能分辨的最小时间间隔了。所以expires/HZ就是以秒为单位的这个时钟的周期。

function就是时间到了以后的回调函数,它的参数就是timer_list中的datadata这个参数在初始化时钟的时候赋值,一般赋给它设备的device结构指针。在预置时间到系统调用function,同时系统把这个timer_list从定时队列里清除。所以如果需要一直使用定时函数,要在function里再次调用add_timer()函数。


每一次时钟中断都会把全局变量jiffies加一。这就意味着,在任何时刻,jiffies代表从开机到现在所发生的嘀哒的数量。

如果一个函数需要测量时间间隔,它可以把当前的jiffies值保存到一个局部变量中,然后把这个值与后续时刻的jiffies相比较以求的它们之间的差值。通过这个差值(两个时刻间的嘀哒数量)就可以计算出从计时开始经过了多长时间。

下面的例子展示了一个函数,它需要执行一些任务,但是它占用cpu的时间不能超过一个嘀哒数。当do_something完成时,它把job_done置为一个非零值,然后函数就可以返回了。


unsigned long start_time = jiffies;
int job_done = 0;
do{
    do_something(&job_done);
    if(job_done)
        return;
}while(jiffies - start_time < 1);


阅读(2156) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~