mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
186:707f6e361f3e
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 174:b96e65c34a4d 1 /* mbed Microcontroller Library
AnnaBridge 174:b96e65c34a4d 2 * Copyright (c) 2017 ARM Limited
AnnaBridge 189:f392fc9709a3 3 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 174:b96e65c34a4d 4 *
AnnaBridge 174:b96e65c34a4d 5 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 174:b96e65c34a4d 6 * you may not use this file except in compliance with the License.
AnnaBridge 174:b96e65c34a4d 7 * You may obtain a copy of the License at
AnnaBridge 174:b96e65c34a4d 8 *
AnnaBridge 174:b96e65c34a4d 9 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 174:b96e65c34a4d 10 *
AnnaBridge 174:b96e65c34a4d 11 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 174:b96e65c34a4d 12 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 174:b96e65c34a4d 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 174:b96e65c34a4d 14 * See the License for the specific language governing permissions and
AnnaBridge 174:b96e65c34a4d 15 * limitations under the License.
AnnaBridge 174:b96e65c34a4d 16 */
AnnaBridge 174:b96e65c34a4d 17 #ifndef MBED_DEEPSLEEPLOCK_H
AnnaBridge 174:b96e65c34a4d 18 #define MBED_DEEPSLEEPLOCK_H
AnnaBridge 174:b96e65c34a4d 19
AnnaBridge 175:af195413fb11 20 #include <limits.h>
AnnaBridge 184:08ed48f1de7f 21 #include "platform/mbed_power_mgmt.h"
AnnaBridge 175:af195413fb11 22 #include "platform/mbed_critical.h"
AnnaBridge 174:b96e65c34a4d 23
AnnaBridge 174:b96e65c34a4d 24 namespace mbed {
AnnaBridge 174:b96e65c34a4d 25
AnnaBridge 178:79309dc6340a 26 /** \addtogroup platform */
AnnaBridge 178:79309dc6340a 27 /** @{*/
AnnaBridge 178:79309dc6340a 28 /**
AnnaBridge 178:79309dc6340a 29 * \defgroup platform_DeepSleepLock DeepSleepLock functions
AnnaBridge 178:79309dc6340a 30 * @{
AnnaBridge 178:79309dc6340a 31 */
AnnaBridge 174:b96e65c34a4d 32
AnnaBridge 174:b96e65c34a4d 33 /** RAII object for disabling, then restoring the deep sleep mode
AnnaBridge 174:b96e65c34a4d 34 * Usage:
AnnaBridge 174:b96e65c34a4d 35 * @code
AnnaBridge 174:b96e65c34a4d 36 *
AnnaBridge 174:b96e65c34a4d 37 * void f() {
AnnaBridge 174:b96e65c34a4d 38 * // some code here
AnnaBridge 174:b96e65c34a4d 39 * {
AnnaBridge 174:b96e65c34a4d 40 * DeepSleepLock lock;
AnnaBridge 174:b96e65c34a4d 41 * // Code in this block will run with the deep sleep mode locked
AnnaBridge 174:b96e65c34a4d 42 * }
AnnaBridge 174:b96e65c34a4d 43 * // deep sleep mode will be restored to their previous state
AnnaBridge 174:b96e65c34a4d 44 * }
AnnaBridge 174:b96e65c34a4d 45 * @endcode
AnnaBridge 174:b96e65c34a4d 46 */
AnnaBridge 174:b96e65c34a4d 47 class DeepSleepLock {
AnnaBridge 175:af195413fb11 48 private:
AnnaBridge 175:af195413fb11 49 uint16_t _lock_count;
AnnaBridge 175:af195413fb11 50
AnnaBridge 174:b96e65c34a4d 51 public:
AnnaBridge 175:af195413fb11 52 DeepSleepLock(): _lock_count(1)
AnnaBridge 174:b96e65c34a4d 53 {
AnnaBridge 174:b96e65c34a4d 54 sleep_manager_lock_deep_sleep();
AnnaBridge 174:b96e65c34a4d 55 }
AnnaBridge 174:b96e65c34a4d 56
AnnaBridge 174:b96e65c34a4d 57 ~DeepSleepLock()
AnnaBridge 174:b96e65c34a4d 58 {
AnnaBridge 175:af195413fb11 59 if (_lock_count) {
AnnaBridge 175:af195413fb11 60 sleep_manager_unlock_deep_sleep();
AnnaBridge 175:af195413fb11 61 }
AnnaBridge 174:b96e65c34a4d 62 }
AnnaBridge 174:b96e65c34a4d 63
AnnaBridge 174:b96e65c34a4d 64 /** Mark the start of a locked deep sleep section
AnnaBridge 174:b96e65c34a4d 65 */
AnnaBridge 174:b96e65c34a4d 66 void lock()
AnnaBridge 174:b96e65c34a4d 67 {
AnnaBridge 175:af195413fb11 68 uint16_t count = core_util_atomic_incr_u16(&_lock_count, 1);
AnnaBridge 175:af195413fb11 69 if (1 == count) {
AnnaBridge 175:af195413fb11 70 sleep_manager_lock_deep_sleep();
AnnaBridge 175:af195413fb11 71 }
AnnaBridge 175:af195413fb11 72 if (0 == count) {
Anna Bridge 186:707f6e361f3e 73 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_OVERFLOW), "DeepSleepLock overflow (> USHRT_MAX)", count);
AnnaBridge 175:af195413fb11 74 }
AnnaBridge 174:b96e65c34a4d 75 }
AnnaBridge 174:b96e65c34a4d 76
AnnaBridge 174:b96e65c34a4d 77 /** Mark the end of a locked deep sleep section
AnnaBridge 174:b96e65c34a4d 78 */
AnnaBridge 174:b96e65c34a4d 79 void unlock()
AnnaBridge 174:b96e65c34a4d 80 {
AnnaBridge 175:af195413fb11 81 uint16_t count = core_util_atomic_decr_u16(&_lock_count, 1);
AnnaBridge 175:af195413fb11 82 if (count == 0) {
AnnaBridge 175:af195413fb11 83 sleep_manager_unlock_deep_sleep();
AnnaBridge 175:af195413fb11 84 }
AnnaBridge 175:af195413fb11 85 if (count == USHRT_MAX) {
AnnaBridge 175:af195413fb11 86 core_util_critical_section_exit();
Anna Bridge 186:707f6e361f3e 87 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_UNDERFLOW), "DeepSleepLock underflow (< 0)", count);
AnnaBridge 175:af195413fb11 88 }
AnnaBridge 174:b96e65c34a4d 89 }
AnnaBridge 174:b96e65c34a4d 90 };
AnnaBridge 174:b96e65c34a4d 91
AnnaBridge 178:79309dc6340a 92 /**@}*/
AnnaBridge 178:79309dc6340a 93
AnnaBridge 178:79309dc6340a 94 /**@}*/
AnnaBridge 178:79309dc6340a 95
AnnaBridge 178:79309dc6340a 96
AnnaBridge 174:b96e65c34a4d 97 }
AnnaBridge 174:b96e65c34a4d 98
AnnaBridge 174:b96e65c34a4d 99 #endif