內(nèi)核定時器

軟件上的定時器最終要依靠硬件時鐘來實現(xiàn),簡單的說,內(nèi)核會在時鐘中斷發(fā)生后檢測各個注冊到內(nèi)核的定時器是否到期,如果到期,就回調(diào)相應(yīng)的注冊函數(shù),將其作為中斷底半部來執(zhí)行。實際上,時鐘中斷處理程序會觸發(fā)TIMER_SOFTIRQ軟中斷,運行當(dāng)前處理器上到期的所有定時器。
設(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為單位,以當(dāng)前時刻為基準(zhǔn)計時2秒:(jiffies/HZ+2)*HZ=jiffies+2*HZ如果要獲取當(dāng)前時間,可以使用do_gettimeofday(),該函數(shù)填充一個struct timeval結(jié)構(gòu),有著接近微妙的分辨率。

//kernel/time/timekeeping.c
 473 /**
 474  * do_gettimeofday - Returns the time of day in a timeval
 475  * @tv:         pointer to the timeval to be set
 476  *
 477  * NOTE: Users should be converted to using getnstimeofday()
 478  */
 479 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();

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運,軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式