日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux驱动中使用定时器

發布時間:2023/12/10 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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驱动中使用定时器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。