3.1.4 定時器處理
static inline void __run_timers(struct tvec_base *base)
}wake_up(&base->wait_for_running_timer);
spin_unlock_irq(&base->lock);
}static int cascade(struct tvec_base *base, struct tvec *tv, int index)
return index;
}當前cpu的tvec_base.timer_jiffies的低8位不為0時,按tv1-tv5組成的32位數做加法運算來看,tv1到tv2沒有發生進製,所以可以直接處理tvec_base.timer_jiffies的低8位作為下標索引的tv1中的定時器鍊錶中的定時器即可。此時呼叫定時器的**函式處理即可。而當tvec_base.timer_jiffies的低8位為0時,表明發生了進製,此時需要從高一級別的tv2中取出((base->timer_jiffies >> (tvr_bits + (0) * tvn_bits)) & tvn_mask)作為索引下標的鍊錶,使用函式internal_add_timer將鍊錶中的陣列逐一新增到tv1中。當低14位全為0時,表明tv1向tv2進製,tv2向tv3進製,此時,先完成tv2向tv1的遷移,在完成tv3到tv2的遷移。後續過程依次類推。
3.1.5 定時器的使用
在使用定時器之前,我們需要知道如何定義定時器。在核心程式設計中使用定時器,首先我們需要定義乙個time_list結構
3.1.5.1 timer_list結構
struct timer_list
entry,用於把一組定時器組成乙個鍊錶。
expires,定時器的到期時刻。也就是定時器到期時刻的jiffies計數值。
base,每個cpu擁有乙個自己的用於管理定時器的tvec_base結構。該欄位指向定時器所屬cpu所對應的tvec_base結構。
function,函式指標。定時器到期時,系統會呼叫該**函式,用於響應定時器的到期事件。
data,function**函式的引數。
slack,對有些對到期時間精度不太敏感的定時器,到期時刻允許適當的延遲一小段時間。該欄位用於計算每次延遲的hz數。
3.1.5.2 定義timer_list
要定義乙個定時器,可以使用靜態和動態兩種方案。靜態方案使用define_timer巨集,**如下:
#define define_timer(_name, _function, _expires, _data)
該巨集將得到乙個名字為_name,**函式為_function,**函式引數為_data,到期時刻為_expires的timer_list結構。
struct timer_list timer;
init_timer(&timer);
timer.function=_function;
timer.expires=_expires;
timer.data=_data;
3.1.5.3 啟用定時器
可以使用add_timer(&timer)啟用乙個定時器。
3.1.5.4 修改定時器到期時間
可以使用mod_timer(&timer, new_expires)修改定時器到期時間。
3.1.5.5 移除定時器
使用函式del_timer(&timer)移出定時器。
3.1.5.6 延遲處理
對於某些對精度不敏感的定時器,我們可以設定timer_list.slack欄位的值,設定timer允許到期時刻的最大延遲。使用函式set_timer_slack(&timer, slack_hz)可以完成目標。
linux時間子系統(九)
3.4.3 模擬tick事件 當系統切換到高精度模式後,tick device被高精度定時器系統接管,不再定期地產生tick事件。核心在3.0.30版本中還沒有徹底的廢除jiffies機制,系統還是依賴定期到來的tick事件,完成程序排程和時間更新等操作,大量存在的低精度定時器仍然依賴於jiffie...
linux時間子系統(三)
2.2.3 timekeeper初始化 void init timekeeping init void set normalized timespec wall to monotonic,boot.tv sec,boot.tv nsec total sleep time.tv sec 0 total...
Linux時間子系統之時間的表示
在linux核心中,為了相容原有的 或者符合某種規範,並且還要滿足當前精度日益提高的要求,實現了多種與時間相關但用於不同目的的資料結構 核心用jiffies 64全域性變數記錄系統自啟動以來經過了多少次tick。它的宣告如下 位於kernel time timer.c中 visible u64 ji...