diff --git a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/clock.hpp b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/clock.hpp index ebe934ff6d..aee1428f4c 100644 --- a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/clock.hpp +++ b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/clock.hpp @@ -59,6 +59,8 @@ class SystemClock : public uavcan::ISystemClock, uavcan::Noncopyable { SystemClock() { } + static SystemClock self; + virtual uavcan::MonotonicTime getMonotonic() const { return clock::getMonotonic(); } virtual uavcan::UtcTime getUtc() const { return clock::getUtc(); } virtual void adjustUtc(uavcan::UtcDuration adjustment) { clock::adjustUtc(adjustment); } diff --git a/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp b/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp index 570ed8767e..9b53f9789a 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp @@ -217,6 +217,8 @@ uavcan::uint32_t getUtcAjdustmentJumpCount() } // namespace clock +SystemClock SystemClock::self; + SystemClock& SystemClock::instance() { MutexLocker mlocker(clock::mutex); @@ -224,8 +226,7 @@ SystemClock& SystemClock::instance() { clock::init(); } - static SystemClock inst; - return inst; + return self; } } // namespace uavcan_stm32 diff --git a/libuavcan_drivers/stm32/test_stm32f107/src/main.cpp b/libuavcan_drivers/stm32/test_stm32f107/src/main.cpp index ae20071141..cd5c935f33 100644 --- a/libuavcan_drivers/stm32/test_stm32f107/src/main.cpp +++ b/libuavcan_drivers/stm32/test_stm32f107/src/main.cpp @@ -16,10 +16,15 @@ uavcan_stm32::CanInitHelper<> can; typedef uavcan::Node<4096> Node; +uavcan::LazyConstructor node_; + Node& getNode() { - static Node node(can.driver, uavcan_stm32::SystemClock::instance()); - return node; + if (!node_.isConstructed()) + { + node_.construct(can.driver, uavcan_stm32::SystemClock::instance()); + } + return *node_; } void ledSet(bool state)