diff --git a/rtos/TARGET_CORTEX/mbed_rtx_idle.cpp b/rtos/TARGET_CORTEX/mbed_rtx_idle.cpp index 58348b97d3f..3e0ae8f7103 100644 --- a/rtos/TARGET_CORTEX/mbed_rtx_idle.cpp +++ b/rtos/TARGET_CORTEX/mbed_rtx_idle.cpp @@ -93,6 +93,13 @@ uint32_t OS_Tick_GetInterval(void) static void default_idle_hook(void) { uint32_t ticks_to_sleep = osKernelSuspend(); + const bool block_deep_sleep = ticks_to_sleep <= MBED_CONF_TARGET_DEEP_SLEEP_LATENCY; + + if (block_deep_sleep) { + sleep_manager_lock_deep_sleep(); + } else { + ticks_to_sleep -= MBED_CONF_TARGET_DEEP_SLEEP_LATENCY; + } os_timer->suspend(ticks_to_sleep); bool event_pending = false; @@ -109,6 +116,11 @@ static void default_idle_hook(void) // Ensure interrupts get a chance to fire __ISB(); } + + if (block_deep_sleep) { + sleep_manager_unlock_deep_sleep(); + } + osKernelResume(os_timer->resume()); } diff --git a/targets/targets.json b/targets/targets.json index 6c9ed0a433c..086957ecf8e 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -21,6 +21,10 @@ "help": "Default network interface type. Typical options: null, ETHERNET, WIFI, CELLULAR, MESH", "value": null }, + "deep-sleep-latency": { + "help": "Time in ms required to go to and wake up from deep sleep (max 10)", + "value": 0 + }, "boot-stack-size": { "help": "Define the boot stack size in bytes. This value must be a multiple of 8", "value": "0x1000"