diff --git a/features/frameworks/utest/source/utest_shim.cpp b/features/frameworks/utest/source/utest_shim.cpp index a3993dcd37..6b5ab7596a 100644 --- a/features/frameworks/utest/source/utest_shim.cpp +++ b/features/frameworks/utest/source/utest_shim.cpp @@ -66,10 +66,7 @@ static volatile utest_v1_harness_callback_t minimal_callback; static volatile utest_v1_harness_callback_t ticker_callback; // Timeout object used to control the scheduling of test case callbacks -static Timeout& utest_timeout_object() { - static Timeout timeout; - return timeout; -} +SingletonPtr utest_timeout_object; static void ticker_handler() { @@ -80,7 +77,9 @@ static void ticker_handler() static int32_t utest_us_ticker_init() { UTEST_LOG_FUNCTION(); - // Ticker scheduler does not require any initialisation so return immediately + // initialize the Timeout object to makes sure it is not initialized in + // interrupt context. + utest_timeout_object.get(); return 0; } static void *utest_us_ticker_post(const utest_v1_harness_callback_t callback, timestamp_t delay_ms) @@ -91,7 +90,7 @@ static void *utest_us_ticker_post(const utest_v1_harness_callback_t callback, ti if (delay_ms) { ticker_callback = callback; // fire the interrupt in 1000us * delay_ms - utest_timeout_object().attach_us(ticker_handler, delay_us); + utest_timeout_object->attach_us(ticker_handler, delay_us); } else { @@ -105,7 +104,7 @@ static int32_t utest_us_ticker_cancel(void *handle) { UTEST_LOG_FUNCTION(); (void) handle; - utest_timeout_object().detach(); + utest_timeout_object->detach(); return 0; } static int32_t utest_us_ticker_run()