时间子系统四——高精度定时器分析

本文简单解释一下高精度定时器的主要函数接口以及实现细节。

  • hrtimer_init
(struct hrtimer *timer, clockid_t clock_id, enum hrtimer_mode mode)

高精度定时器的初始化,这里有两个参数要特别注意,clock_id和mode,其中clock_id指定基于哪一个时间域来做定时,一般来说有两个选择CLOCK_REALTIME和CLOCK_MONOTONIC,前者是实际的系统时间,如果修改了系统时间,那么定时行为也会相应改变;后者是单调递增时间,不随系统时间改变。mode一般来说也是有两个选择,HRTIMER_MODE_ABS和HRTIMER_MODE_REL,前者指定绝对时间,后者指定相对时间。

  • hrtimer_start
static inline void hrtimer_start(struct hrtimer *timer, ktime_t tim,
				 const enum hrtimer_mode mode)

启动定时器,这里的mode表示tim的时间格式,如果HRTIMER_MODE_ABS则tim是一个绝对时间,否则是一个相对时间。
该函数主要是调用enqueue_hrtimer根据超时时间将定时器插入到红黑树上去,红黑树最右边是超时时间离现在最近的定时器。很明显,定时器超时后,在对应的中断处理函数中,从右边依次取出定时器处理即可,如果某个定时器的超时时间还没到,那么其后面的定时器超时时间肯定也没到。

  • hrtimer_interrupt
    高精度定时器超时处理函数。该函数处理逻辑其实非常简单,就是从红黑树依次取出定时器,如果超时就调用其超时处理函数即可。除此以外,还有一个非常重要的工作,就是配置下一次的超时时间,这个是通过__hrtimer_get_next_event和tick_program_event两个函数实现的,比较简单就不再祥诉了,最终是调用定时器提供的set_next_event回调函数配置timer的寄存器,配置下一次的超时时间。
  • hrtimer_forward_now/hrtimer_forward
    设置定时器的下一次超时时间,这里只是设置本定时器的下一次超时时间,但是并不会立即配置到timer寄存器中去。

你可能感兴趣的:(linux时间子系统)