Linux驅動中定時器的使用

2021-10-05 13:22:29 字數 1407 閱讀 5801

/**

* linux/timer.h

* 定義乙個struct timer_list的結構體全域性變數, 即定時器

*/static

struct timer_list buttons_timer;

// 初始化該定時器

init_timer

(&buttons_timer)

;// 設定定時器函式, 當定時器計數到達時, 該函式將被呼叫

buttons_timer.function = buttons_timer_function;

// 向linux系統新增該定時器

add_timer

(&buttons_timer)

;// 修改該定時器的定時時間, 將重新重新整理定時器.

mod_timer

(&buttons_timer, jiffies+hz/

100)

;

linux hz

linux核心每隔固定週期會發出timer interrupt (irq 0),hz是用來定義每一秒有幾次timer interrupts。舉例來

說,hz為1000,代表每秒有1000次timer interrupts,比較常見的設定是hz=100。

可以通過 cat /proc/interrupt 檢視timer中斷次數,並於一秒後再次觀察其值,通過前後差值可以估算hz的值。

要檢查核心原始碼中hz的值是什麼,可以執行命令:

#cat kernel/.config | grep 『config_hz=』

還可以直接更改檔案param.h

tick

tick是hz的倒數,意即timer interrupt每發生一次中斷的時間。如hz為250時,tick為4毫秒(millisecond)。

jiffies

jiffies為linux核心變數(32位元變數,unsigned long),它被用來紀錄系統自開機以來,已經過多少的tick。每發生一次timer interrupt,jiffies變數會被加一。在arm體系結構中,jiffies被初始化為jiffies_64,而jiffies_64是乙個u64位元變數,在kernel/timer.c中定義:

u64 jiffies_64 __cacheline_aligned_in_smp = initial_jiffies;

即jiffies在系統開機時,並非初始化成零,而是被設為inital_jiffies(在檔案include/linux/jiffies.h中定義為-300*hz),即代表系統於開機五分鐘後,jiffies便會溢位。那溢位怎麼辦?事實上,linux核心定義幾個macro(timer_after、time_after_eq、time_before與time_before_eq),即便是溢位,也能借由這幾個macro正確地取得jiffies的內容。

Linux驅動定時器相關

本文為我學習時所寫,非百分之百原創,望指出錯誤之處。參考資料 linux驅動之定時器 mod timer 核心定時器的使用 好幾個例子add timer linux核心高精度定時器hrtimer 使用例項 hrtimer的簡單使用 原理和實現 定時器被排程的函式肯定是非同步執行的,它類似於一種 軟體...

linux 驅動中定時器timer學習

linux中定時器,比較簡單。struct timer list 步驟 init timer struct timer list timer 初始化定時器 add timer struct timer list timer 啟動定時器 del timer struct timer list time...

linux驅動中使用定時器的設定

我的核心是2.4.18的。linux的核心中定義了乙個定時器的結構 include struct timer list 利用這個結構我們可以在驅動中很方便的使用定時器。一 timer的api函式 初始化定時器 void init timer struct timer list timer 增加定時器...