Linux2 6 33定時器和時間管理

2021-10-08 11:57:06 字數 3622 閱讀 2384

//在中定義

extern

unsigned

long

volatile jiffies;

//第二變數也定義在中

extern u64 jiffies_64;

//ld鏈結指令碼用於連線核心映像(x86位於arch/x86/kernel/vmlinux.lds.s)

//然後jiffies_64變數的初值覆蓋jiffies變數

jiffies = jiffies_64;

#include

//為了防止jiffies的迴繞,即當jiffies_64或jiffies變數的值超過最大範圍就會產生溢位

//其中unknown引數通常是jiffies,known引數是需要對比的值

//當時間unknown超過指定的known時,返回真,否則返回假

#define time_after(unknown, known) ((long)(known) - (long)(unknown) < 0)

//當時間unknown沒有超過指定的known時,返回真,否則返回假

#define time_before(unknown, known) ((long)(unknown) - (long)(known) < 0)

//當時間unknown超過或等於指定的known時,返回真,否則返回假

#define time_after_eq(unknown, known) ((long)(unknown) - (long)(known) >= 0)

//當時間unknown沒有超過或等於指定的known時,返回真,否則返回假

#define time_before_eq(unknown, known) ((long)(known) - (long)(unknown) >= 0)

案例

unsigned

long timeout = jiffies + hz/2;

秒後超時if(

time_before

(jiffies, timeout)

)else

#include

struct timespec

;

write_seqlock

(xtime_lock)

;/*更新xtime*/

write_sequnlock

(xtime_lock)

;

//下面**實際為函式do_gettimeofday()的部分**

unsigned

long seq;

unsigned

long lost;

dowhile

(read_seqretry

(&xtime_lock, seq)

);

asmlinkage long

sys_gettimeofday

(struct timeval *tv,

struct timezone *tz)if(

unlikely

(tz)

return0;

}

#include

struct timer_list

;

//建立定時器

struct timer_list timer;

//定時器初始化,初始化定時器資料結構的內部值

timer.expires = jiffies + delay;

//超時時間,以節拍為單位的絕對計數值

timer.data =0;

//data引數,可以利用乙個處理函式註冊多個定時器

timer.function = timer_handler;

init_timer

(&timer)

;//啟用定時器

add_timer

(&timer)

;//改變已經啟用的定時器超時時間,該函式也可以操作已經初始化,但未啟用的定時器

//如果定時器未啟用,mod_timer()會啟用

//如果呼叫定時器未被啟用,該函式返回0,否則返回1

//不管何種情況,一旦mod_timer()函式返回,定時器都將被啟用且設定新定時值

mod_timer

(&timer, jiffies + new_delay)

;//在定時器超時前停止定時器

//被啟用或未被啟用的定時器都可以使用該函式

//如果定時器未被啟用,返回0,否則返回1

//不需要為已經超時的定時器呼叫該函式,因為它們會自動刪除

del_timer

(&timer)

;//需要刪除定時器時需要等待可能在其他處理器上執行的定時器處理程式都退出,則該呼叫del_timer_sync()函式

//del_timer_sync()函式不能在中斷上下文中使用

del_timer_sync

(&timer)

;

#include

#include

void

udelay

(unsigned

long usecs)

;void

ndelay

(unsigned

long nsecs)

;void

mdelay

(unsigned

long msecs)

;

//將任務設定為task_interruptible或task_uninterruptible

set_current_state

(task_interruptible)

;//s秒後喚醒

schedule_timeout

(s * hz)

;

schedule_timeout()的實現

signed

long

schedule_timeout

(signed

long timeout)

expire = timeout + jiffies;

init_timer

(&timer)

; timer.expires = expire;

timer.data =

(unsigned

long

) current;

timer.function = process_timerout;

add_timer

(&timer)

;schedule()

;del_timer_sync

(&timer);

timeout = expire - jiffies;

out:

return timeout <0?

0: timeout;}}

void

process_timeout

(unsigned

long data)

linux時間和定時器zz

定時函式,用於讓程式等待一段時間或安排計畫任務 一般情況下,獲取當前時間常用gettimerofday,因為它的精度是1us,並且在x86平台上它是使用者態實現的,沒有系統呼叫和上下文切換的開銷。定時函式中 sleep alarm在實現時有可能用了訊號 sigalrm,在多執行緒程式中處理訊號是個相...

linux定時器和時間管理

linux系統的時間是靠乙個叫 系統定時器 的晶元控制的 系統定時器相當於乙個晶振,產生固定的頻率,作業系統利用這個固定頻率來計時 系統定時器按照一定的頻率傳送中斷訊號,這個中斷我們叫定時器中斷 這個頻率值叫節拍率是可配置的,linux 2.5之前節拍率是100 2.5之後提高到了1000hz 就是...

關於 時間和定時器

這些東西 本來感覺沒有什麼搞得必要 但是 感覺很多書 都介紹了一些 我也就跟著做一下吧。獲取系統的時間 這個 應該是是最簡單的 直接看 就ok include stdafx.h include int tmain int argc,tchar ar 關於 systemtime 這個結構體 可以直接看...