From 01328da9ebdebb3ba2e11fea5d2192f6a09a7413 Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Thu, 10 Apr 2014 21:23:57 +0400 Subject: [PATCH] STM32 driver: Space optimized SystemClock constructor --- .../stm32/driver/include/uavcan_stm32/clock.hpp | 2 -- .../stm32/driver/src/uc_stm32_clock.cpp | 14 +++++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/clock.hpp b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/clock.hpp index aee1428f4c..ebe934ff6d 100644 --- a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/clock.hpp +++ b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/clock.hpp @@ -59,8 +59,6 @@ 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 9b53f9789a..1efd057a54 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp @@ -217,16 +217,24 @@ uavcan::uint32_t getUtcAjdustmentJumpCount() } // namespace clock -SystemClock SystemClock::self; - SystemClock& SystemClock::instance() { MutexLocker mlocker(clock::mutex); + + static union SystemClockStorage + { + uavcan::uint8_t buffer[sizeof(SystemClock)]; + long long _aligner_1; + long double _aligner_2; + } storage; + SystemClock* const ptr = reinterpret_cast(storage.buffer); + if (!clock::initialized) { clock::init(); + new (ptr) SystemClock(); } - return self; + return *ptr; } } // namespace uavcan_stm32