linux timer

Linux的內核中定義了一個定時器的結構:

#include<linux/timer.h>

struct timer_list

 {

      struct list_head list;

  unsigned long expires; //定時器到期時間

  unsigned long data; //作爲參數被傳入定時器處理函數

  void (*function)(unsigned long);

};

利用這個結構我們可以在驅動中很方便的使用定時器。

 

一: 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

可以卸載模塊,當然打印也就結束了,注意因爲定時器超時函數不停的打印信息

,導致輸入上面的命令時會被定時器超時函數不停的打印信息淹沒,不用管他,

耐心的把上面的命令輸完就可以成功卸載。


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