本篇內(nèi)容介紹了“Linux內(nèi)核定時(shí)器與延遲工作怎么實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)成都全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、高唐網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、購(gòu)物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為高唐等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
內(nèi)核定時(shí)器
軟件上的定時(shí)器最終要依靠硬件時(shí)鐘來(lái)實(shí)現(xiàn),簡(jiǎn)單的說(shuō),內(nèi)核會(huì)在時(shí)鐘中斷發(fā)生后檢測(cè)各個(gè)注冊(cè)到內(nèi)核的定時(shí)器是否到期,如果到期,就回調(diào)相應(yīng)的注冊(cè)函數(shù),將其作為中斷底半部來(lái)執(zhí)行。實(shí)際上,時(shí)鐘中斷處理程序會(huì)觸發(fā)TIMER_SOFTIRQ軟中斷,運(yùn)行當(dāng)前處理器上到期的所有定時(shí)器。
設(shè)備驅(qū)動(dòng)程序如要獲得時(shí)間信息以及需要定時(shí)服務(wù),都可以使用內(nèi)核定時(shí)器。
jiffies
要說(shuō)內(nèi)核定時(shí)器,首先就得說(shuō)說(shuō)內(nèi)核中關(guān)于時(shí)間的一個(gè)重要的概念:jiffies變量,作為內(nèi)核時(shí)鐘的基礎(chǔ),jiffies每隔一個(gè)固定的時(shí)間就會(huì)增加1,稱(chēng)為增加一個(gè)節(jié)拍,這個(gè)固定間隔由定時(shí)器中斷來(lái)實(shí)現(xiàn),每秒中產(chǎn)生多少個(gè)定時(shí)器中斷,由在
//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ū)動(dòng)程序?yàn)榱俗層布凶銐虻臅r(shí)間完成一些任務(wù),常常需要將特定的代碼延后一段時(shí)間來(lái)執(zhí)行,根據(jù)延時(shí)的長(zhǎng)短,內(nèi)核開(kāi)發(fā)中使用長(zhǎng)延時(shí)和短延時(shí)兩個(gè)概念。長(zhǎng)延時(shí)的定義為:延時(shí)時(shí)間>多個(gè)jiffies,實(shí)現(xiàn)長(zhǎng)延時(shí)可以用查詢(xún)jiffies的方法:
time_before(jiffies, new_jiffies); time_after(new_jiffiesmjiffies);
**短延時(shí)的定義為:延遲事件接近或短于一個(gè)jiffy,實(shí)現(xiàn)短延時(shí)可以調(diào)用
udelay(); mdelay();
這兩個(gè)函數(shù)都是忙等待函數(shù),大量消耗CPU時(shí)間,前者使用軟件循環(huán)來(lái)延遲指定數(shù)目的微妙數(shù),后者使用前者的嵌套來(lái)實(shí)現(xiàn)毫秒級(jí)的延時(shí)。
定時(shí)器
驅(qū)動(dòng)可以注冊(cè)一個(gè)內(nèi)核定時(shí)器,來(lái)指定一個(gè)函數(shù)在未來(lái)某個(gè)時(shí)間來(lái)執(zhí)行。定時(shí)器從注冊(cè)到內(nèi)核開(kāi)始計(jì)時(shí),達(dá)到指定的時(shí)間后會(huì)執(zhí)行注冊(cè)的函數(shù)。即超時(shí)值是一個(gè)jiffies值,當(dāng)jiffies值大于timer->expires時(shí),timer->function就會(huì)被執(zhí)行。API如下
//定一個(gè)定時(shí)器 struct timer_list my_timer;//初始化定時(shí)器 void init_timer(struct timer_list *timer); mytimer.function = my_function; mytimer.expires = jiffies +HZ;//增加定時(shí)器 void add_timer(struct timer_list *timer);//刪除定時(shí)器 int del_tiemr(struct timer_list *timer);
實(shí)例
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)核定時(shí)器完成定時(shí)延遲工作,Linux內(nèi)核還提供了一套封裝好的"快捷方式"-delayed_work,和內(nèi)核定時(shí)器類(lèi)似,其本質(zhì)也是利用工作隊(duì)列和定時(shí)器實(shí)現(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);
至此,我們可以使用一個(gè)delayed_work對(duì)象以及相應(yīng)的調(diào)度API實(shí)現(xiàn)對(duì)指定任務(wù)的延時(shí)執(zhí)行
//注冊(cè)一個(gè)延遲執(zhí)行 591 static inline bool schedule_delayed_work(struct delayed_work *dwork,unsigned long delay)//注銷(xiāo)一個(gè)延遲執(zhí)行 2975 bool cancel_delayed_work(struct delayed_work *dwork)
和內(nèi)核定時(shí)器一樣,延遲執(zhí)行只會(huì)在超時(shí)的時(shí)候執(zhí)行一次,如果要實(shí)現(xiàn)循環(huán)延遲,只需要在注冊(cè)的函數(shù)中再次注冊(cè)一個(gè)延遲執(zhí)行函數(shù)。
schedule_delayed_work(&work,msecs_to_jiffies(poll_interval));
“Linux內(nèi)核定時(shí)器與延遲工作怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!