1HZ和jiffies 时钟中断由系统的定时硬件以周期性的时间间隔产生,间隔频率为HZ,这是一个宏定义,在X86上默认为1000。 每当时钟中断发生时,全局变量jiffies(unsignedlong)就加1,则jiffies记录了自linux启动后时钟中断发生的次数。 例子:用jiffies实现忙等待(等待jit_delay秒) unsigned long j=jiffies+jit_delay*HZ;
while(jiffiles<j)
{
}
2内核定时器
定时器用于控制某个函数在未来的某个特定时间执行(只执行一次)。内核定时器被组织成双向链表,用structtimer_list描述: struct timer_list{ struct list_head entry;//内核使用
unsigned long expires;//超时的jiffies值
void(*function)(unsigned long);//超时处理函数
unsigned long data;//函数参数 … struct tvec_t_base_s *base;
};
操作函数: void init_timer(struct timer_list*timer);//初始化
void add_timer(structtimer_list*timer);//启动
Int del_timer(structtimer_list*timer);//删除
3例子 #include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h> #include<linux/timer.h>/*timer*/
#include<asm/uaccess.h>/*jiffies*/
MODULE_LICENSE("GPL");
MODULE_AUTHOR("GreatSea"); MODULE_DESCRIPTION("TimerModule");
MODULE_ALIAS("timermodule");
struct timer_list timer;
void timer_function(int para)
{ printk("<0>TimerExpiredandparais%d!!\n",para);
}
inttimer_init()
{ init_timer(&timer);
timer.data=5; timer.expires=jiffies+(20*HZ);
timer.function=timer_function;
add_timer(&timer);return0;
}
voidtimer_exit()
{ del_timer(&timer);
}
module_init(timer_init);
module_exit(timer_exit);