LINUX核心定時器(高精度 低精度)實現迴圈定時

2021-08-21 10:51:04 字數 1916 閱讀 3886

引言:linux從核心2.6.16開始引入了高精度定時器,達到ns級別。自此,核心擁有兩套並行計時器,低精度和高精度。如果高精度沒有開啟,即使使用高精度函式,預設使用的仍舊是低精度。

高精度:

雖然核心已經支援高精度,但是對於不少產品而言,由於核心是裁剪的,配置的時候並沒有加入編譯進去,雖然對應的核心原始碼中有相關**。如果想支援,那麼可以進入核心原始碼,執行make menuconfig。去檢視當前系統是否支援高精度,(備註:因為裡面選項比較多,還可以直接去檢視編譯好的.config檔案,看裡面是否有config_high_res_timers,如果有,就通過make menuconfig開啟,沒有的話,就是不支援),是否真正啟用,可以在核心中對相應巨集進行列印。

低精度:

(定時精度和頻率hz相關,精度為(1000/hz ) ms)

#include 

void do_gettimeofday(struct timeval *tv);//獲取精確時間函式

//核心相關定義

struct timeval ;

#define timer_total_num  2   //定義定時器總數

struct timeval tv;

struct timer_list funtimer[timer_total_num ]; //定義定時器相關結構體陣列

short

int sitimeinitflag[timer_total_num ]; //定時器初始化標誌

short

int sitimeoutflag[timer_total_num ];//定時器啟動標誌

typedef

void (*pftimerfunction)(unsigned

long uldata); //定義定時器處理函式指標,方便處理多個定時器

//定時器初始化

void timer_init(int iindex, int ims, pftimerfunction ptimerfunction)

//定時器處理函式

static

void timer_function(unsigned long uldata)

funtimer[0].function = timer_function;

funtimer[0].expires = jiffies + hz;//重新設定定時時間

add_timer(&funtimer[0]);//啟動定時器

sitimeoutflag[0] = 1;

}

//簡單例子呼叫

int main(void)

使用注意:

1、加入初始化標誌sitimeinitflag[iindex] 是防止定時器在執行時,再次初始化,這樣會導致核心崩潰;

2、使用迴圈定時器時, funtimer[0].expires = jiffies + hz; funtimer的成員expires 必須重新賦值,且要執行 ,

add_timer(&funtimer[0]);

3、定時時長funtimer[iindex].expires = jiffies + hz; //巨集定義hz可以檢視原始碼,或者列印出來,jiffies 為節拍數,系統最高

精度為(1000/hz)ms。

jiffies + hz————-設定定時時長為1s;

jiffies + 1—————設定定時時長為(1000/hz)ms,是系統最高精度

4、核心新增printk後,由於列印函式耗時,會導致執行時間延長,乙個列印延長一般為ms級別

C 高精度定時器

ktimer.h windows graphics programming win32 gdi and directdraw feng yuan publisher prentice hall ptr first edition december 01,2000 高精度納秒計時器,最後修改 2008...

C 高精度定時器

windowsgraphicsprogrammingwin32gdianddirectdraw fengyuan publisher prenticehallptr firsteditiondecember01,2000 高精度納秒計時器,最後修改 usage intmain pragmaonce ...

Qt高精度定時器

一般而言,qt有兩種使用定時器的方式,qobject和qtimer,對於第一種需要重寫timerevent事件來實現,第二種需要宣告乙個qtimer的物件或指標,用qtimer timeout 訊號連線槽函式,設定定時器型別mtimer.settimertype qt precisetimer 第一...