根据hrtimer.h,HRTIMER_MODE_ABS表示时间值是绝对的,而HRTIMER_MODE_REL表示时间值是相对于现在的。
在hrtimer_init上下文中使用时,也可以选择CLOCK_MONOTONIC或CLOCK_REALTIME。这意味着可以通过以下几种方式来初始化hrtimers。
hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
hrtimer_init(&timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
hrtimer_init(&timer, CLOCK_REALTIME, HRTIMER_MODE_REL);
在检查hrtimer.c时,第4个初始化无效,因为如果在初始化时模式不是HRTIMER_MODE_ABS,则将clock_id设置回CLOCK_MONOTONIC。
if (clock_id == CLOCK_REALTIME && mode != HRTIMER_MODE_ABS)
clock_id = CLOCK_MONOTONIC;
因此,我们有3种可能的行为。现在我了解到CLOCK_REALTIME受系统时间的影响,因此可能是不连续的,而CLOCK_MONOTONIC则相反(即,它总是在向前滴答)。
以下是我对可能的行为的理解,但是它们似乎太相似了,我不确定该选择哪个。
1)hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
时钟是连续的,并且时间总是在绝对时间N之后过期。系统时间的变化不会影响时钟,因此不会影响到期时间。
2)hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
时钟是连续的,时间从现在起N个时间到期。系统时间的变化不会影响时钟,因此不会影响从“现在”开始的到期时间。
3)hrtimer_init(&timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
可以设置时钟,但是对系统时钟的任何更改仍然不会影响到期时间,因为将计时器设置为在绝对时间N到期。
我意识到我的解释可能是错误的,因为这些行为看起来都很相似。有人可以阐明这一点吗?