引言: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 第一...