Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of OmniWheels by
mbed-os/platform/mbed_critical.c@2:798925c9e4a8, 2018-05-01 (annotated)
- Committer:
- gustavatmel
- Date:
- Tue May 01 15:55:34 2018 +0000
- Revision:
- 2:798925c9e4a8
- Parent:
- 1:9c5af431a1f1
bluetooth
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gustavatmel | 1:9c5af431a1f1 | 1 | /* |
gustavatmel | 1:9c5af431a1f1 | 2 | * Copyright (c) 2015-2016, ARM Limited, All Rights Reserved |
gustavatmel | 1:9c5af431a1f1 | 3 | * SPDX-License-Identifier: Apache-2.0 |
gustavatmel | 1:9c5af431a1f1 | 4 | * |
gustavatmel | 1:9c5af431a1f1 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may |
gustavatmel | 1:9c5af431a1f1 | 6 | * not use this file except in compliance with the License. |
gustavatmel | 1:9c5af431a1f1 | 7 | * You may obtain a copy of the License at |
gustavatmel | 1:9c5af431a1f1 | 8 | * |
gustavatmel | 1:9c5af431a1f1 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
gustavatmel | 1:9c5af431a1f1 | 10 | * |
gustavatmel | 1:9c5af431a1f1 | 11 | * Unless required by applicable law or agreed to in writing, software |
gustavatmel | 1:9c5af431a1f1 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
gustavatmel | 1:9c5af431a1f1 | 13 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
gustavatmel | 1:9c5af431a1f1 | 14 | * See the License for the specific language governing permissions and |
gustavatmel | 1:9c5af431a1f1 | 15 | * limitations under the License. |
gustavatmel | 1:9c5af431a1f1 | 16 | */ |
gustavatmel | 1:9c5af431a1f1 | 17 | |
gustavatmel | 1:9c5af431a1f1 | 18 | /* Declare __STDC_LIMIT_MACROS so stdint.h defines UINT32_MAX when using C++ */ |
gustavatmel | 1:9c5af431a1f1 | 19 | #define __STDC_LIMIT_MACROS |
gustavatmel | 1:9c5af431a1f1 | 20 | #include "hal/critical_section_api.h" |
gustavatmel | 1:9c5af431a1f1 | 21 | |
gustavatmel | 1:9c5af431a1f1 | 22 | #include "cmsis.h" |
gustavatmel | 1:9c5af431a1f1 | 23 | #include "platform/mbed_assert.h" |
gustavatmel | 1:9c5af431a1f1 | 24 | #include "platform/mbed_critical.h" |
gustavatmel | 1:9c5af431a1f1 | 25 | #include "platform/mbed_toolchain.h" |
gustavatmel | 1:9c5af431a1f1 | 26 | |
gustavatmel | 1:9c5af431a1f1 | 27 | // if __EXCLUSIVE_ACCESS rtx macro not defined, we need to get this via own-set architecture macros |
gustavatmel | 1:9c5af431a1f1 | 28 | #ifndef MBED_EXCLUSIVE_ACCESS |
gustavatmel | 1:9c5af431a1f1 | 29 | #ifndef __EXCLUSIVE_ACCESS |
gustavatmel | 1:9c5af431a1f1 | 30 | #if ((__ARM_ARCH_7M__ == 1U) || \ |
gustavatmel | 1:9c5af431a1f1 | 31 | (__ARM_ARCH_7EM__ == 1U) || \ |
gustavatmel | 1:9c5af431a1f1 | 32 | (__ARM_ARCH_8M_BASE__ == 1U) || \ |
gustavatmel | 1:9c5af431a1f1 | 33 | (__ARM_ARCH_8M_MAIN__ == 1U)) || \ |
gustavatmel | 1:9c5af431a1f1 | 34 | (__ARM_ARCH_7A__ == 1U) |
gustavatmel | 1:9c5af431a1f1 | 35 | #define MBED_EXCLUSIVE_ACCESS 1U |
gustavatmel | 1:9c5af431a1f1 | 36 | #elif (__ARM_ARCH_6M__ == 1U) |
gustavatmel | 1:9c5af431a1f1 | 37 | #define MBED_EXCLUSIVE_ACCESS 0U |
gustavatmel | 1:9c5af431a1f1 | 38 | #else |
gustavatmel | 1:9c5af431a1f1 | 39 | #error "Unknown architecture for exclusive access" |
gustavatmel | 1:9c5af431a1f1 | 40 | #endif |
gustavatmel | 1:9c5af431a1f1 | 41 | #else |
gustavatmel | 1:9c5af431a1f1 | 42 | #define MBED_EXCLUSIVE_ACCESS __EXCLUSIVE_ACCESS |
gustavatmel | 1:9c5af431a1f1 | 43 | #endif |
gustavatmel | 1:9c5af431a1f1 | 44 | #endif |
gustavatmel | 1:9c5af431a1f1 | 45 | |
gustavatmel | 1:9c5af431a1f1 | 46 | static volatile uint32_t critical_section_reentrancy_counter = 0; |
gustavatmel | 1:9c5af431a1f1 | 47 | |
gustavatmel | 1:9c5af431a1f1 | 48 | bool core_util_are_interrupts_enabled(void) |
gustavatmel | 1:9c5af431a1f1 | 49 | { |
gustavatmel | 1:9c5af431a1f1 | 50 | #if defined(__CORTEX_A9) |
gustavatmel | 1:9c5af431a1f1 | 51 | return ((__get_CPSR() & 0x80) == 0); |
gustavatmel | 1:9c5af431a1f1 | 52 | #else |
gustavatmel | 1:9c5af431a1f1 | 53 | return ((__get_PRIMASK() & 0x1) == 0); |
gustavatmel | 1:9c5af431a1f1 | 54 | #endif |
gustavatmel | 1:9c5af431a1f1 | 55 | } |
gustavatmel | 1:9c5af431a1f1 | 56 | |
gustavatmel | 1:9c5af431a1f1 | 57 | bool core_util_is_isr_active(void) |
gustavatmel | 1:9c5af431a1f1 | 58 | { |
gustavatmel | 1:9c5af431a1f1 | 59 | #if defined(__CORTEX_A9) |
gustavatmel | 1:9c5af431a1f1 | 60 | switch(__get_CPSR() & 0x1FU) { |
gustavatmel | 1:9c5af431a1f1 | 61 | case CPSR_M_USR: |
gustavatmel | 1:9c5af431a1f1 | 62 | case CPSR_M_SYS: |
gustavatmel | 1:9c5af431a1f1 | 63 | return false; |
gustavatmel | 1:9c5af431a1f1 | 64 | case CPSR_M_SVC: |
gustavatmel | 1:9c5af431a1f1 | 65 | default: |
gustavatmel | 1:9c5af431a1f1 | 66 | return true; |
gustavatmel | 1:9c5af431a1f1 | 67 | } |
gustavatmel | 1:9c5af431a1f1 | 68 | #else |
gustavatmel | 1:9c5af431a1f1 | 69 | return (__get_IPSR() != 0U); |
gustavatmel | 1:9c5af431a1f1 | 70 | #endif |
gustavatmel | 1:9c5af431a1f1 | 71 | } |
gustavatmel | 1:9c5af431a1f1 | 72 | |
gustavatmel | 1:9c5af431a1f1 | 73 | bool core_util_in_critical_section(void) |
gustavatmel | 1:9c5af431a1f1 | 74 | { |
gustavatmel | 1:9c5af431a1f1 | 75 | return hal_in_critical_section(); |
gustavatmel | 1:9c5af431a1f1 | 76 | } |
gustavatmel | 1:9c5af431a1f1 | 77 | |
gustavatmel | 1:9c5af431a1f1 | 78 | void core_util_critical_section_enter(void) |
gustavatmel | 1:9c5af431a1f1 | 79 | { |
gustavatmel | 1:9c5af431a1f1 | 80 | // FIXME |
gustavatmel | 1:9c5af431a1f1 | 81 | #ifdef FEATURE_UVISOR |
gustavatmel | 1:9c5af431a1f1 | 82 | #warning "core_util_critical_section_enter needs fixing to work from unprivileged code" |
gustavatmel | 1:9c5af431a1f1 | 83 | #else |
gustavatmel | 1:9c5af431a1f1 | 84 | // If the reentrancy counter overflows something has gone badly wrong. |
gustavatmel | 1:9c5af431a1f1 | 85 | MBED_ASSERT(critical_section_reentrancy_counter < UINT32_MAX); |
gustavatmel | 1:9c5af431a1f1 | 86 | #endif /* FEATURE_UVISOR */ |
gustavatmel | 1:9c5af431a1f1 | 87 | |
gustavatmel | 1:9c5af431a1f1 | 88 | hal_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 89 | |
gustavatmel | 1:9c5af431a1f1 | 90 | ++critical_section_reentrancy_counter; |
gustavatmel | 1:9c5af431a1f1 | 91 | } |
gustavatmel | 1:9c5af431a1f1 | 92 | |
gustavatmel | 1:9c5af431a1f1 | 93 | void core_util_critical_section_exit(void) |
gustavatmel | 1:9c5af431a1f1 | 94 | { |
gustavatmel | 1:9c5af431a1f1 | 95 | // FIXME |
gustavatmel | 1:9c5af431a1f1 | 96 | #ifdef FEATURE_UVISOR |
gustavatmel | 1:9c5af431a1f1 | 97 | #warning "core_util_critical_section_exit needs fixing to work from unprivileged code" |
gustavatmel | 1:9c5af431a1f1 | 98 | #endif /* FEATURE_UVISOR */ |
gustavatmel | 1:9c5af431a1f1 | 99 | |
gustavatmel | 1:9c5af431a1f1 | 100 | // If critical_section_enter has not previously been called, do nothing |
gustavatmel | 1:9c5af431a1f1 | 101 | if (critical_section_reentrancy_counter == 0) { |
gustavatmel | 1:9c5af431a1f1 | 102 | return; |
gustavatmel | 1:9c5af431a1f1 | 103 | } |
gustavatmel | 1:9c5af431a1f1 | 104 | |
gustavatmel | 1:9c5af431a1f1 | 105 | --critical_section_reentrancy_counter; |
gustavatmel | 1:9c5af431a1f1 | 106 | |
gustavatmel | 1:9c5af431a1f1 | 107 | if (critical_section_reentrancy_counter == 0) { |
gustavatmel | 1:9c5af431a1f1 | 108 | hal_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 109 | } |
gustavatmel | 1:9c5af431a1f1 | 110 | } |
gustavatmel | 1:9c5af431a1f1 | 111 | |
gustavatmel | 1:9c5af431a1f1 | 112 | #if MBED_EXCLUSIVE_ACCESS |
gustavatmel | 1:9c5af431a1f1 | 113 | |
gustavatmel | 1:9c5af431a1f1 | 114 | /* Supress __ldrex and __strex deprecated warnings - "#3731-D: intrinsic is deprecated" */ |
gustavatmel | 1:9c5af431a1f1 | 115 | #if defined (__CC_ARM) |
gustavatmel | 1:9c5af431a1f1 | 116 | #pragma diag_suppress 3731 |
gustavatmel | 1:9c5af431a1f1 | 117 | #endif |
gustavatmel | 1:9c5af431a1f1 | 118 | |
gustavatmel | 1:9c5af431a1f1 | 119 | bool core_util_atomic_cas_u8(volatile uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue) |
gustavatmel | 1:9c5af431a1f1 | 120 | { |
gustavatmel | 1:9c5af431a1f1 | 121 | do { |
gustavatmel | 1:9c5af431a1f1 | 122 | uint8_t currentValue = __LDREXB(ptr); |
gustavatmel | 1:9c5af431a1f1 | 123 | if (currentValue != *expectedCurrentValue) { |
gustavatmel | 1:9c5af431a1f1 | 124 | *expectedCurrentValue = currentValue; |
gustavatmel | 1:9c5af431a1f1 | 125 | __CLREX(); |
gustavatmel | 1:9c5af431a1f1 | 126 | return false; |
gustavatmel | 1:9c5af431a1f1 | 127 | } |
gustavatmel | 1:9c5af431a1f1 | 128 | } while (__STREXB(desiredValue, ptr)); |
gustavatmel | 1:9c5af431a1f1 | 129 | return true; |
gustavatmel | 1:9c5af431a1f1 | 130 | } |
gustavatmel | 1:9c5af431a1f1 | 131 | |
gustavatmel | 1:9c5af431a1f1 | 132 | bool core_util_atomic_cas_u16(volatile uint16_t *ptr, uint16_t *expectedCurrentValue, uint16_t desiredValue) |
gustavatmel | 1:9c5af431a1f1 | 133 | { |
gustavatmel | 1:9c5af431a1f1 | 134 | do { |
gustavatmel | 1:9c5af431a1f1 | 135 | uint16_t currentValue = __LDREXH(ptr); |
gustavatmel | 1:9c5af431a1f1 | 136 | if (currentValue != *expectedCurrentValue) { |
gustavatmel | 1:9c5af431a1f1 | 137 | *expectedCurrentValue = currentValue; |
gustavatmel | 1:9c5af431a1f1 | 138 | __CLREX(); |
gustavatmel | 1:9c5af431a1f1 | 139 | return false; |
gustavatmel | 1:9c5af431a1f1 | 140 | } |
gustavatmel | 1:9c5af431a1f1 | 141 | } while (__STREXH(desiredValue, ptr)); |
gustavatmel | 1:9c5af431a1f1 | 142 | return true; |
gustavatmel | 1:9c5af431a1f1 | 143 | } |
gustavatmel | 1:9c5af431a1f1 | 144 | |
gustavatmel | 1:9c5af431a1f1 | 145 | |
gustavatmel | 1:9c5af431a1f1 | 146 | bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentValue, uint32_t desiredValue) |
gustavatmel | 1:9c5af431a1f1 | 147 | { |
gustavatmel | 1:9c5af431a1f1 | 148 | do { |
gustavatmel | 1:9c5af431a1f1 | 149 | uint32_t currentValue = __LDREXW(ptr); |
gustavatmel | 1:9c5af431a1f1 | 150 | if (currentValue != *expectedCurrentValue) { |
gustavatmel | 1:9c5af431a1f1 | 151 | *expectedCurrentValue = currentValue; |
gustavatmel | 1:9c5af431a1f1 | 152 | __CLREX(); |
gustavatmel | 1:9c5af431a1f1 | 153 | return false; |
gustavatmel | 1:9c5af431a1f1 | 154 | } |
gustavatmel | 1:9c5af431a1f1 | 155 | } while (__STREXW(desiredValue, ptr)); |
gustavatmel | 1:9c5af431a1f1 | 156 | return true; |
gustavatmel | 1:9c5af431a1f1 | 157 | } |
gustavatmel | 1:9c5af431a1f1 | 158 | |
gustavatmel | 1:9c5af431a1f1 | 159 | uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta) |
gustavatmel | 1:9c5af431a1f1 | 160 | { |
gustavatmel | 1:9c5af431a1f1 | 161 | uint8_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 162 | do { |
gustavatmel | 1:9c5af431a1f1 | 163 | newValue = __LDREXB(valuePtr) + delta; |
gustavatmel | 1:9c5af431a1f1 | 164 | } while (__STREXB(newValue, valuePtr)); |
gustavatmel | 1:9c5af431a1f1 | 165 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 166 | } |
gustavatmel | 1:9c5af431a1f1 | 167 | |
gustavatmel | 1:9c5af431a1f1 | 168 | uint16_t core_util_atomic_incr_u16(volatile uint16_t *valuePtr, uint16_t delta) |
gustavatmel | 1:9c5af431a1f1 | 169 | { |
gustavatmel | 1:9c5af431a1f1 | 170 | uint16_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 171 | do { |
gustavatmel | 1:9c5af431a1f1 | 172 | newValue = __LDREXH(valuePtr) + delta; |
gustavatmel | 1:9c5af431a1f1 | 173 | } while (__STREXH(newValue, valuePtr)); |
gustavatmel | 1:9c5af431a1f1 | 174 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 175 | } |
gustavatmel | 1:9c5af431a1f1 | 176 | |
gustavatmel | 1:9c5af431a1f1 | 177 | uint32_t core_util_atomic_incr_u32(volatile uint32_t *valuePtr, uint32_t delta) |
gustavatmel | 1:9c5af431a1f1 | 178 | { |
gustavatmel | 1:9c5af431a1f1 | 179 | uint32_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 180 | do { |
gustavatmel | 1:9c5af431a1f1 | 181 | newValue = __LDREXW(valuePtr) + delta; |
gustavatmel | 1:9c5af431a1f1 | 182 | } while (__STREXW(newValue, valuePtr)); |
gustavatmel | 1:9c5af431a1f1 | 183 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 184 | } |
gustavatmel | 1:9c5af431a1f1 | 185 | |
gustavatmel | 1:9c5af431a1f1 | 186 | |
gustavatmel | 1:9c5af431a1f1 | 187 | uint8_t core_util_atomic_decr_u8(volatile uint8_t *valuePtr, uint8_t delta) |
gustavatmel | 1:9c5af431a1f1 | 188 | { |
gustavatmel | 1:9c5af431a1f1 | 189 | uint8_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 190 | do { |
gustavatmel | 1:9c5af431a1f1 | 191 | newValue = __LDREXB(valuePtr) - delta; |
gustavatmel | 1:9c5af431a1f1 | 192 | } while (__STREXB(newValue, valuePtr)); |
gustavatmel | 1:9c5af431a1f1 | 193 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 194 | } |
gustavatmel | 1:9c5af431a1f1 | 195 | |
gustavatmel | 1:9c5af431a1f1 | 196 | uint16_t core_util_atomic_decr_u16(volatile uint16_t *valuePtr, uint16_t delta) |
gustavatmel | 1:9c5af431a1f1 | 197 | { |
gustavatmel | 1:9c5af431a1f1 | 198 | uint16_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 199 | do { |
gustavatmel | 1:9c5af431a1f1 | 200 | newValue = __LDREXH(valuePtr) - delta; |
gustavatmel | 1:9c5af431a1f1 | 201 | } while (__STREXH(newValue, valuePtr)); |
gustavatmel | 1:9c5af431a1f1 | 202 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 203 | } |
gustavatmel | 1:9c5af431a1f1 | 204 | |
gustavatmel | 1:9c5af431a1f1 | 205 | uint32_t core_util_atomic_decr_u32(volatile uint32_t *valuePtr, uint32_t delta) |
gustavatmel | 1:9c5af431a1f1 | 206 | { |
gustavatmel | 1:9c5af431a1f1 | 207 | uint32_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 208 | do { |
gustavatmel | 1:9c5af431a1f1 | 209 | newValue = __LDREXW(valuePtr) - delta; |
gustavatmel | 1:9c5af431a1f1 | 210 | } while (__STREXW(newValue, valuePtr)); |
gustavatmel | 1:9c5af431a1f1 | 211 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 212 | } |
gustavatmel | 1:9c5af431a1f1 | 213 | |
gustavatmel | 1:9c5af431a1f1 | 214 | #else |
gustavatmel | 1:9c5af431a1f1 | 215 | |
gustavatmel | 1:9c5af431a1f1 | 216 | bool core_util_atomic_cas_u8(volatile uint8_t *ptr, uint8_t *expectedCurrentValue, uint8_t desiredValue) |
gustavatmel | 1:9c5af431a1f1 | 217 | { |
gustavatmel | 1:9c5af431a1f1 | 218 | bool success; |
gustavatmel | 1:9c5af431a1f1 | 219 | uint8_t currentValue; |
gustavatmel | 1:9c5af431a1f1 | 220 | core_util_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 221 | currentValue = *ptr; |
gustavatmel | 1:9c5af431a1f1 | 222 | if (currentValue == *expectedCurrentValue) { |
gustavatmel | 1:9c5af431a1f1 | 223 | *ptr = desiredValue; |
gustavatmel | 1:9c5af431a1f1 | 224 | success = true; |
gustavatmel | 1:9c5af431a1f1 | 225 | } else { |
gustavatmel | 1:9c5af431a1f1 | 226 | *expectedCurrentValue = currentValue; |
gustavatmel | 1:9c5af431a1f1 | 227 | success = false; |
gustavatmel | 1:9c5af431a1f1 | 228 | } |
gustavatmel | 1:9c5af431a1f1 | 229 | core_util_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 230 | return success; |
gustavatmel | 1:9c5af431a1f1 | 231 | } |
gustavatmel | 1:9c5af431a1f1 | 232 | |
gustavatmel | 1:9c5af431a1f1 | 233 | bool core_util_atomic_cas_u16(volatile uint16_t *ptr, uint16_t *expectedCurrentValue, uint16_t desiredValue) |
gustavatmel | 1:9c5af431a1f1 | 234 | { |
gustavatmel | 1:9c5af431a1f1 | 235 | bool success; |
gustavatmel | 1:9c5af431a1f1 | 236 | uint16_t currentValue; |
gustavatmel | 1:9c5af431a1f1 | 237 | core_util_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 238 | currentValue = *ptr; |
gustavatmel | 1:9c5af431a1f1 | 239 | if (currentValue == *expectedCurrentValue) { |
gustavatmel | 1:9c5af431a1f1 | 240 | *ptr = desiredValue; |
gustavatmel | 1:9c5af431a1f1 | 241 | success = true; |
gustavatmel | 1:9c5af431a1f1 | 242 | } else { |
gustavatmel | 1:9c5af431a1f1 | 243 | *expectedCurrentValue = currentValue; |
gustavatmel | 1:9c5af431a1f1 | 244 | success = false; |
gustavatmel | 1:9c5af431a1f1 | 245 | } |
gustavatmel | 1:9c5af431a1f1 | 246 | core_util_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 247 | return success; |
gustavatmel | 1:9c5af431a1f1 | 248 | } |
gustavatmel | 1:9c5af431a1f1 | 249 | |
gustavatmel | 1:9c5af431a1f1 | 250 | |
gustavatmel | 1:9c5af431a1f1 | 251 | bool core_util_atomic_cas_u32(volatile uint32_t *ptr, uint32_t *expectedCurrentValue, uint32_t desiredValue) |
gustavatmel | 1:9c5af431a1f1 | 252 | { |
gustavatmel | 1:9c5af431a1f1 | 253 | bool success; |
gustavatmel | 1:9c5af431a1f1 | 254 | uint32_t currentValue; |
gustavatmel | 1:9c5af431a1f1 | 255 | core_util_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 256 | currentValue = *ptr; |
gustavatmel | 1:9c5af431a1f1 | 257 | if (currentValue == *expectedCurrentValue) { |
gustavatmel | 1:9c5af431a1f1 | 258 | *ptr = desiredValue; |
gustavatmel | 1:9c5af431a1f1 | 259 | success = true; |
gustavatmel | 1:9c5af431a1f1 | 260 | } else { |
gustavatmel | 1:9c5af431a1f1 | 261 | *expectedCurrentValue = currentValue; |
gustavatmel | 1:9c5af431a1f1 | 262 | success = false; |
gustavatmel | 1:9c5af431a1f1 | 263 | } |
gustavatmel | 1:9c5af431a1f1 | 264 | core_util_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 265 | return success; |
gustavatmel | 1:9c5af431a1f1 | 266 | } |
gustavatmel | 1:9c5af431a1f1 | 267 | |
gustavatmel | 1:9c5af431a1f1 | 268 | |
gustavatmel | 1:9c5af431a1f1 | 269 | uint8_t core_util_atomic_incr_u8(volatile uint8_t *valuePtr, uint8_t delta) |
gustavatmel | 1:9c5af431a1f1 | 270 | { |
gustavatmel | 1:9c5af431a1f1 | 271 | uint8_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 272 | core_util_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 273 | newValue = *valuePtr + delta; |
gustavatmel | 1:9c5af431a1f1 | 274 | *valuePtr = newValue; |
gustavatmel | 1:9c5af431a1f1 | 275 | core_util_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 276 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 277 | } |
gustavatmel | 1:9c5af431a1f1 | 278 | |
gustavatmel | 1:9c5af431a1f1 | 279 | uint16_t core_util_atomic_incr_u16(volatile uint16_t *valuePtr, uint16_t delta) |
gustavatmel | 1:9c5af431a1f1 | 280 | { |
gustavatmel | 1:9c5af431a1f1 | 281 | uint16_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 282 | core_util_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 283 | newValue = *valuePtr + delta; |
gustavatmel | 1:9c5af431a1f1 | 284 | *valuePtr = newValue; |
gustavatmel | 1:9c5af431a1f1 | 285 | core_util_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 286 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 287 | } |
gustavatmel | 1:9c5af431a1f1 | 288 | |
gustavatmel | 1:9c5af431a1f1 | 289 | uint32_t core_util_atomic_incr_u32(volatile uint32_t *valuePtr, uint32_t delta) |
gustavatmel | 1:9c5af431a1f1 | 290 | { |
gustavatmel | 1:9c5af431a1f1 | 291 | uint32_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 292 | core_util_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 293 | newValue = *valuePtr + delta; |
gustavatmel | 1:9c5af431a1f1 | 294 | *valuePtr = newValue; |
gustavatmel | 1:9c5af431a1f1 | 295 | core_util_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 296 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 297 | } |
gustavatmel | 1:9c5af431a1f1 | 298 | |
gustavatmel | 1:9c5af431a1f1 | 299 | |
gustavatmel | 1:9c5af431a1f1 | 300 | uint8_t core_util_atomic_decr_u8(volatile uint8_t *valuePtr, uint8_t delta) |
gustavatmel | 1:9c5af431a1f1 | 301 | { |
gustavatmel | 1:9c5af431a1f1 | 302 | uint8_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 303 | core_util_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 304 | newValue = *valuePtr - delta; |
gustavatmel | 1:9c5af431a1f1 | 305 | *valuePtr = newValue; |
gustavatmel | 1:9c5af431a1f1 | 306 | core_util_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 307 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 308 | } |
gustavatmel | 1:9c5af431a1f1 | 309 | |
gustavatmel | 1:9c5af431a1f1 | 310 | uint16_t core_util_atomic_decr_u16(volatile uint16_t *valuePtr, uint16_t delta) |
gustavatmel | 1:9c5af431a1f1 | 311 | { |
gustavatmel | 1:9c5af431a1f1 | 312 | uint16_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 313 | core_util_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 314 | newValue = *valuePtr - delta; |
gustavatmel | 1:9c5af431a1f1 | 315 | *valuePtr = newValue; |
gustavatmel | 1:9c5af431a1f1 | 316 | core_util_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 317 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 318 | } |
gustavatmel | 1:9c5af431a1f1 | 319 | |
gustavatmel | 1:9c5af431a1f1 | 320 | uint32_t core_util_atomic_decr_u32(volatile uint32_t *valuePtr, uint32_t delta) |
gustavatmel | 1:9c5af431a1f1 | 321 | { |
gustavatmel | 1:9c5af431a1f1 | 322 | uint32_t newValue; |
gustavatmel | 1:9c5af431a1f1 | 323 | core_util_critical_section_enter(); |
gustavatmel | 1:9c5af431a1f1 | 324 | newValue = *valuePtr - delta; |
gustavatmel | 1:9c5af431a1f1 | 325 | *valuePtr = newValue; |
gustavatmel | 1:9c5af431a1f1 | 326 | core_util_critical_section_exit(); |
gustavatmel | 1:9c5af431a1f1 | 327 | return newValue; |
gustavatmel | 1:9c5af431a1f1 | 328 | } |
gustavatmel | 1:9c5af431a1f1 | 329 | |
gustavatmel | 1:9c5af431a1f1 | 330 | #endif |
gustavatmel | 1:9c5af431a1f1 | 331 | |
gustavatmel | 1:9c5af431a1f1 | 332 | |
gustavatmel | 1:9c5af431a1f1 | 333 | bool core_util_atomic_cas_ptr(void * volatile *ptr, void **expectedCurrentValue, void *desiredValue) { |
gustavatmel | 1:9c5af431a1f1 | 334 | return core_util_atomic_cas_u32( |
gustavatmel | 1:9c5af431a1f1 | 335 | (volatile uint32_t *)ptr, |
gustavatmel | 1:9c5af431a1f1 | 336 | (uint32_t *)expectedCurrentValue, |
gustavatmel | 1:9c5af431a1f1 | 337 | (uint32_t)desiredValue); |
gustavatmel | 1:9c5af431a1f1 | 338 | } |
gustavatmel | 1:9c5af431a1f1 | 339 | |
gustavatmel | 1:9c5af431a1f1 | 340 | void *core_util_atomic_incr_ptr(void * volatile *valuePtr, ptrdiff_t delta) { |
gustavatmel | 1:9c5af431a1f1 | 341 | return (void *)core_util_atomic_incr_u32((volatile uint32_t *)valuePtr, (uint32_t)delta); |
gustavatmel | 1:9c5af431a1f1 | 342 | } |
gustavatmel | 1:9c5af431a1f1 | 343 | |
gustavatmel | 1:9c5af431a1f1 | 344 | void *core_util_atomic_decr_ptr(void * volatile *valuePtr, ptrdiff_t delta) { |
gustavatmel | 1:9c5af431a1f1 | 345 | return (void *)core_util_atomic_decr_u32((volatile uint32_t *)valuePtr, (uint32_t)delta); |
gustavatmel | 1:9c5af431a1f1 | 346 | } |
gustavatmel | 1:9c5af431a1f1 | 347 |