linux內(nèi)核(驅(qū)動)編程中的延時函數(shù)都有哪些

摘要:Linux內(nèi)核或驅(qū)動程序中經(jīng)常會使用到一些延時函數(shù)聚蝶,在這段時間里硬件設(shè)備可以完成相關(guān)的工作杰妓。本文主要講述linux中經(jīng)常使用到的納秒級、毫秒級及秒級的延時函數(shù)及其使用方法和場景碘勉。

1巷挥、時間度量

先介紹兩個有用的全局變量:HZjiffies

  • HZ是Linux內(nèi)核中的一個重要全局變量,表示系統(tǒng)在1秒鐘的時間里系統(tǒng)時鐘中斷(由硬件定時器產(chǎn)生)發(fā)生的次數(shù)验靡。它一般取值為1000倍宾,但不同硬件平臺有不同取值雏节。
  • 系統(tǒng)初始化的時候,將一個全局計數(shù)器jiffies設(shè)置為0高职,此后每當(dāng)時鐘中斷發(fā)生一次矾屯,系統(tǒng)就將jiffies的值加1,所以這個值記錄了系統(tǒng)啟動以來經(jīng)歷的時間初厚。
  • 比較jiffies的值可以使用Linux定義的幾個宏:
/* 當(dāng)a>b時返回true件蚕,否則返回false*/
#define time_after(a,b) ( typecheck(unsigned long,a) &&\
                          typecheck(unsigned long,a) &&\
                          ((long)(b)-(long)(a) < 0) )

/* 當(dāng)a<b時返回true,否則返回false*/
#define time_before(a,b)    time_after(b,a) 

/* 當(dāng)a>=b時返回true产禾,否則返回false*/
#define time_after_eq(a,b)  ( typecheck(unsigned long,a) &&\
                          typecheck(unsigned long,a) &&\
                          ((long)(a)-(long)(b) >= 0) )
/* 當(dāng)a<=b時返回true排作,否則返回false*/
#define time_before_eq(a,b) time_after_eq(b,a)  

2、時間延時

2.1短延時

  • 在設(shè)備驅(qū)動程序處理硬件讀寫時亚情,往往需要延時一段短時間以使設(shè)備成功完成某些操作妄痪,因?yàn)镃PU指令執(zhí)行速度遠(yuǎn)大于硬件設(shè)備,不延時的話可能會和CPU速度匹配不上楞件。
  • Linux內(nèi)核提供了2個函數(shù)來分別完成不同量級的延時(延時期間程序忙等待):
static inline void ndelay(unsigned long x);
static inline void udelay(unsigned long x);

這些函數(shù)的實(shí)現(xiàn)依賴于具體的平臺衫生,可能有的平臺硬件上根本實(shí)現(xiàn)不了納秒級的延時,此時內(nèi)核會使用一個有限循環(huán)函數(shù)來達(dá)到此目的:

static inline void ndelay(unsigned long x)
{
    ...
    /*根據(jù)CPU頻率及x的值計算出count的值*/
    while(count)
    {
        count--;
    }
}

2.2中等延時

一般稱毫秒級的延時為中等延時土浸,內(nèi)核實(shí)現(xiàn)了3個函數(shù)(延時期間程序進(jìn)入睡眠狀態(tài)):

/* 延時msecs毫秒罪针,程序進(jìn)入睡眠,且不可被打斷 */
void msleep(unsigned int msecs);

/* 延時msecs毫秒黄伊,程序進(jìn)入睡眠泪酱,但可以被打斷 */
unsigned long msleep_interruptible(unsigned int msecs);

/* 延時msecs毫秒,程序進(jìn)入睡眠还最,且不可被打斷 */
static inline void ssleep(unsigned int secs);

2.3長延時

長延時表示驅(qū)動程序要延時相對較長的一段時間墓阀,方法主要使比較當(dāng)前jiffies值和目標(biāo)jiffies值,它是忙等待的拓轻。下例實(shí)現(xiàn)了延時10秒的目的:

unsigned long timeout = jiffies + 10*HZ斯撮;
while(time_before(jiffies, timeout));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扶叉,隨后出現(xiàn)的幾起案子勿锅,更是在濱河造成了極大的恐慌,老刑警劉巖辜梳,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粱甫,死亡現(xiàn)場離奇詭異,居然都是意外死亡作瞄,警方通過查閱死者的電腦和手機(jī)茶宵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宗挥,“玉大人乌庶,你說我怎么就攤上這事种蝶。” “怎么了瞒大?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵螃征,是天一觀的道長。 經(jīng)常有香客問我透敌,道長盯滚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任酗电,我火速辦了婚禮魄藕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撵术。我一直安慰自己背率,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布嫩与。 她就那樣靜靜地躺著寝姿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪划滋。 梳的紋絲不亂的頭發(fā)上饵筑,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音古毛,去河邊找鬼翻翩。 笑死,一個胖子當(dāng)著我的面吹牛稻薇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胶征,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼塞椎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了睛低?” 一聲冷哼從身側(cè)響起案狠,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钱雷,沒想到半個月后骂铁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罩抗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年拉庵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片套蒂。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钞支,死狀恐怖茫蛹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烁挟,我是刑警寧澤婴洼,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站撼嗓,受9級特大地震影響柬采,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜且警,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一粉捻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧振湾,春花似錦杀迹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至大州,卻和暖如春续语,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厦画。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工疮茄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人根暑。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓力试,卻偏偏與公主長得像,于是被迫代替她去往敵國和親排嫌。 傳聞我的和親對象是個殘疾皇子畸裳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言: Linux中如何對時間進(jìn)行管理?時鐘節(jié)拍的概念及延時函數(shù)的用法很多同學(xué)都用不好淳地,下面我給大家總結(jié)一下怖糊。 一...
    華清遠(yuǎn)見2閱讀 542評論 0 0
  • 進(jìn)程 創(chuàng)建 創(chuàng)建進(jìn)程用fork()函數(shù)。fork()為子進(jìn)程創(chuàng)建新的地址空間并且拷貝頁表颇象。子進(jìn)程的虛擬地址空間...
    梅花怒閱讀 1,907評論 0 7
  • Linux time system Linux中跟時間有關(guān)的函數(shù)變量有很多伍伤,但是對開發(fā)者來說無非就是用了計時/延時...
    Creator_Ly閱讀 1,640評論 0 5
  • 第六章 高級字符驅(qū)動程序操作 ioctl方法: 為了保證ioctl命令的唯一性,對于命令的定義使用了4個位字段...
    xiaozi63閱讀 630評論 0 0
  • 在為操作系統(tǒng)編寫驅(qū)動設(shè)備時遣钳,因?yàn)樯婕暗街袛嗳呕辍⒍嗳蝿?wù)和多處理器SMP的處理,所以內(nèi)核提供了諸如原子操作、信號量阅爽、完成...
    Leon_Geo閱讀 398評論 0 0