hrtimer

来源:互联网 发布:婚纱照排版台词 知乎 编辑:程序博客网 时间:2024/06/01 08:16
hrtimer

这两个成员(hrtimer.node.expires, hrtimer._softexpires)通常是相等(即hrtimer到期时间是未来的一个时间点,即hrtimer_start_range_ns的delta_ns参数为0),但是有些时候,用户希望到期时间是一个区间的时候,而不是一点的时候,这两个成员就不相等了,_softexpires成员保存的是这个区间的开始时间,expires成员保存的是这个区间的结束时间。

CODE EXAMPLE:
1,创建hrtimer,设置callback


2,设置hrtimer第一次超时时间值(或超时时间range,即hrtimer_start_range_ns的delta_ns参数不为0),然后就触发timer,下面的设置超时是一个range,原因是"ensure that any interval is >= 50us so we don't get stuck in IRQ"

可以参考上面本人加的代码的注释

3, callback函数(这里是emtimer_hrtimer)中, 会重新设置超时时间(可以与第一次hrtimer_start_range_ns设置的超时时间不一样),注意新设置的超时仍然是一个range,即[_softexpires, node.expires],在hrtimer_add_expires中实现
hrtimer_forward_now->hrtimer_forward->hrtimer_add_expires(timer, t->period):

timer->node.expires = timer->_softexpires +timeout_value //timeout_value就是上述t->period
timer->_softexpires = timer->_softexpires + timeout_value
我们可知, _softexpires,node.expires的值是往前推进的(即下一次超时的range),且始终node.expires与_softexpires相差第一次设置timer时hrtimer_start_range_ns的参数delta_ns, 即node.expires-_softexpires=delta_ns.
因为_softexpires,node.expires的值都是在上次的值基础上计算的。

4,下面看一下hrtimer_forward_now的返回值的意义,即是hrtimer_forward的返回值。


在hrtimer_forward函数中,如果当前时间比定时器到期时间要早(即定时器来早了,调用定时器callback函数也就早了,即定时器到来的时间落在了上述代码所配的range范围之前),不会进行任何操作, 直接返回0(即hrtimer_forward_now的返回值overruns=0),这样就不会执行下面的hrtimer_add_expires函数来更新下次定时器到期时间(区间),这样的话在本次定时器真正到期时,又会触发一次调用上述定时器callback函数(emtimer_hrtimer), 这样的话,本次定时周期内来了两次定时到期通知(调用callback函数),这样就破坏了定时器每周期产生一次到期的预期。 改进方案是在callback函数emtimer_hrtimer中判断如果定时器来的早了(overruns=0),就直接更新下次定时器到期时间,这样定时器就只会在下次到期时触发了。这样就保证了定时器在每次定时周期到期时只来一次。
修改如下:

原创粉丝点击