From 24395455453b40a09109615af38ced98edb3c427 Mon Sep 17 00:00:00 2001 From: Matthias Grob Date: Wed, 10 Jul 2024 18:43:31 +0200 Subject: [PATCH] uORB: SubscriptionInterval fix timestamp wrapping when initializing less than the interval time after boot (#23384) * SubscriptionInterval: ensure _last_update is never before timer start --- platforms/common/uORB/SubscriptionInterval.hpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/platforms/common/uORB/SubscriptionInterval.hpp b/platforms/common/uORB/SubscriptionInterval.hpp index 31d1b0a7af12..07572f72f218 100644 --- a/platforms/common/uORB/SubscriptionInterval.hpp +++ b/platforms/common/uORB/SubscriptionInterval.hpp @@ -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; } @@ -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 };