Fix issues with LowPowerTickerWrapper

1. Complement _ticker_match_interval_passed with '_last_set_interrupt == _cur_match_time' for pass check
2. Fix 'too close' check with _min_count_until_match
pull/8029/head
ccli8 2018-08-21 17:15:19 +08:00
parent 48c149b227
commit 5b90b4ca97
1 changed files with 12 additions and 3 deletions

View File

@ -207,7 +207,14 @@ void LowPowerTickerWrapper::_timeout_handler()
_pending_timeout = false;
timestamp_t current = _intf->read();
if (_ticker_match_interval_passed(_last_set_interrupt, current, _cur_match_time)) {
/* Add extra check for '_last_set_interrupt == _cur_match_time'
*
* When '_last_set_interrupt == _cur_match_time', _ticker_match_interval_passed sees it as
* one-round interval rather than just-pass, so add extra check for it. In rare cases, we
* may trap in _timeout_handler/_schedule_match loop. This check can break it.
*/
if ((_last_set_interrupt == _cur_match_time) ||
_ticker_match_interval_passed(_last_set_interrupt, current, _cur_match_time)) {
_intf->fire_interrupt();
} else {
_schedule_match(current);
@ -223,7 +230,9 @@ bool LowPowerTickerWrapper::_match_check(timestamp_t current)
if (!_pending_match) {
return false;
}
return _ticker_match_interval_passed(_last_set_interrupt, current, _cur_match_time);
/* Add extra check for '_last_set_interrupt == _cur_match_time' as above */
return (_last_set_interrupt == _cur_match_time) ||
_ticker_match_interval_passed(_last_set_interrupt, current, _cur_match_time);
}
uint32_t LowPowerTickerWrapper::_lp_ticks_to_us(uint32_t ticks)
@ -245,7 +254,7 @@ void LowPowerTickerWrapper::_schedule_match(timestamp_t current)
}
}
uint32_t cycles_until_match = (_cur_match_time - _last_set_interrupt) & _mask;
uint32_t cycles_until_match = (_cur_match_time - current) & _mask;
bool too_close = cycles_until_match < _min_count_until_match;
if (!_set_interrupt_allowed) {