linux驱动中使用定时器
我的內核是2.4.18的。Linux的內核中定義了一個定時器的結構:
#include<linux/timer.h>
struct timer_list
?{
??? structlist_head list;
unsigned long expires; //定時器到期時間
unsigned long data; //作為參數被傳入定時器處理函數
void (*function)(unsigned long);
};
利用這個結構我們可以在驅動中很方便的使用定時器。
一: timer的API函數:
?????????初始化定時器:
?????????????voidinit_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, unsignedlong 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); //添加定時器,定時器開始生效
??? return0;
}
???
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.o
可以發現過一秒后定時器過期函數被執行了,打印出了信息,250也被正確傳遞
了,呵呵!
#rmmod timer
? 實驗完成。
五:進一步理解定時器:
?????在上面的定時器超時函數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驱动中使用定时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内银行卡在国外可以用吗?出国带什么银行
- 下一篇: 信用卡查询密码怎么设置?有哪些设置方法