從離開大學到現在,接觸linux核心也差不多有乙個月了,基本上對於我來說只是了解一下理論知識,而並沒有去用過,本篇主要是介紹了核心定時器的乙個簡單的應用,其實,核心定時器如果去深入的了解的話,當然是不簡單,光從核心原始碼來看,它的資料結構就尤為複雜,但是今天這個例子, 會非常簡單。 在
linux
核心中,有這樣的乙個定時器,叫做核心定時器,核心定時器用於控制某個函式,也就是定時器將要處理的函式在未來的某個特定的時間內執行。核心定時器註冊的處理函式只執行一次,即不是迴圈執行的。
如果對延遲的精度要求不高的話,最簡單的實現方法如下---忙等待:
unsigned long j = jiffies + jit_delay * hz;
while(jiffies < j)
jiffies:全域性變數,用來記錄自系統啟動以來產生的節拍總數。啟動時核心將該變數初始化為0;
此後每次時鐘中斷處理程式增加該變數的值。每一秒鐘中斷次數hz,jiffies一秒內增加hz。系統執行時間 = jiffie/hz.
jiffies用途:計算流逝時間和時間管理
jiffies內部表示:
extern u64 jiffies_64;
extern unsigned long volatilejiffies; //位長更系統有關32/64
32位:497天後溢位
64位:……
在定時器中有這樣乙個概念,度量時間差:
時鐘中斷由系統的定時硬體以週期性的時間間隔產生,這個間隔說白了其實就是頻率由核心根據hz來確定,hz是乙個與體系結構無關的常數,可以配置為(50-1200),在x86平台,它的值被預設為1000 ;
定時器資料結構被組織成雙向鍊錶,如下:
struct timer_list ;
對核心定時器操作有如下函式:
void init_timer(struct timer_list *timer) ;
void add_timer(struct timer_list *timer);
int del_timer(struct timer_list *timer) ;
分別表示初始化定時器佇列結構,啟動定時器,
在定時器超時前將它刪除。當定時器超時後,系統會自動將它刪除掉。
接下來我們來看乙個例子:
#include
#include
#include
#include /*timer*/
#include /*jiffies*/
module_license("gpl");
module_author("yangyuanxin");
module_description("timermodule");
module_alias("timer module");
struct timer_list timer;
//定時器超時執行函式
void timer_function(int para)
int timer_init()
void timer_exit()
module_init(timer_init);
module_exit(timer_exit);
核心定時器
linux核心2.4版中去掉了老版本核心中的靜態定時器機制,而只留下動態定時器。相應地在timer bh 函式中也不再通過 run old timers 函式來執行老式的靜態定時器。動態定時器與靜態定時器這二個概念是相對於linux核心定時器機制的可擴充套件 功能而言的,動態定時器是指核心的定時器佇...
核心定時器
核心中最終的計時資源是定時器。定時器用於定時器超時處理程式在未來某個特定時間點執行,或者週期性的輪詢硬體的狀態。linux提供了核心定時器完成這類工作。定 時器的只需要執行一些初始化的操作,如 設定乙個超時時間,指定超時要呼叫的函式,然後啟用定時器就可以了。它的處理和工作佇列還是有點類似的。和任務隊...
核心定時器,
ldd3 當定時器執行時 排程該定時器的程序可能正在睡眠,或在其它處理器上執行,或乾脆推出。沒有執行定時器,排程它的程式推出了,定時器該如何?2.6.35。22核心 gcc 4.4.5 include include include include include include include i...