内核定时器
依赖硬件定时器中断,内核在硬件中断发生后唤起TIMER_SOFTIRQ软中断,检测各软件定时器是否到期,到期就将定时器处理函数在底半部执行。
Kernel中可以利用一组函数对与定时器调用。
timer_list
用一个timer_list对应一个定时器xxx_timer。
(*function)成员对应timer的handler,long data对应传入参数。(指针可以强转为long在传入,比如传入dev结构体)
unsigned long expires是定时器到期时间,jiffies时间。
需要进行对结构体的初始化,定时器的添加等操作。
注意expires的初始化:
dev->xxx_timer.expires = jiffies + delay;
在handler函数内,如果需要不断触发,需要在最后再添加:
dev->xxx_timer.expires = jiffies + delay;
add_timer(&dev->xxx_timer);
jiffies
jiffies类型为无符号长整型(unsigned long),定义于文件linux\Jiffies.h,每有一次timer IRQ就记录一次。
HZ是内核的变量,驱动用的是内核下的HZ注意不要随便修改。2.6之后为了用户空间方便有US