linux timer

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

能夠卸載模塊,固然打印也就結束了,注意由於定時器超時函數不停的打印信息

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

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

相關文章
相關標籤/搜索