Skip to content

Commit

Permalink
uORB: SubscriptionInterval fix timestamp wrapping when initializing l…
Browse files Browse the repository at this point in the history
…ess than the interval time after boot (PX4#23384)

* SubscriptionInterval: ensure _last_update is never before timer start
  • Loading branch information
MaEtUgR authored and vertiq-jordan committed Aug 21, 2024
1 parent 814e4ad commit 2439545
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions platforms/common/uORB/SubscriptionInterval.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,16 @@ class SubscriptionInterval
{
if (_subscription.copy(dst)) {
const hrt_abstime now = hrt_absolute_time();
// shift last update time forward, but don't let it get further behind than the interval
_last_update = math::constrain(_last_update + _interval_us, now - _interval_us, now);

// make sure we don't set a timestamp before the timer started counting (now - _interval_us would wrap because it's unsigned)
if (now > _interval_us) {
// shift last update time forward, but don't let it get further behind than the interval
_last_update = math::constrain(_last_update + _interval_us, now - _interval_us, now);

} else {
_last_update = now;
}

return true;
}

Expand Down Expand Up @@ -160,7 +168,7 @@ class SubscriptionInterval
protected:

Subscription _subscription;
uint64_t _last_update{0}; // last update in microseconds
uint64_t _last_update{0}; // last subscription update in microseconds
uint32_t _interval_us{0}; // maximum update interval in microseconds

};
Expand Down

0 comments on commit 2439545

Please sign in to comment.