軟件意義上的定時(shí)器最終依賴(lài)硬件定時(shí)器來(lái)實(shí)現(xiàn), 內(nèi)核在時(shí)鐘中斷發(fā)生后檢測(cè)各定時(shí)器是否到期 , 到期后的定時(shí)器處理函數(shù)將作為軟中斷在底半部執(zhí)行 。實(shí)質(zhì)上,時(shí)鐘中斷處理程序會(huì) 換起TIMER_SOFTIRQ軟中斷 ,運(yùn)行當(dāng)前處理器上到期的所有定時(shí)器。
總結(jié)起來(lái)還是軟中斷的流程
a.注冊(cè)軟中斷處理函數(shù)
/*/linux/kernel.timer.c*/void __init init_timers(void) -->open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);
b.添加timer_list到某個(gè)鏈表
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í)行時(shí)間到達(dá)的timer_list中的定時(shí)器處理函數(shù)
在Linux設(shè)備驅(qū)動(dòng)編程中,可以利用Linux內(nèi)核中提供的一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)來(lái)完成定時(shí)觸發(fā)工作或者完成某種周期性的事務(wù)。這組函數(shù)和數(shù)據(jù)結(jié)構(gòu)使得驅(qū)動(dòng)程序師在多數(shù)情況下不用關(guān)心具體的軟件定時(shí)器究竟對(duì)應(yīng)著怎樣的內(nèi)核和硬件行為。
1) 一個(gè)timer_list 結(jié)構(gòu)體的實(shí)例對(duì)應(yīng)一個(gè)定時(shí)器,其定義如下:
struct timer_list { struct list_head entry, /*定時(shí)器列表*/ unsigned long expires, /*定時(shí)器到期時(shí)間*/ void (*function) (unsigned long), /*定時(shí)器處理函數(shù)*/ unsigned long data,/*作為參數(shù)被傳入定時(shí)器處理函數(shù)*/ struct timer_base_s *base, ...};實(shí)例化 struct timer_list my_timer;
2) 初始化定時(shí)器
void init_timer (struct timer_list *timer);TIMER_INITIALIZER (_function, _expires, _data)DEFINE_TIMER (_name, _function, _expires, _data)setup_timer ();
3) 增加定時(shí)器
void add_timer (struct timer_list *timer);
4) 刪除定時(shí)器
int del_timer (struct timer_list *timer);
5) 修改定時(shí)器的expire
int mod_timer (struct timer_list *timer, unsigned long expires);
新聞熱點(diǎn)
疑難解答
圖片精選