PES4 / Mbed OS Queue_02
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1
demayer 0:6bf0743ece18 2 /** \addtogroup platform */
demayer 0:6bf0743ece18 3 /** @{*/
demayer 0:6bf0743ece18 4 /**
demayer 0:6bf0743ece18 5 * \defgroup platform_sleep Sleep functions
demayer 0:6bf0743ece18 6 * @{
demayer 0:6bf0743ece18 7 */
demayer 0:6bf0743ece18 8
demayer 0:6bf0743ece18 9 /* mbed Microcontroller Library
demayer 0:6bf0743ece18 10 * Copyright (c) 2006-2017 ARM Limited
demayer 0:6bf0743ece18 11 *
demayer 0:6bf0743ece18 12 * Licensed under the Apache License, Version 2.0 (the "License");
demayer 0:6bf0743ece18 13 * you may not use this file except in compliance with the License.
demayer 0:6bf0743ece18 14 * You may obtain a copy of the License at
demayer 0:6bf0743ece18 15 *
demayer 0:6bf0743ece18 16 * http://www.apache.org/licenses/LICENSE-2.0
demayer 0:6bf0743ece18 17 *
demayer 0:6bf0743ece18 18 * Unless required by applicable law or agreed to in writing, software
demayer 0:6bf0743ece18 19 * distributed under the License is distributed on an "AS IS" BASIS,
demayer 0:6bf0743ece18 20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
demayer 0:6bf0743ece18 21 * See the License for the specific language governing permissions and
demayer 0:6bf0743ece18 22 * limitations under the License.
demayer 0:6bf0743ece18 23 */
demayer 0:6bf0743ece18 24 #ifndef MBED_SLEEP_H
demayer 0:6bf0743ece18 25 #define MBED_SLEEP_H
demayer 0:6bf0743ece18 26
demayer 0:6bf0743ece18 27 #include "sleep_api.h"
demayer 0:6bf0743ece18 28 #include "mbed_toolchain.h"
demayer 0:6bf0743ece18 29 #include <stdbool.h>
demayer 0:6bf0743ece18 30
demayer 0:6bf0743ece18 31 #ifdef __cplusplus
demayer 0:6bf0743ece18 32 extern "C" {
demayer 0:6bf0743ece18 33 #endif
demayer 0:6bf0743ece18 34
demayer 0:6bf0743ece18 35 /** Sleep manager API
demayer 0:6bf0743ece18 36 * The sleep manager provides API to automatically select sleep mode.
demayer 0:6bf0743ece18 37 *
demayer 0:6bf0743ece18 38 * There are two sleep modes:
demayer 0:6bf0743ece18 39 * - sleep
demayer 0:6bf0743ece18 40 * - deepsleep
demayer 0:6bf0743ece18 41 *
demayer 0:6bf0743ece18 42 * Use locking/unlocking deepsleep for drivers that depend on features that
demayer 0:6bf0743ece18 43 * are not allowed (=disabled) during the deepsleep. For instance, high frequency
demayer 0:6bf0743ece18 44 * clocks.
demayer 0:6bf0743ece18 45 *
demayer 0:6bf0743ece18 46 * Example:
demayer 0:6bf0743ece18 47 * @code
demayer 0:6bf0743ece18 48 *
demayer 0:6bf0743ece18 49 * void driver::handler()
demayer 0:6bf0743ece18 50 * {
demayer 0:6bf0743ece18 51 * if (_sensor.get_event()) {
demayer 0:6bf0743ece18 52 * // any event - we are finished, unlock the deepsleep
demayer 0:6bf0743ece18 53 * sleep_manager_unlock_deep_sleep();
demayer 0:6bf0743ece18 54 * _callback();
demayer 0:6bf0743ece18 55 * }
demayer 0:6bf0743ece18 56 * }
demayer 0:6bf0743ece18 57 *
demayer 0:6bf0743ece18 58 * int driver::measure(event_t event, callback_t& callback)
demayer 0:6bf0743ece18 59 * {
demayer 0:6bf0743ece18 60 * _callback = callback;
demayer 0:6bf0743ece18 61 * sleep_manager_lock_deep_sleep();
demayer 0:6bf0743ece18 62 * // start async transaction, we are waiting for an event
demayer 0:6bf0743ece18 63 * return _sensor.start(event, callback);
demayer 0:6bf0743ece18 64 * }
demayer 0:6bf0743ece18 65 * @endcode
demayer 0:6bf0743ece18 66 */
demayer 0:6bf0743ece18 67
demayer 0:6bf0743ece18 68 /** Lock the deep sleep mode
demayer 0:6bf0743ece18 69 *
demayer 0:6bf0743ece18 70 * This locks the automatic deep mode selection.
demayer 0:6bf0743ece18 71 * sleep_manager_sleep_auto() will ignore deepsleep mode if
demayer 0:6bf0743ece18 72 * this function is invoked at least once (the internal counter is non-zero)
demayer 0:6bf0743ece18 73 *
demayer 0:6bf0743ece18 74 * Use this locking mechanism for interrupt driven API that are
demayer 0:6bf0743ece18 75 * running in the background and deepsleep could affect their functionality
demayer 0:6bf0743ece18 76 *
demayer 0:6bf0743ece18 77 * The lock is a counter, can be locked up to USHRT_MAX
demayer 0:6bf0743ece18 78 * This function is IRQ and thread safe
demayer 0:6bf0743ece18 79 */
demayer 0:6bf0743ece18 80 void sleep_manager_lock_deep_sleep(void);
demayer 0:6bf0743ece18 81
demayer 0:6bf0743ece18 82 /** Unlock the deep sleep mode
demayer 0:6bf0743ece18 83 *
demayer 0:6bf0743ece18 84 * Use unlocking in pair with sleep_manager_lock_deep_sleep().
demayer 0:6bf0743ece18 85 *
demayer 0:6bf0743ece18 86 * The lock is a counter, should be equally unlocked as locked
demayer 0:6bf0743ece18 87 * This function is IRQ and thread safe
demayer 0:6bf0743ece18 88 */
demayer 0:6bf0743ece18 89 void sleep_manager_unlock_deep_sleep(void);
demayer 0:6bf0743ece18 90
demayer 0:6bf0743ece18 91 /** Get the status of deep sleep allowance for a target
demayer 0:6bf0743ece18 92 *
demayer 0:6bf0743ece18 93 * @return true if a target can go to deepsleep, false otherwise
demayer 0:6bf0743ece18 94 */
demayer 0:6bf0743ece18 95 bool sleep_manager_can_deep_sleep(void);
demayer 0:6bf0743ece18 96
demayer 0:6bf0743ece18 97 /** Enter auto selected sleep mode. It chooses the sleep or deeepsleep modes based
demayer 0:6bf0743ece18 98 * on the deepsleep locking counter
demayer 0:6bf0743ece18 99 *
demayer 0:6bf0743ece18 100 * This function is IRQ and thread safe
demayer 0:6bf0743ece18 101 *
demayer 0:6bf0743ece18 102 * @note
demayer 0:6bf0743ece18 103 * If MBED_DEBUG is defined, only hal_sleep is allowed. This ensures the debugger
demayer 0:6bf0743ece18 104 * to be active for debug modes.
demayer 0:6bf0743ece18 105 *
demayer 0:6bf0743ece18 106 */
demayer 0:6bf0743ece18 107 void sleep_manager_sleep_auto(void);
demayer 0:6bf0743ece18 108
demayer 0:6bf0743ece18 109 /** Send the microcontroller to sleep
demayer 0:6bf0743ece18 110 *
demayer 0:6bf0743ece18 111 * @note This function can be a noop if not implemented by the platform.
demayer 0:6bf0743ece18 112 * @note This function will be a noop in debug mode (debug build profile when MBED_DEBUG is defined).
demayer 0:6bf0743ece18 113 * @note This function will be a noop while uVisor is in use.
demayer 0:6bf0743ece18 114 * @note This function will be a noop if the following conditions are met:
demayer 0:6bf0743ece18 115 * - The RTOS is present
demayer 0:6bf0743ece18 116 * - The processor turn off the Systick clock during sleep
demayer 0:6bf0743ece18 117 * - The target does not implement tickless mode
demayer 0:6bf0743ece18 118 *
demayer 0:6bf0743ece18 119 * The processor is setup ready for sleep, and sent to sleep using __WFI(). In this mode, the
demayer 0:6bf0743ece18 120 * system clock to the core is stopped until a reset or an interrupt occurs. This eliminates
demayer 0:6bf0743ece18 121 * dynamic power used by the processor, memory systems and buses. The processor, peripheral and
demayer 0:6bf0743ece18 122 * memory state are maintained, and the peripherals continue to work and can generate interrupts.
demayer 0:6bf0743ece18 123 *
demayer 0:6bf0743ece18 124 * The processor can be woken up by any internal peripheral interrupt or external pin interrupt.
demayer 0:6bf0743ece18 125 *
demayer 0:6bf0743ece18 126 * @note
demayer 0:6bf0743ece18 127 * The mbed interface semihosting is disconnected as part of going to sleep, and can not be restored.
demayer 0:6bf0743ece18 128 * Flash re-programming and the USB serial port will remain active, but the mbed program will no longer be
demayer 0:6bf0743ece18 129 * able to access the LocalFileSystem
demayer 0:6bf0743ece18 130 */
demayer 0:6bf0743ece18 131 __INLINE static void sleep(void)
demayer 0:6bf0743ece18 132 {
demayer 0:6bf0743ece18 133 #if !(defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED))
demayer 0:6bf0743ece18 134 #if DEVICE_SLEEP
demayer 0:6bf0743ece18 135 #if (MBED_CONF_RTOS_PRESENT == 0) || (DEVICE_STCLK_OFF_DURING_SLEEP == 0) || defined(MBED_TICKLESS)
demayer 0:6bf0743ece18 136 sleep_manager_sleep_auto();
demayer 0:6bf0743ece18 137 #endif /* (MBED_CONF_RTOS_PRESENT == 0) || (DEVICE_STCLK_OFF_DURING_SLEEP == 0) || defined(MBED_TICKLESS) */
demayer 0:6bf0743ece18 138 #endif /* DEVICE_SLEEP */
demayer 0:6bf0743ece18 139 #endif /* !(defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED)) */
demayer 0:6bf0743ece18 140 }
demayer 0:6bf0743ece18 141
demayer 0:6bf0743ece18 142 /** Send the microcontroller to deep sleep
demayer 0:6bf0743ece18 143 *
demayer 0:6bf0743ece18 144 * @note This function can be a noop if not implemented by the platform.
demayer 0:6bf0743ece18 145 * @note This function will be a noop in debug mode (debug build profile when MBED_DEBUG is defined)
demayer 0:6bf0743ece18 146 * @note This function will be a noop while uVisor is in use.
demayer 0:6bf0743ece18 147 *
demayer 0:6bf0743ece18 148 * This processor is setup ready for deep sleep, and sent to sleep. This mode
demayer 0:6bf0743ece18 149 * has the same sleep features as sleep plus it powers down peripherals and clocks. All state
demayer 0:6bf0743ece18 150 * is still maintained.
demayer 0:6bf0743ece18 151 *
demayer 0:6bf0743ece18 152 * The processor can only be woken up by an external interrupt on a pin or a watchdog timer.
demayer 0:6bf0743ece18 153 *
demayer 0:6bf0743ece18 154 * @note
demayer 0:6bf0743ece18 155 * The mbed interface semihosting is disconnected as part of going to sleep, and can not be restored.
demayer 0:6bf0743ece18 156 * Flash re-programming and the USB serial port will remain active, but the mbed program will no longer be
demayer 0:6bf0743ece18 157 * able to access the LocalFileSystem
demayer 0:6bf0743ece18 158 */
demayer 0:6bf0743ece18 159
demayer 0:6bf0743ece18 160 MBED_DEPRECATED_SINCE("mbed-os-5.6", "One entry point for an application, use sleep()")
demayer 0:6bf0743ece18 161 __INLINE static void deepsleep(void)
demayer 0:6bf0743ece18 162 {
demayer 0:6bf0743ece18 163 #if !(defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED))
demayer 0:6bf0743ece18 164 #if DEVICE_SLEEP
demayer 0:6bf0743ece18 165 sleep_manager_sleep_auto();
demayer 0:6bf0743ece18 166 #endif /* DEVICE_SLEEP */
demayer 0:6bf0743ece18 167 #endif /* !(defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED)) */
demayer 0:6bf0743ece18 168 }
demayer 0:6bf0743ece18 169
demayer 0:6bf0743ece18 170 #ifdef __cplusplus
demayer 0:6bf0743ece18 171 }
demayer 0:6bf0743ece18 172 #endif
demayer 0:6bf0743ece18 173
demayer 0:6bf0743ece18 174 #endif
demayer 0:6bf0743ece18 175
demayer 0:6bf0743ece18 176 /** @}*/
demayer 0:6bf0743ece18 177 /** @}*/