From f1f325f492ad45c2ec5ec23fc84406406a73c9de Mon Sep 17 00:00:00 2001 From: Bartek Szatkowski Date: Wed, 17 Aug 2016 14:41:06 +0100 Subject: [PATCH] RTOS: Add tickles sleep implementation (enabled for FRDM boards) It's enabled by default for all platforms defining DEVICE_SLEEP and DEVICE_LOWPOWERTIMER. --- rtos/rtos/rtos_idle.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/rtos/rtos/rtos_idle.c b/rtos/rtos/rtos_idle.c index 1edef6e35ab..611fcb1d8fc 100644 --- a/rtos/rtos/rtos_idle.c +++ b/rtos/rtos/rtos_idle.c @@ -22,13 +22,50 @@ #include "rtos_idle.h" +#if DEVICE_LOWPOWERTIMER && DEVICE_SLEEP +#include "ticker_api.h" +#include "critical.h" +#include "lp_ticker_api.h" +#include "cmsis_os.h" +#include "sleep_api.h" + +static ticker_event_t delay_event; +static volatile bool sleep_ended; +extern uint32_t os_clockrate; + +void sleep_handler(uint32_t id) +{ + sleep_ended = true; +} +#endif /* DEVICE_LOWPOWERTIMER && DEVICE_SLEEP */ + static void default_idle_hook(void) { +#if DEVICE_LOWPOWERTIMER && DEVICE_SLEEP + const ticker_data_t *lp_ticker_data = get_lp_ticker_data(); + uint32_t delay_ticks = os_suspend(); + uint32_t delay_us; + sleep_ended = false; + + ticker_set_handler(lp_ticker_data, sleep_handler); + + ticker_remove_event(lp_ticker_data, &delay_event); + delay_us = lp_ticker_read() + delay_ticks * os_clockrate; + ticker_insert_event(lp_ticker_data, &delay_event, delay_us, (uint32_t)&delay_event); + + while(!sleep_ended) { + sleep(); + } + + os_resume(delay_ticks); + +#else /* DEVICE_LOWPOWERTIMER && DEVICE_SLEEP */ /* Sleep: ideally, we should put the chip to sleep. Unfortunately, this usually requires disconnecting the interface chip (debugger). This can be done, but it would break the local file system. */ // sleep(); +#endif /* DEVICE_LOWPOWERTIMER && DEVICE_SLEEP */ } static void (*idle_hook_fptr)(void) = &default_idle_hook;