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:
187:0387e8f68319
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 174:b96e65c34a4d 1 /*
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
AnnaBridge 174:b96e65c34a4d 18 #ifndef MBED_CRITICALSECTIONLOCK_H
AnnaBridge 174:b96e65c34a4d 19 #define MBED_CRITICALSECTIONLOCK_H
AnnaBridge 174:b96e65c34a4d 20
AnnaBridge 174:b96e65c34a4d 21 #include "platform/mbed_critical.h"
AnnaBridge 181:57724642e740 22 #include "platform/mbed_toolchain.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_CriticalSectionLock CriticalSectionLock functions
AnnaBridge 178:79309dc6340a 30 * @{
AnnaBridge 178:79309dc6340a 31 */
AnnaBridge 178:79309dc6340a 32
AnnaBridge 174:b96e65c34a4d 33 /** RAII object for disabling, then restoring, interrupt state
AnnaBridge 174:b96e65c34a4d 34 * Usage:
AnnaBridge 174:b96e65c34a4d 35 * @code
AnnaBridge 174:b96e65c34a4d 36 *
AnnaBridge 184:08ed48f1de7f 37 * // RAII style usage
AnnaBridge 184:08ed48f1de7f 38 * unsigned int atomic_counter_increment(unsigned int &counter) {
AnnaBridge 184:08ed48f1de7f 39 * CriticalSectionLock lock;
AnnaBridge 184:08ed48f1de7f 40 * // Code in this block will run with interrupts disabled
AnnaBridge 184:08ed48f1de7f 41 * // Interrupts will be restored to their previous state automatically
AnnaBridge 184:08ed48f1de7f 42 * // at the end of function scope
AnnaBridge 184:08ed48f1de7f 43 * return ++counter;
AnnaBridge 174:b96e65c34a4d 44 * }
AnnaBridge 184:08ed48f1de7f 45 *
AnnaBridge 184:08ed48f1de7f 46 * // free locking usage
AnnaBridge 184:08ed48f1de7f 47 * unsigned int atomic_counter_decrement(unsigned int &counter) {
AnnaBridge 184:08ed48f1de7f 48 * CriticalSectionLock::enable();
AnnaBridge 184:08ed48f1de7f 49 * // Code in this block will run with interrupts disabled
AnnaBridge 184:08ed48f1de7f 50 * counter--;
AnnaBridge 184:08ed48f1de7f 51 * CriticalSectionLock::disable(); // need explicitly to disable critical section lock
AnnaBridge 184:08ed48f1de7f 52 * // interrupts will be restored to their previous state here
AnnaBridge 184:08ed48f1de7f 53 * return counter;
AnnaBridge 184:08ed48f1de7f 54 * }
AnnaBridge 184:08ed48f1de7f 55 *
AnnaBridge 174:b96e65c34a4d 56 * @endcode
AnnaBridge 174:b96e65c34a4d 57 */
AnnaBridge 174:b96e65c34a4d 58 class CriticalSectionLock {
AnnaBridge 174:b96e65c34a4d 59 public:
AnnaBridge 187:0387e8f68319 60 CriticalSectionLock()
AnnaBridge 174:b96e65c34a4d 61 {
AnnaBridge 174:b96e65c34a4d 62 core_util_critical_section_enter();
AnnaBridge 174:b96e65c34a4d 63 }
AnnaBridge 174:b96e65c34a4d 64
AnnaBridge 187:0387e8f68319 65 ~CriticalSectionLock()
AnnaBridge 174:b96e65c34a4d 66 {
AnnaBridge 174:b96e65c34a4d 67 core_util_critical_section_exit();
AnnaBridge 174:b96e65c34a4d 68 }
AnnaBridge 174:b96e65c34a4d 69
AnnaBridge 174:b96e65c34a4d 70 /** Mark the start of a critical section
AnnaBridge 184:08ed48f1de7f 71 * @deprecated This function is inconsistent with RAII and is being removed in the future. Replaced by static function CriticalSectionLock::enable.
AnnaBridge 184:08ed48f1de7f 72 *
AnnaBridge 174:b96e65c34a4d 73 */
AnnaBridge 184:08ed48f1de7f 74 MBED_DEPRECATED_SINCE("mbed-os-5.8",
AnnaBridge 187:0387e8f68319 75 "This function is inconsistent with RAII and is being removed in the future."
AnnaBridge 187:0387e8f68319 76 "Replaced by static function CriticalSectionLock::enable.")
AnnaBridge 174:b96e65c34a4d 77 void lock()
AnnaBridge 174:b96e65c34a4d 78 {
AnnaBridge 174:b96e65c34a4d 79 core_util_critical_section_enter();
AnnaBridge 174:b96e65c34a4d 80 }
AnnaBridge 174:b96e65c34a4d 81
AnnaBridge 174:b96e65c34a4d 82 /** Mark the end of a critical section
AnnaBridge 184:08ed48f1de7f 83 * @deprecated This function is inconsistent with RAII and is being removed in the future. Replaced by static function CriticalSectionLock::enable.
AnnaBridge 184:08ed48f1de7f 84 *
AnnaBridge 174:b96e65c34a4d 85 */
AnnaBridge 184:08ed48f1de7f 86 MBED_DEPRECATED_SINCE("mbed-os-5.8",
AnnaBridge 187:0387e8f68319 87 "This function is inconsistent with RAII and is being removed in the future."
AnnaBridge 187:0387e8f68319 88 "Replaced by static function CriticalSectionLock::disable.")
AnnaBridge 174:b96e65c34a4d 89 void unlock()
AnnaBridge 174:b96e65c34a4d 90 {
AnnaBridge 174:b96e65c34a4d 91 core_util_critical_section_exit();
AnnaBridge 174:b96e65c34a4d 92 }
AnnaBridge 184:08ed48f1de7f 93
AnnaBridge 184:08ed48f1de7f 94 /** Mark the start of a critical section
AnnaBridge 184:08ed48f1de7f 95 */
AnnaBridge 184:08ed48f1de7f 96 static void enable()
AnnaBridge 184:08ed48f1de7f 97 {
AnnaBridge 184:08ed48f1de7f 98 core_util_critical_section_enter();
AnnaBridge 184:08ed48f1de7f 99 }
AnnaBridge 184:08ed48f1de7f 100
AnnaBridge 184:08ed48f1de7f 101 /** Mark the end of a critical section
AnnaBridge 184:08ed48f1de7f 102 */
AnnaBridge 184:08ed48f1de7f 103 static void disable()
AnnaBridge 184:08ed48f1de7f 104 {
AnnaBridge 184:08ed48f1de7f 105 core_util_critical_section_exit();
AnnaBridge 184:08ed48f1de7f 106 }
AnnaBridge 174:b96e65c34a4d 107 };
AnnaBridge 174:b96e65c34a4d 108
AnnaBridge 178:79309dc6340a 109 /**@}*/
AnnaBridge 178:79309dc6340a 110
AnnaBridge 178:79309dc6340a 111 /**@}*/
AnnaBridge 174:b96e65c34a4d 112
AnnaBridge 174:b96e65c34a4d 113 } // namespace mbed
AnnaBridge 174:b96e65c34a4d 114
AnnaBridge 174:b96e65c34a4d 115 #endif