一.时钟中断概念
1.时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔(即频率)由内核根据hz来确定,hz是一个与体系结构无关的常数,可配置(50-1200),在x86平台上默认值是1000
2.每当时钟中断发生的时候,全局变量jiffies(unsigned long)就加1,所以jiffies就记录了自linux启动后时钟中断发生的次数,驱动程序常常利用jiffies来计算不同事件间的时间间隔
3.延迟
unsigned long j=jiffies+jit_delay*HZ;
while(jiffies<j){
/*do nothing*/
}//延迟了(1/jit_delay)s
二.内核定时器
1.定时器用于控制某个函数(定时器处理函数)在未来的某个特定时间执行。内核定时器注册的处理函数只执行一次–不是循环执行的
双向链表,并用struct timer_list描述一个内核定时器
struct timer_list{
struct list_head entry; //内核使用
unsigned long expires; //超时的jiffies值–时钟中断发生的次数
void(*function)(unsigned long); // 超时处理函数
unsigned long data; //超时处理函数的参数
struct tvecbase *base; //内核使用
};
1)初始化时钟定时器
void init_timer(struct timer_list *timer);
2)启动定时器
void add_timer(struct timer_list *timer);
3)在定时器超时前将他删除,当定时器超时后,系统会自动的删除它
int del_timer(struct timer_list *timer);
三.设置内核定时器的实例
timer.c源程序
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/timer.h> //timer
#include<linux/uaccess.h> //jiffies
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FEI");
MODULE_DESCRIPTION("TIMER MODULE");
MODULE_ALIAS("timer module");
struct timer_list timer;
void timer_function(int para){
printk("<0>Timer expried and para is %d\n",para);
}
int timer_init(void){
init_timer(&timer);
timer.data=5;
timer.expires=jiffies+(20*HZ);
timer.function=timer_function;
add_timer(&timer);
return 0;
}
void timer_exit(void){
del_timer(&timer);
}
module_init(timer_init);
module_exit(timer_exit);