From bc0a40d611ccde8e7362bebce0a2ef56f50d271b Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sun, 14 Aug 2016 20:36:05 -0500 Subject: [PATCH] Moved away from global constructors in mbed implementation - Adopted placement-new with word-buffers for global classes - Better structured initialization of global state --- equeue_mbed.cpp | 53 ++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/equeue_mbed.cpp b/equeue_mbed.cpp index 70654bf..8ad18dd 100644 --- a/equeue_mbed.cpp +++ b/equeue_mbed.cpp @@ -16,38 +16,37 @@ // Ticker operations -class EqueueTicker { -public: - EqueueTicker() { - _tick = 0; - _timer.start(); - _ticker.attach_us(this, &EqueueTicker::update, (1 << 16) * 1000); - }; - - void update() { - _timer.reset(); - _tick += 1 << 16; - } +static bool equeue_tick_inited = false; +static unsigned equeue_timer[(sizeof(Timer)+1) / sizeof(unsigned)]; +static unsigned equeue_ticker[(sizeof(Ticker)+1) / sizeof(unsigned)]; +static unsigned equeue_minutes = 0; + +static void equeue_tick_update() { + reinterpret_cast(equeue_timer)->reset(); + equeue_minutes += 1; +} - unsigned tick() { - return _tick + (unsigned)_timer.read_ms(); - } +static void equeue_tick_init() { + MBED_ASSERT(sizeof(equeue_timer) >= sizeof(Timer)); + MBED_ASSERT(sizeof(equeue_ticker) >= sizeof(Ticker)); + new (equeue_timer) Timer; + new (equeue_ticker) Ticker; -private: - unsigned _tick; -#ifdef DEVICE_LOWPOWERTIMER - LowPowerTimer _timer; - LowPowerTicker _ticker; -#else - Timer _timer; - Ticker _ticker; -#endif -}; + equeue_minutes = 0; + reinterpret_cast(equeue_timer)->start(); + reinterpret_cast(equeue_ticker) + ->attach_us(equeue_tick_update, (1 << 16)*1000); -static EqueueTicker equeue_ticker; + equeue_tick_inited = true; +} unsigned equeue_tick() { - return equeue_ticker.tick(); + if (!equeue_tick_inited) { + equeue_tick_init(); + } + + unsigned equeue_ms = reinterpret_cast(equeue_timer)->read_ms(); + return (equeue_minutes << 16) + equeue_ms; }