核心定時器的簡單應用

2021-09-23 22:43:57 字數 1590 閱讀 6548

從離開大學到現在,接觸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...