hrtimer - set timeout value to a range
2017-08-16 11:04
211 查看
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),就直接更新下次定时器到期时间,这样定时器就只会在下次到期时触发了。这样就保证了定时器在每次定时周期到期时只来一次。
修改如下:
这两个成员(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),就直接更新下次定时器到期时间,这样定时器就只会在下次到期时触发了。这样就保证了定时器在每次定时周期到期时只来一次。
修改如下:
相关文章推荐
- tomcatec出错-Web app root system property already set to different value
- How to set a badge value on a UITabBarController item
- Web app root system property already set to different value:
- 运行Liferay报错:Please set the environment variable ANT_OPTS to the recommended value of
- How to set the style in valuelist
- java.lang.IllegalStateException: Web app root system property already set to different value
- java.lang.IllegalStateException: Web app root system property already set to different value: 'webap
- java.lang.IllegalStateException:Web app root system property already set to different value 错误原因及解决
- How to correctly set application badge value in iOS 8?
- could not be set to a 'string' value. You must set this property to a non-null value of type
- -[__NSCFNumber rangeOfCharacterFromSet:]: unrecognized selector sent to inst
- -[__NSCFNumber rangeOfCharacterFromSet:]: unrecognized selector sent to instance
- How to set Selenium Python WebDriver default timeout?
- Using Interval Estimation to set prior value in Online Learning method
- DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value to i报错解决方法
- 20121128记录--Web app root system property already set to different value
- -[__NSCFNumber rangeOfCharacterFromSet:]: unrecognized selector sent to instance 0x7fa5216589d0
- tomcat启动多个应用logback初始化失败报Web app root system property already set to different value: 'webapp.root'
- Caller does not have enough privilege to set CallerOriginToken to the specified value
- file输入框不允许js设置值 Failed to set the 'value' property on 'HTMLInputElement