linux内核定时器
度量时间差:时钟每隔一段时间就会产生一次中断,这是由系统的定时硬件以周期性的时间间隔产生,这个间隔由内核根据HZ来确定。每当时钟中断发生时,全局变量jiffies(unsigned long)就加1,因此jiffies(当前的时间点)记录了自linux启动后时钟中断发生的次数,驱动程序常利用jiffies来计算不同事件间的时间间隔。
例如对延迟实现:
unsigned long j=jiffies+jit_delay*HZ
while (jiffies<j)
{
.............单位为s(秒)
}
--------------------------------------------------------------------------
定时器:
用于控制某个函数在未来的某个特定的时间执行,内核定时器注册的处理函数只执行一次。
内核定时器被组织成双向链表,并使用struct timer-list结构描述。
struct timer_list{
struct list_head entry;/*内核使用*/
unsigned long expires;/*超时的jiffies值*/
void(*function)(unsigned long);/*超时处理函数*/
unsigned long data;/*超时处理函数参数*/
struct tvec_base *base;/*内核使用*/
};
---------------------------------------------------------------------------------
定时器操作:
void init_timer(struct timer_list *timer);
初始化定时器队列结构。
void add_timer(struct timer_list *timer);
启动定时器
int del_timer(struct timer_list *timer);
在定时器超时前将它删除,当定时器超时后,系统会自动地将它删除。
-----------------------------------------------------------------------------------
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#incluee<linux/timer.h>
#include<asm/uaccess.h>
MODULE_LICENSE("GPL");
struct timer_list timer;
void timer_function(int para){
printk("<0>Timer Expired and para is %d!!
",para);
}
int timer_init(){
init_timer(&timer);//定时器初始化
timer.data = 5;//定时函数的参数
timer.expires = jiffies+(20*HZ);设置定时为20s
timer.function = timer_function;//para这个参数有data传过来,定时过后执行的函数
add_timer(&timer);//启动定时器
return 0;
void timer_exit(){
del_timer(&timer);//定时器删除
}
module_init(timer_init);
module_exit(timer_exit);