uORB: SubscriptionInterval fix timestamp wrapping when initializing less than the interval time after boot (#23384)

* SubscriptionInterval: ensure _last_update is never before timer start
This commit is contained in:
Matthias Grob 2024-07-10 18:43:31 +02:00 committed by GitHub
parent 75bb339d94
commit 2c3401dc83
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -125,8 +125,16 @@ public:
{
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;
}
@ -160,7 +168,7 @@ public:
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
};