分类: LINUX
2010-07-21 22:00:42
时钟的处理类似中断,也是登记一个时间处理函数,在预定的时间过后,系统会调用这个函数,在include/linux/timer.h中声明。
|
使用时钟,先声明一个timer_list结构,调用init_timer对它进行初始化。
timer_list结构里的expires标明这个时钟的周期,单位采用jiffies的单位。jiffies是linux一个全局变量,代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒钟最小时间间隔的数目。这样jiffies的单位就是1/HZ。启动时,kernel将该变量初始为0,每次时钟中断处理程序timer_interrupt()将该变量加1。因为一秒钟内增加的时钟中断次数等于HZ,所以jiffies一秒内增加的值也是HZ。Intel平台jiffies的单位是1/100s,这就是系统所能分辨的最小时间间隔了。所以expires/HZ就是以秒为单位的这个时钟的周期。
function就是时间到了以后的回调函数,它的参数就是timer_list中的data。data这个参数在初始化时钟的时候赋值,一般赋给它设备的device结构指针。在预置时间到系统调用function,同时系统把这个timer_list从定时队列里清除。所以如果需要一直使用定时函数,要在function里再次调用add_timer()函数。
每一次时钟中断都会把全局变量jiffies加一。这就意味着,在任何时刻,jiffies代表从开机到现在所发生的嘀哒的数量。
如果一个函数需要测量时间间隔,它可以把当前的jiffies值保存到一个局部变量中,然后把这个值与后续时刻的jiffies相比较以求的它们之间的差值。通过这个差值(两个时刻间的嘀哒数量)就可以计算出从计时开始经过了多长时间。
下面的例子展示了一个函数,它需要执行一些任务,但是它占用cpu的时间不能超过一个嘀哒数。当do_something完成时,它把job_done置为一个非零值,然后函数就可以返回了。
|