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);
}