Linux的內核中定義了一個定時器的結構:linux
#include<linux/timer.h>ide
struct timer_list函數
{spa
struct list_head list;code
unsigned long expires; //定時器到期時間blog
unsigned long data; //做爲參數被傳入定時器處理函數開發
void (*function)(unsigned long);it
};io
利用這個結構咱們能夠在驅動中很方便的使用定時器。編譯
一: timer的API函數:
初始化定時器:
void init_timer(struct timer_list * timer);
增長定時器:
void add_timer(struct timer_list * timer);
刪除定時器:
int del_timer(struct timer_list * timer);
修改定時器的expire:
int mod_timer(struct timer_list *timer, unsigned long expires);
二:使用定時器的通常流程爲:
(1)建立timer、編寫超時定時器處理函數function;
(2)爲timer的expires、data、function賦值;
(3)調用add_timer將timer加入列表----添加一個定時器;
(4)在定時器到期時,function被執行;
(5)在程序中涉及timer控制的地方適當地調用del_timer、mod_timer刪除timer或修改timer的expires。
三:下面看一個例子:
#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>//jiffies在此頭文件中定義#include <linux/init.h>#include <linux/timer.h>struct timer_list mytimer;//定義一個定時器void mytimer_ok(unsigned long arg) { printk("Mytimer is ok\n"); printk("receive data from timer: %d\n",arg); } static int __init hello_init (void) { printk("hello,world\n"); init_timer(&mytimer); //初始化定時器 mytimer.expires = jiffies+100;//設定超時時間,100表明1秒 mytimer.data = 250; //傳遞給定時器超時函數的值 mytimer.function = mytimer_ok;//設置定時器超時函數 add_timer(&mytimer); //添加定時器,定時器開始生效 return 0; } static void __exit hello_exit (void) { del_timer(&mytimer);//卸載模塊時,刪除定時器 printk("Hello module exit\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR("CXF"); MODULE_LICENSE("Dual BSD/GPL");
四:交叉編譯後,放到開發板上:
#insmod timer.ko
能夠發現過一秒後定時器過時函數被執行了,打印出了信息,250也被正確傳遞了。
#rmmod timer.ko
咱們也能夠用lsmod | grep timer 來查看是否加載了timer驅動。
能夠用dmesg | tail -20 查看驅動打印的信息
dmesg -c 清楚信息
五:進一步理解定時器:
在上面的定時器超時函數mytimer_ok(unsigned long arg)中,添加以下代碼:
mytimer.expires = jiffies+100;//設定超時時間,100表明1秒
mytimer.function = mytimer_ok;//設置定時器超時函數
add_timer(&mytimer); //添加定時器,定時器開始生效
交叉編譯後,放到開發板上
#insmod timer.o
發現每隔一秒,mytimer_ok函數就執行一次,這是由於每次定時器到期後,都
又從新給它設置了一個新的超時時間,而且新的超時函數指向本身,造成一個遞
歸,因此就會一直執行下去。
#rmmod timer
能夠卸載模塊,固然打印也就結束了,注意由於定時器超時函數不停的打印信息
,致使輸入上面的命令時會被定時器超時函數不停的打印信息淹沒,不用管他,
耐心的把上面的命令輸完就能夠成功卸載。