LINUX驱动编程----内核定时器

timer_list结构体:
struct timer_list {
struct list_head entry;
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
struct timer_base_s *base;
};


1,定义一个timer_list定时器
struct timer_list my_timer;

2,初始化定时器
1)void init_timer(struct timer_list *timer);
上述init_timer()函数初始化timer_list 的entry 的next 为NULL,并给base 指针赋值。
timer->function = xxx_do_timer;
timer->data = (unsigned long)data;
timer->expires = jiffies + delay;

2)TIMER_INITIALIZER(_function, _expires, _data)
宏用于赋值定时器结构体的function、expires、data和ba se 成员,


3,增加定时器
void add_tiemr(struct timer_list * timer);
将定时器加入到内核动态定时器链表中


4,删除定时器
int del_timer(struct timer_list *timer);


5,修改定时器
int mod_timer(struct timer_list *timer,unsigned long expires);
修改定时器的到期时间,在新的被传入的expires 到来后才会执行定时器函数。

简单的使用模版

struct mdevice {
		...
		struct timer_list mtimer;
		...
	};
	struct mdevice mdve;
	
	void xxx_do_timer(unsigned long data)
	{
		printk("Executed\n");
	}
	int __init mdevice_init(void)
	{
		...
		struct mdevice *mdvp = &mdve;
		init_timer(&mdvp->timer);
		mdvp->timer.function=xxx_do_timer;
		mdvp->timer.data = data;
		timer->expires = jiffies + HZ;
		...
		add_timer(&mdvp->timer);
	}
	
	void __exit mdevice_exit(void)
	{
		...
		del_timer(&mdvp->timer);
		...
	}

举例:

1,使用内核定时器去除按键的抖动

    按键触发中断时,中断处理函数延时执行


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章