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,使用內核定時器去除按鍵的抖動

    按鍵觸發中斷時,中斷處理函數延時執行


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