中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Linux內(nèi)核定時器與延遲工作怎么實現(xiàn)

本篇內(nèi)容介紹了“Linux內(nèi)核定時器與延遲工作怎么實現(xiàn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、高唐網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、購物商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為高唐等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

內(nèi)核定時器

軟件上的定時器最終要依靠硬件時鐘來實現(xiàn),簡單的說,內(nèi)核會在時鐘中斷發(fā)生后檢測各個注冊到內(nèi)核的定時器是否到期,如果到期,就回調(diào)相應(yīng)的注冊函數(shù),將其作為中斷底半部來執(zhí)行。實際上,時鐘中斷處理程序會觸發(fā)TIMER_SOFTIRQ軟中斷,運行當前處理器上到期的所有定時器。

設(shè)備驅(qū)動程序如要獲得時間信息以及需要定時服務(wù),都可以使用內(nèi)核定時器。

jiffies

要說內(nèi)核定時器,首先就得說說內(nèi)核中關(guān)于時間的一個重要的概念:jiffies變量,作為內(nèi)核時鐘的基礎(chǔ),jiffies每隔一個固定的時間就會增加1,稱為增加一個節(jié)拍,這個固定間隔由定時器中斷來實現(xiàn),每秒中產(chǎn)生多少個定時器中斷,由在<linux/param.h>中定義的HZ宏來確定,如此,可以通過jiffies獲取一段時間,比如jiffies/HZ表示自系統(tǒng)啟動的秒數(shù)。下兩秒就是(jiffies/HZ+2),內(nèi)核中用jiffies來計時,秒轉(zhuǎn)換成的jiffies:seconds*HZ,所以以jiffiy為單位,以當前時刻為基準計時2秒:(jiffies/HZ+2)*HZ=jiffies+2*HZ如果要獲取當前時間,可以使用do_gettimeofday(),該函數(shù)填充一個struct timeval結(jié)構(gòu),有著接近微妙的分辨率。

//kernel/time/timekeeping.c /** * do_gettimeofday - Returns the time of day in a timeval * @tv:         pointer to the timeval to be set * * NOTE: Users should be converted to using getnstimeofday() */ void do_gettimeofday(struct timeval *tv)

驅(qū)動程序為了讓硬件有足夠的時間完成一些任務(wù),常常需要將特定的代碼延后一段時間來執(zhí)行,根據(jù)延時的長短,內(nèi)核開發(fā)中使用長延時和短延時兩個概念。長延時的定義為:延時時間>多個jiffies,實現(xiàn)長延時可以用查詢jiffies的方法:

time_before(jiffies, new_jiffies); time_after(new_jiffiesmjiffies);

**短延時的定義為:延遲事件接近或短于一個jiffy,實現(xiàn)短延時可以調(diào)用

udelay(); mdelay();

這兩個函數(shù)都是忙等待函數(shù),大量消耗CPU時間,前者使用軟件循環(huán)來延遲指定數(shù)目的微妙數(shù),后者使用前者的嵌套來實現(xiàn)毫秒級的延時。

定時器

驅(qū)動可以注冊一個內(nèi)核定時器,來指定一個函數(shù)在未來某個時間來執(zhí)行。定時器從注冊到內(nèi)核開始計時,達到指定的時間后會執(zhí)行注冊的函數(shù)。即超時值是一個jiffies值,當jiffies值大于timer->expires時,timer->function就會被執(zhí)行。API如下

//定一個定時器  struct timer_list my_timer;//初始化定時器  void init_timer(struct timer_list *timer); mytimer.function = my_function; mytimer.expires = jiffies +HZ;//增加定時器  void add_timer(struct timer_list *timer);//刪除定時器  int del_tiemr(struct timer_list *timer);

實例

static struct timer_list tm; struct timeval oldtv;void callback(unsigned long arg){     struct timeval tv;     char *strp = (char*)arg;     do_gettimeofday(&tv);     printk("%s: %ld, %ld\n", __func__,         tv.tv_sec - oldtv.tv_sec,         tv.tv_usec- oldtv.tv_usec);     oldtv = tv;     tm.expires = jiffies+1*HZ;     add_timer(&tm); } static int __init demo_init(void){     init_timer(&tm);     do_gettimeofday(&oldtv);     tm.function= callback;     tm.data    = (unsigned long)"hello world";     tm.expires = jiffies+1*HZ;     add_timer(&tm);     return 0; }

延遲工作

除了使用內(nèi)核定時器完成定時延遲工作,Linux內(nèi)核還提供了一套封裝好的"快捷方式"-delayed_work,和內(nèi)核定時器類似,其本質(zhì)也是利用工作隊列和定時器實現(xiàn),

//include/linux/workqueue.h  struct work_struct {                     atomic_long_t data;          struct list_head entry;          work_func_t func;  #ifdef CONFIG_LOCKDEP          struct lockdep_map lockdep_map;  #endif  };  struct delayed_work {              114         struct work_struct work;          struct timer_list timer;    /* target workqueue and CPU ->timer uses to queue ->work */          struct workqueue_struct *wq;          int cpu;  };

--103-->需要延遲執(zhí)行的函數(shù), typedef void (work_func_t)(struct work_struct work);

至此,我們可以使用一個delayed_work對象以及相應(yīng)的調(diào)度API實現(xiàn)對指定任務(wù)的延時執(zhí)行

//注冊一個延遲執(zhí)行  591 static inline bool schedule_delayed_work(struct delayed_work *dwork,unsigned long delay)//注銷一個延遲執(zhí)行 2975 bool cancel_delayed_work(struct delayed_work *dwork)

和內(nèi)核定時器一樣,延遲執(zhí)行只會在超時的時候執(zhí)行一次,如果要實現(xiàn)循環(huán)延遲,只需要在注冊的函數(shù)中再次注冊一個延遲執(zhí)行函數(shù)。

schedule_delayed_work(&work,msecs_to_jiffies(poll_interval));

“Linux內(nèi)核定時器與延遲工作怎么實現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

當前名稱:Linux內(nèi)核定時器與延遲工作怎么實現(xiàn)
文章來源:http://www.rwnh.cn/article24/gopcce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、微信公眾號品牌網(wǎng)站設(shè)計、定制網(wǎng)站網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
施甸县| 全南县| 天镇县| 乐陵市| 寿光市| 密云县| 行唐县| 黑龙江省| 湖南省| 鞍山市| 淮安市| 晋宁县| 天津市| 凌云县| 冷水江市| 平果县| 乌拉特前旗| 武川县| 增城市| 宁城县| 酒泉市| 平安县| 泸溪县| 乐都县| 吉林省| 甘洛县| 麻栗坡县| 芦溪县| 含山县| 辉南县| 准格尔旗| 岳阳县| 浠水县| 济阳县| 厦门市| 罗定市| 贺兰县| 凌源市| 邹城市| 马山县| 恩平市|