linux時間子系統(六)

2022-08-10 08:27:09 字數 2144 閱讀 6306

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...