diff --git a/TESTS/mbed_drivers/lp_timeout/main.cpp b/TESTS/mbed_drivers/lp_timeout/main.cpp index 3641275b416..f3b5b63c6b7 100644 --- a/TESTS/mbed_drivers/lp_timeout/main.cpp +++ b/TESTS/mbed_drivers/lp_timeout/main.cpp @@ -72,11 +72,13 @@ void lp_timeout_1s_sleep(void) { complete = false; + sleep_manager_lock_deep_sleep(); timestamp_t start = us_ticker_read(); lpt.attach(&cb_done, 1); sleep(); while (!complete); timestamp_t end = us_ticker_read(); + sleep_manager_unlock_deep_sleep(); TEST_ASSERT_UINT32_WITHIN(LONG_TIMEOUT, 1000000, end - start); TEST_ASSERT_TRUE(complete); diff --git a/TESTS/mbed_drivers/timeout/main.cpp b/TESTS/mbed_drivers/timeout/main.cpp index 58de0fd6ec7..851b947020c 100644 --- a/TESTS/mbed_drivers/timeout/main.cpp +++ b/TESTS/mbed_drivers/timeout/main.cpp @@ -36,7 +36,7 @@ using namespace utest::v1; -#define ONE_MILLI_SEC 1000 +#define PERIOD_US 10000 volatile int ticker_count = 0; volatile uint32_t callback_trigger_count = 0; @@ -44,7 +44,7 @@ static const int test_timeout = 240; Timeout timeout; void set_incremeant_count() { - timeout.attach_us(set_incremeant_count, ONE_MILLI_SEC); + timeout.attach_us(set_incremeant_count, PERIOD_US); ++callback_trigger_count; } @@ -56,7 +56,7 @@ void test_case_timeout() { uint8_t results_size = 0; greentea_send_kv("timing_drift_check_start", 0); - timeout.attach_us(set_incremeant_count, ONE_MILLI_SEC); + timeout.attach_us(set_incremeant_count, PERIOD_US); // wait for 1st signal from host do { @@ -64,11 +64,11 @@ void test_case_timeout() { expected_key = strcmp(_key, "base_time"); } while (expected_key); - greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC); + greentea_send_kv(_key, callback_trigger_count * PERIOD_US); // wait for 2nd signal from host greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value)); - greentea_send_kv(_key, callback_trigger_count * ONE_MILLI_SEC); + greentea_send_kv(_key, callback_trigger_count * PERIOD_US); //get the results from host greentea_parse_kv(_key, _value, sizeof(_key), sizeof(_value)); diff --git a/TESTS/mbed_hal/lp_ticker/main.cpp b/TESTS/mbed_hal/lp_ticker/main.cpp index a63ebd5962f..05d497fa937 100644 --- a/TESTS/mbed_hal/lp_ticker/main.cpp +++ b/TESTS/mbed_hal/lp_ticker/main.cpp @@ -25,6 +25,7 @@ #include "mbed.h" #include "us_ticker_api.h" #include "lp_ticker_api.h" +#include "TimerEvent.h" using namespace utest::v1; @@ -39,13 +40,23 @@ static const ticker_data_t *lp_ticker_data = get_lp_ticker_data(); #define SHORT_TIMEOUT (600) void cb_done(uint32_t id) { - complete_timestamp = us_ticker_read(); - complete = true; + if ((uint32_t)&delay_event == id) { + complete_timestamp = us_ticker_read(); + complete = true; + } else { + // Normal ticker handling + TimerEvent::irq(id); + } } void cb_done_deepsleep(uint32_t id) { - complete_timestamp = lp_ticker_read(); - complete = true; + if ((uint32_t)&delay_event == id) { + complete_timestamp = lp_ticker_read(); + complete = true; + } else { + // Normal ticker handling + TimerEvent::irq(id); + } } void lp_ticker_delay_us(uint32_t delay_us, uint32_t tolerance) @@ -109,11 +120,13 @@ void lp_ticker_1s_sleep() ticker_remove_event(lp_ticker_data, &delay_event); delay_ts = lp_ticker_read() + 1000000; + sleep_manager_lock_deep_sleep(); timestamp_t start = us_ticker_read(); ticker_insert_event(lp_ticker_data, &delay_event, delay_ts, (uint32_t)&delay_event); sleep(); while (!complete); timestamp_t end = complete_timestamp; + sleep_manager_unlock_deep_sleep(); TEST_ASSERT_UINT32_WITHIN(LONG_TIMEOUT, 1000000, end - start); TEST_ASSERT_TRUE(complete); diff --git a/TESTS/mbed_hal/sleep_manager_racecondition/main.cpp b/TESTS/mbed_hal/sleep_manager_racecondition/main.cpp index a886129aa4b..fd5b88141f6 100644 --- a/TESTS/mbed_hal/sleep_manager_racecondition/main.cpp +++ b/TESTS/mbed_hal/sleep_manager_racecondition/main.cpp @@ -24,6 +24,8 @@ using namespace utest::v1; +#define TEST_STACK_SIZE 256 + void sleep_manager_locking_thread_test() { for (uint32_t i = 0; i < 100; i++) { @@ -37,8 +39,8 @@ void sleep_manager_multithread_test() { { Callback cb(sleep_manager_locking_thread_test); - Thread t1; - Thread t2; + Thread t1(osPriorityNormal, TEST_STACK_SIZE); + Thread t2(osPriorityNormal, TEST_STACK_SIZE); t1.start(callback(cb)); Thread::wait(25); diff --git a/drivers/Ticker.cpp b/drivers/Ticker.cpp index 8c66f0b4904..35c2ee43dd3 100644 --- a/drivers/Ticker.cpp +++ b/drivers/Ticker.cpp @@ -43,7 +43,9 @@ void Ticker::setup(us_timestamp_t t) { void Ticker::handler() { insert_absolute(event.timestamp + _delay); - _function(); + if (_function) { + _function(); + } } } // namespace mbed diff --git a/targets/TARGET_ONSEMI/TARGET_NCS36510/sleep.c b/targets/TARGET_ONSEMI/TARGET_NCS36510/sleep.c index a05f701260b..31c9a5f720c 100644 --- a/targets/TARGET_ONSEMI/TARGET_NCS36510/sleep.c +++ b/targets/TARGET_ONSEMI/TARGET_NCS36510/sleep.c @@ -64,6 +64,8 @@ void fncs36510_deepsleep(void) /** Enter into deep sleep mode */ __ISB(); __WFI(); + __NOP(); + __NOP(); /** Wait for the external 32MHz to be power-ed up & running * Re-power down the 32MHz internal osc @@ -115,4 +117,4 @@ void fncs36510_coma(void) fMacRestoreFrameStoreLUT(MAC_LUT_BackUp); */ } -#endif /* DEVICE_SLEEP */ \ No newline at end of file +#endif /* DEVICE_SLEEP */ diff --git a/targets/targets.json b/targets/targets.json index 3979868bbf2..452e29db014 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -3195,7 +3195,7 @@ }, "OUTPUT_EXT": "hex", "post_binary_hook": {"function": "NCS36510TargetCode.ncs36510_addfib"}, - "macros": ["CM3", "CPU_NCS36510", "TARGET_NCS36510", "LOAD_ADDRESS=0x3000", "MBED_TICKLESS"], + "macros": ["CM3", "CPU_NCS36510", "TARGET_NCS36510", "LOAD_ADDRESS=0x3000"], "supported_toolchains": ["GCC_ARM", "ARM", "IAR"], "device_has": ["ANALOGIN", "SERIAL", "I2C", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "LOWPOWERTIMER", "TRNG", "SPISLAVE"], "release_versions": ["2", "5"]