linux的核心中定義了乙個定時器的結構:
#include
struct timer_list
;
利用這個結構我們可以在驅動中很方便的使用定時器。
一: 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
#include
#include
#include
//jiffies在此標頭檔案中定義
#include
#include
struct timer_list mytimer;
//定義乙個定時器
void
mytimer_ok
(unsigned
long arg)
static
int __init hello_init (
void
)static
void __exit hello_exit (
void
)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
可以解除安裝模組,當然列印也就結束了,注意因為定時器超時函式不停的列印資訊
,導致輸入上面的命令時會被定時器超時函式不停的列印資訊淹沒,不用管他,
耐心的把上面的命令輸完就可以成功解除安裝。
Linux定時器的使用
使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。乙個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,使用alarm定時發出乙個訊號,還有那就是用gettimeofday,...
linux定時器的使用
使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。一 個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,其實,還有乙個方法,那就是用gettimeofday,difftim...
linux定時器的使用
使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。乙個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,其實,還有乙個方法,那就是用gettimeofday,difftime...