溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux設(shè)備驅(qū)動指的定時與延時如何理解

發(fā)布時間:2022-01-07 18:14:42 來源:億速云 閱讀:127 作者:柒染 欄目:系統(tǒng)運(yùn)維

本篇文章為大家展示了Linux設(shè)備驅(qū)動指的定時與延時如何理解,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

Linux通過系統(tǒng)硬件定時器以規(guī)律的間隔(由HZ度量)產(chǎn)生定時器中斷,每次中斷使得一個內(nèi)核計(jì)數(shù)器的值jiffies累加,因此這個jiffies就記錄了系統(tǒng)啟動開始的時間流逝,然后內(nèi)核據(jù)此實(shí)現(xiàn)軟件定時器和延時。

Demo for jiffies and HZ

#include <linux/jiffies.h>  unsigned long j, stamp_1, stamp_half, stamp_n;  j = jiffies; /* read the current value */ stamp_1 = j + HZ; /* 1 second in the future */ stamp_half = j + HZ/2; /* half a second */ stamp_n = j + n * HZ / 1000; /* n milliseconds */

內(nèi)核定時器

硬件時鐘中斷處理程序會喚起 TIMER_SOFTIRQ 軟中斷,運(yùn)行當(dāng)前處理器上到期的所有內(nèi)核定時器。

定時器定義/初始化

在Linux內(nèi)核中,timer_list結(jié)構(gòu)體的一個實(shí)例對應(yīng)一個定時器:

/* 當(dāng)expires指定的定時器到期時間期滿后,將執(zhí)行function(data) */

/* 當(dāng)expires指定的定時器到期時間期滿后,將執(zhí)行function(data) */    struct timer_list {        unsigned long expires;           /*定時器到期時間*/        void (*function)(unsigned long); /* 定時器處理函數(shù) */        unsigned long data;              /* function的參數(shù) */        ...    };     /* 定義 */    struct timer_list my_timer;     /* 初始化函數(shù) */    void init_timer(struct timer_list * timer);    /* 初始化宏 */    TIMER_INITIALIZER(_function, _expires, _data)     /* 定義并初始化宏 */    DEFINE_TIMER(_name, _function, _expires, _data)

定時器添加/移除

/* 注冊內(nèi)核定時器,將定時器加入到內(nèi)核動態(tài)定時器鏈表中 */    void add_timer(struct timer_list * timer);     /* del_timer_sync()是 del_timer()的同步版,在刪除一個定時器時需等待其被處理完,       因此該函數(shù)的調(diào)用不能發(fā)生在中斷上下文 */    void del_timer(struct timer_list * timer);    void del_timer_sync(struct timer_list * timer);

定時時間修改

int mod_timer(struct timer_list *timer, unsigned long expires);

延時

短延時

void ndelay(unsigned long nsecs);  void udelay(unsigned long usecs);  void mdelay(unsigned long msecs);

內(nèi)核在啟動時,會運(yùn)行一個延遲測試程序(delay loop calibration),計(jì)算出lpj(loops per  jiffy),根據(jù)lpj就實(shí)現(xiàn)了這幾個函數(shù),屬忙等待。

長延時

  • 一個很直觀的方法是比較當(dāng)前的 jiffies 和目標(biāo) jiffies:

int time_after(unsigned long a, unsigned long b); /* a after b, true */  int time_before(unsigned long a, unsigned long b); /* a before b */  int time_after_eq(unsigned long a, unsigned long b); /* a after or equal b */  int time_before_eq(unsigned long a, unsigned long b);/* a before or equal b */
  • 睡著延時

void msleep(unsigned int millisecs);  unsigned long msleep_interruptible(unsigned int millisecs);  void ssleep(unsigned int seconds);

Tip: msleep()、 ssleep()不能被打斷。

上述內(nèi)容就是Linux設(shè)備驅(qū)動指的定時與延時如何理解,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI