hrtimer、hrtimer_init()使用

1、内核用一个hrtimer结构来表示一个高精度定时器。

struct hrtimer {    
        struct timerqueue_node      node;    
        ktime_t             _softexpires;    
        enum hrtimer_restart        (*function)(struct hrtimer *);    
        struct hrtimer_clock_base   *base;    
        unsigned long           state;    
            ......    
    }; 

定时器的到期时间用ktime_t来表示,_softexpires字段记录了时间,定时器一旦到期,function字段指定的回调函数会被调用,该函数的返回值为一个枚举值,它决定了该hrtimer是否需要被重新激活:
enum hrtimer_restart {    
        HRTIMER_NORESTART,  /* Timer is not restarted */    
        HRTIMER_RESTART,    /* Timer must be restarted */    
    };

2、如何使用

1)需要定义一个hrtimer结构的实例

2)用hrtimer_init函数对它进行初始化

void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,    
             enum hrtimer_mode mode);


其中which_clock可以是CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_BOOTTIME中的一种,mode则可以是相对时间HRTIMER_MODE_REL,也可以是绝对时间HRTIMER_MODE_ABS。设定回调函数:

timer.function = hr_callback;

3)如果定时器无需指定一个到期范围,可以在设定回调函数后直接使用hrtimer_start激活该定时器;如果需要指定到期范围,则可以使用hrtimer_start_range_ns激活定时器。函数原型:

int hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode);   
hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, unsigned long range_ns, const enum hrtimer_mode mode);


4)要取消一个hrtimer,使用hrtimer_cancel。函数原型:

int hrtimer_cancel(struct hrtimer *timer);

3、示例代码:

eg:

static struct hrtimer battery_kthread_timer;

enum hrtimer_restart battery_kthread_hrtimer_func(struct hrtimer *timer)  
{  
    //bat_thread_wakeup();
   do something
   return HRTIMER_NORESTART;  
}  
void battery_kthread_hrtimer_init(void)  
{  
    ktime_t ktime;  
  
    ktime = ktime_set(1, 0);    //set  1s 定时  
    hrtimer_init(&battery_kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);  
    battery_kthread_timer.function = battery_kthread_hrtimer_func;  
    hrtimer_start(&battery_kthread_timer, ktime, HRTIMER_MODE_REL);  
 }  

你可能感兴趣的:(linux内核)