diff --git a/platforms/posix/src/px4/common/drv_hrt.cpp b/platforms/posix/src/px4/common/drv_hrt.cpp index 18157d0cfa..4cb2ec18ac 100644 --- a/platforms/posix/src/px4/common/drv_hrt.cpp +++ b/platforms/posix/src/px4/common/drv_hrt.cpp @@ -134,7 +134,10 @@ void hrt_store_absolute_time(volatile hrt_abstime *t) */ bool hrt_called(struct hrt_call *entry) { - return (entry->deadline == 0); + hrt_lock(); + bool result = (entry->deadline == 0); + hrt_unlock(); + return result; } /* @@ -416,12 +419,15 @@ hrt_call_invoke() call->deadline = 0; /* invoke the callout (if there is one) */ - if (call->callout) { + hrt_callout callout = call->callout; + void *arg = call->arg; + + if (callout) { // Unlock so we don't deadlock in callback hrt_unlock(); - //PX4_INFO("call %p: %p(%p)", call, call->callout, call->arg); - call->callout(call->arg); + //PX4_INFO("call %p: %p(%p)", call, callout, arg); + callout(arg); hrt_lock(); } diff --git a/src/drivers/drv_hrt.h b/src/drivers/drv_hrt.h index bb62da0189..f3acd70ce6 100644 --- a/src/drivers/drv_hrt.h +++ b/src/drivers/drv_hrt.h @@ -272,14 +272,14 @@ static inline uint16_t get_latency_bucket_count(void) { return LATENCY_BUCKET_CO static inline latency_info_t get_latency(uint16_t bucket_idx, uint16_t counter_idx) { - latency_info_t ret = {latency_buckets[bucket_idx], latency_counters[counter_idx]}; + latency_info_t ret = {latency_buckets[bucket_idx], __atomic_load_n(&latency_counters[counter_idx], __ATOMIC_RELAXED)}; return ret; } static inline void reset_latency_counters(void) { for (int i = 0; i <= get_latency_bucket_count(); i++) { - latency_counters[i] = 0; + __atomic_store_n(&latency_counters[i], 0, __ATOMIC_RELAXED); } }