溫馨提示×

溫馨提示×

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

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

簡單談?wù)凩inux內(nèi)核定時器

發(fā)布時間:2020-09-26 07:39:05 來源:腳本之家 閱讀:249 作者:yangjiguang 欄目:服務(wù)器

軟件意義上的定時器最終依賴硬件定時器來實現(xiàn), 內(nèi)核在時鐘中斷發(fā)生后檢測各定時器是否到期 , 到期后的定時器處理函數(shù)將作為軟中斷在底半部執(zhí)行 。實質(zhì)上,時鐘中斷處理程序會 換起TIMER_SOFTIRQ軟中斷 ,運行當(dāng)前處理器上到期的所有定時器。

總結(jié)起來還是軟中斷的流程

a.注冊軟中斷處理函數(shù)

/*/linux/kernel.timer.c*/
void __init init_timers(void)
  -->open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);

b.添加timer_list到某個鏈表

void add_timer (struct timer_list *timer);

c.觸發(fā)軟中斷處理函數(shù)

void irq_exit(void)
  -->tick_nohz_stop_sched_tick();
    -->raise_softirq_irqoff(TIMER_SOFTIRQ);

d.調(diào)用軟中斷處理函數(shù)

static void run_timer_softirq(struct softirq_action *h)
    -->__run_timers(base);
        -->遍歷執(zhí)行時間到達(dá)的timer_list中的定時器處理函數(shù)
在Linux設(shè)備驅(qū)動編程中,可以利用Linux內(nèi)核中提供的一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)來完成定時觸發(fā)工作或者完成某種周期性的事務(wù)。這組函數(shù)和數(shù)據(jù)結(jié)構(gòu)使得驅(qū)動程序師在多數(shù)情況下不用關(guān)心具體的軟件定時器究竟對應(yīng)著怎樣的內(nèi)核和硬件行為。

1) 一個timer_list 結(jié)構(gòu)體的實例對應(yīng)一個定時器,其定義如下:

struct timer_list {

   struct list_head entry, /*定時器列表*/
   unsigned long expires, /*定時器到期時間*/
   void (*function) (unsigned long), /*定時器處理函數(shù)*/
   unsigned long data,/*作為參數(shù)被傳入定時器處理函數(shù)*/
   struct timer_base_s *base,
   ...

};

實例化 struct timer_list my_timer;

2) 初始化定時器

void init_timer (struct timer_list *timer);

TIMER_INITIALIZER (_function, _expires, _data)

DEFINE_TIMER (_name, _function, _expires, _data)

setup_timer ();

3) 增加定時器

void add_timer (struct timer_list *timer);

4) 刪除定時器

int del_timer (struct timer_list *timer);

5) 修改定時器的expire

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

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

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

AI