低分辨率定時器是用jiffies來定時的,所以會受到HZ影響,如果HZ為200,代表每秒種產生200次中斷,那一個jiffies就需要5毫秒,所以精度為5毫秒。
如果精度需要達到納秒級別,則需要使用高精度定時器hrtimer。
使用示例
單次定時
加載驅動一秒后輸出“hrtimer handler
”:
#include < linux/init.h >
#include < linux/kernel.h >
#include < linux/module.h >
#include < linux/ktime.h >
#include < linux/hrtimer.h >
static struct hrtimer timer;
static enum hrtimer_restart timer_handler(struct hrtimer *timer )
{
printk("hrtimer handlern");
return HRTIMER_NORESTART;
}
static int __init my_init(void)
{
ktime_t tim;
hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
timer.function = timer_handler;
tim = ktime_set(1,0); //1s
hrtimer_start(&timer,tim,HRTIMER_MODE_REL);
return 0;
}
static void __exit my_exit(void)
{
printk("%s entern", __func__);
hrtimer_cancel(&timer);
}
module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
循環定時
循環定時可以在回調函數中調用hrtimer_forward_now()
重新設置定時時間,然后將返回值設置為HRTIMER_RESTART
代表重啟定時器,就可以做到循環定時的效果。
每隔一秒輸出“hrtimer handler
”:
#include < linux/init.h >
#include < linux/kernel.h >
#include < linux/module.h >
#include < linux/ktime.h >
#include < linux/hrtimer.h >
static struct hrtimer timer;
static enum hrtimer_restart timer_handler(struct hrtimer *timer )
{
printk("hrtimer handlern");
hrtimer_forward_now(timer, ktime_set(1,0));//重新設置定時時間
return HRTIMER_RESTART;//重啟定時器
}
static int __init my_init(void)
{
ktime_t tim;
hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
timer.function = timer_handler;
tim = ktime_set(1,0); //1 s
hrtimer_start(&timer,tim,HRTIMER_MODE_REL);
return 0;
}
static void __exit my_exit(void)
{
printk("%s entern", __func__);
hrtimer_cancel(&timer);
}
module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Linux
+關注
關注
87文章
11231瀏覽量
208937 -
定時器
+關注
關注
23文章
3241瀏覽量
114492 -
函數
+關注
關注
3文章
4308瀏覽量
62434
發布評論請先 登錄
相關推薦
Linux時間子系統中的高精度定時器(HRTIMER)的原理和實現
雖然大部分時間里,時間輪可以實現O(1)時間復雜度,但是當有進位發生時,不可預測的O(N)定時器級聯遷移時間,這對于低分辨率定時器來說問題不大,可是它大大地影響了定時器的精度;
發表于 05-10 14:11
?7669次閱讀
詳解高精度定時器與高級控制定時器
在高精度定時器中,可以使用外部事件來對 PWM 輸出進行封鎖,并可自動恢復;在高級控制定時器中,可以使用 Break 或是 Clr_input 來對 PWM 輸出進行封鎖, 然后也可以自動恢復,其中 Break 必須結合 AOE
Linux驅動開發高精度定時器的精度測量評測
前言 今天我們來評測linux內核的高精度定時器。順便利用通過Tektronix示波器 和 DS100 Mini 數字示波器進行交叉測試。 因項目需要用到精準的時間周期,所以要評估它的可行性,并驗證
Linux驅動高精度定時器hrtimer
高分辨率定時器( hrtimer )以 ktime_t 來定義時間, 精度可以達到納秒級別 , ktime_t 定義如下: typedef s64 ktime_t ; 可以用 ktime_set 來
評論