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.
mbed-os/rtos/TARGET_CORTEX/rtx5/RTX/Source/rtx_core_cm.h@1:b36bbc1c6d27, 2020-04-11 (annotated)
- Committer:
- demayer
- Date:
- Sat Apr 11 08:15:48 2020 +0000
- Revision:
- 1:b36bbc1c6d27
- Parent:
- 0:6bf0743ece18
IMU-library in .h und .cpp file aufgeteilt
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| demayer | 0:6bf0743ece18 | 1 | /* |
| demayer | 0:6bf0743ece18 | 2 | * Copyright (c) 2013-2017 ARM Limited. All rights reserved. |
| demayer | 0:6bf0743ece18 | 3 | * |
| demayer | 0:6bf0743ece18 | 4 | * SPDX-License-Identifier: Apache-2.0 |
| demayer | 0:6bf0743ece18 | 5 | * |
| demayer | 0:6bf0743ece18 | 6 | * Licensed under the Apache License, Version 2.0 (the License); you may |
| demayer | 0:6bf0743ece18 | 7 | * not use this file except in compliance with the License. |
| demayer | 0:6bf0743ece18 | 8 | * You may obtain a copy of the License at |
| demayer | 0:6bf0743ece18 | 9 | * |
| demayer | 0:6bf0743ece18 | 10 | * www.apache.org/licenses/LICENSE-2.0 |
| demayer | 0:6bf0743ece18 | 11 | * |
| demayer | 0:6bf0743ece18 | 12 | * Unless required by applicable law or agreed to in writing, software |
| demayer | 0:6bf0743ece18 | 13 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT |
| demayer | 0:6bf0743ece18 | 14 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| demayer | 0:6bf0743ece18 | 15 | * See the License for the specific language governing permissions and |
| demayer | 0:6bf0743ece18 | 16 | * limitations under the License. |
| demayer | 0:6bf0743ece18 | 17 | * |
| demayer | 0:6bf0743ece18 | 18 | * ----------------------------------------------------------------------------- |
| demayer | 0:6bf0743ece18 | 19 | * |
| demayer | 0:6bf0743ece18 | 20 | * Project: CMSIS-RTOS RTX |
| demayer | 0:6bf0743ece18 | 21 | * Title: Cortex-M Core definitions |
| demayer | 0:6bf0743ece18 | 22 | * |
| demayer | 0:6bf0743ece18 | 23 | * ----------------------------------------------------------------------------- |
| demayer | 0:6bf0743ece18 | 24 | */ |
| demayer | 0:6bf0743ece18 | 25 | |
| demayer | 0:6bf0743ece18 | 26 | #ifndef RTX_CORE_CM_H_ |
| demayer | 0:6bf0743ece18 | 27 | #define RTX_CORE_CM_H_ |
| demayer | 0:6bf0743ece18 | 28 | |
| demayer | 0:6bf0743ece18 | 29 | #include <cmsis.h> |
| demayer | 0:6bf0743ece18 | 30 | |
| demayer | 0:6bf0743ece18 | 31 | #ifdef RTE_CMSIS_RTOS2_RTX5_ARMV8M_NS |
| demayer | 0:6bf0743ece18 | 32 | #define __DOMAIN_NS 1U |
| demayer | 0:6bf0743ece18 | 33 | #endif |
| demayer | 0:6bf0743ece18 | 34 | |
| demayer | 0:6bf0743ece18 | 35 | #ifndef __DOMAIN_NS |
| demayer | 0:6bf0743ece18 | 36 | #define __DOMAIN_NS 0U |
| demayer | 0:6bf0743ece18 | 37 | #elif ((__DOMAIN_NS == 1U) && \ |
| demayer | 0:6bf0743ece18 | 38 | ((__ARM_ARCH_6M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 39 | (__ARM_ARCH_7M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 40 | (__ARM_ARCH_7EM__ == 1U))) |
| demayer | 0:6bf0743ece18 | 41 | #error "Non-secure domain requires ARMv8-M Architecture!" |
| demayer | 0:6bf0743ece18 | 42 | #endif |
| demayer | 0:6bf0743ece18 | 43 | |
| demayer | 0:6bf0743ece18 | 44 | #ifndef __EXCLUSIVE_ACCESS |
| demayer | 0:6bf0743ece18 | 45 | #if ((__ARM_ARCH_7M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 46 | (__ARM_ARCH_7EM__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 47 | (__ARM_ARCH_8M_BASE__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 48 | (__ARM_ARCH_8M_MAIN__ == 1U)) |
| demayer | 0:6bf0743ece18 | 49 | #define __EXCLUSIVE_ACCESS 1U |
| demayer | 0:6bf0743ece18 | 50 | #else |
| demayer | 0:6bf0743ece18 | 51 | #define __EXCLUSIVE_ACCESS 0U |
| demayer | 0:6bf0743ece18 | 52 | #endif |
| demayer | 0:6bf0743ece18 | 53 | #endif |
| demayer | 0:6bf0743ece18 | 54 | |
| demayer | 0:6bf0743ece18 | 55 | #define IS_PRIVILEGED() ((__get_CONTROL() & 1U) == 0U) |
| demayer | 0:6bf0743ece18 | 56 | |
| demayer | 0:6bf0743ece18 | 57 | #define IS_IRQ_MODE() (__get_IPSR() != 0U) |
| demayer | 0:6bf0743ece18 | 58 | |
| demayer | 0:6bf0743ece18 | 59 | #if ((__ARM_ARCH_7M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 60 | (__ARM_ARCH_7EM__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 61 | (__ARM_ARCH_8M_MAIN__ == 1U)) |
| demayer | 0:6bf0743ece18 | 62 | #define IS_IRQ_MASKED() ((__get_PRIMASK() != 0U) || (__get_BASEPRI() != 0U)) |
| demayer | 0:6bf0743ece18 | 63 | #else |
| demayer | 0:6bf0743ece18 | 64 | #define IS_IRQ_MASKED() (__get_PRIMASK() != 0U) |
| demayer | 0:6bf0743ece18 | 65 | #endif |
| demayer | 0:6bf0743ece18 | 66 | |
| demayer | 0:6bf0743ece18 | 67 | #define xPSR_INIT(...) 0x01000000U |
| demayer | 0:6bf0743ece18 | 68 | |
| demayer | 0:6bf0743ece18 | 69 | #if (__DOMAIN_NS == 1U) |
| demayer | 0:6bf0743ece18 | 70 | #define STACK_FRAME_INIT 0xBCU |
| demayer | 0:6bf0743ece18 | 71 | #else |
| demayer | 0:6bf0743ece18 | 72 | #define STACK_FRAME_INIT 0xFDU |
| demayer | 0:6bf0743ece18 | 73 | #endif |
| demayer | 0:6bf0743ece18 | 74 | |
| demayer | 0:6bf0743ece18 | 75 | // Stack Frame: |
| demayer | 0:6bf0743ece18 | 76 | // - Extended: S16-S31, R4-R11, R0-R3, R12, LR, PC, xPSR, S0-S15, FPSCR |
| demayer | 0:6bf0743ece18 | 77 | // - Basic: R4-R11, R0-R3, R12, LR, PC, xPSR |
| demayer | 0:6bf0743ece18 | 78 | #if (__FPU_USED == 1U) |
| demayer | 0:6bf0743ece18 | 79 | #define STACK_OFFSET_R0(stack_frame) \ |
| demayer | 0:6bf0743ece18 | 80 | ((((stack_frame) & 0x10U) == 0U) ? ((16U+8U)*4U) : \ |
| demayer | 0:6bf0743ece18 | 81 | (8U *4U)) |
| demayer | 0:6bf0743ece18 | 82 | #else |
| demayer | 0:6bf0743ece18 | 83 | #define STACK_OFFSET_R0(stack_frame) (8U *4U) |
| demayer | 0:6bf0743ece18 | 84 | #endif |
| demayer | 0:6bf0743ece18 | 85 | |
| demayer | 0:6bf0743ece18 | 86 | #define OS_TICK_HANDLER SysTick_Handler |
| demayer | 0:6bf0743ece18 | 87 | |
| demayer | 0:6bf0743ece18 | 88 | |
| demayer | 0:6bf0743ece18 | 89 | // ==== Service Calls definitions ==== |
| demayer | 0:6bf0743ece18 | 90 | |
| demayer | 0:6bf0743ece18 | 91 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 92 | |
| demayer | 0:6bf0743ece18 | 93 | #if ((__ARM_ARCH_7M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 94 | (__ARM_ARCH_7EM__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 95 | (__ARM_ARCH_8M_MAIN__ == 1U)) |
| demayer | 0:6bf0743ece18 | 96 | #define __SVC_INDIRECT(n) __svc_indirect(n) |
| demayer | 0:6bf0743ece18 | 97 | #elif ((__ARM_ARCH_6M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 98 | (__ARM_ARCH_8M_BASE__ == 1U)) |
| demayer | 0:6bf0743ece18 | 99 | #define __SVC_INDIRECT(n) __svc_indirect_r7(n) |
| demayer | 0:6bf0743ece18 | 100 | #endif |
| demayer | 0:6bf0743ece18 | 101 | |
| demayer | 0:6bf0743ece18 | 102 | #if (__FPU_USED == 1U) |
| demayer | 0:6bf0743ece18 | 103 | #define SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 104 | uint32_t control = __get_CONTROL(); \ |
| demayer | 0:6bf0743ece18 | 105 | if ((control & 2U) == 0U) { \ |
| demayer | 0:6bf0743ece18 | 106 | __set_PSP((__get_MSP() - ((control & 4U) ? 104U : 32U)) & ~7U); \ |
| demayer | 0:6bf0743ece18 | 107 | } |
| demayer | 0:6bf0743ece18 | 108 | #else |
| demayer | 0:6bf0743ece18 | 109 | #define SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 110 | uint32_t control = __get_CONTROL(); \ |
| demayer | 0:6bf0743ece18 | 111 | if ((control & 2U) == 0U) { \ |
| demayer | 0:6bf0743ece18 | 112 | __set_PSP((__get_MSP() - 32U) & ~7U); \ |
| demayer | 0:6bf0743ece18 | 113 | } |
| demayer | 0:6bf0743ece18 | 114 | #endif |
| demayer | 0:6bf0743ece18 | 115 | |
| demayer | 0:6bf0743ece18 | 116 | #define SVC0_0N(f,t) \ |
| demayer | 0:6bf0743ece18 | 117 | __SVC_INDIRECT(0) t svc##f (t(*)()); \ |
| demayer | 0:6bf0743ece18 | 118 | t svcRtx##f (void); \ |
| demayer | 0:6bf0743ece18 | 119 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 120 | __STATIC_INLINE t __svc##f (void) { \ |
| demayer | 0:6bf0743ece18 | 121 | svc##f(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 122 | } |
| demayer | 0:6bf0743ece18 | 123 | |
| demayer | 0:6bf0743ece18 | 124 | #define SVC0_0(f,t) \ |
| demayer | 0:6bf0743ece18 | 125 | __SVC_INDIRECT(0) t svc##f (t(*)()); \ |
| demayer | 0:6bf0743ece18 | 126 | t svcRtx##f (void); \ |
| demayer | 0:6bf0743ece18 | 127 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 128 | __STATIC_INLINE t __svc##f (void) { \ |
| demayer | 0:6bf0743ece18 | 129 | return svc##f(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 130 | } |
| demayer | 0:6bf0743ece18 | 131 | |
| demayer | 0:6bf0743ece18 | 132 | #define SVC0_0M(f,t) \ |
| demayer | 0:6bf0743ece18 | 133 | __SVC_INDIRECT(0) t svc##f (t(*)()); \ |
| demayer | 0:6bf0743ece18 | 134 | t svcRtx##f (void); \ |
| demayer | 0:6bf0743ece18 | 135 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 136 | __STATIC_INLINE t __svc##f (void) { \ |
| demayer | 0:6bf0743ece18 | 137 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 138 | return svc##f(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 139 | } |
| demayer | 0:6bf0743ece18 | 140 | |
| demayer | 0:6bf0743ece18 | 141 | #define SVC0_1N(f,t,t1) \ |
| demayer | 0:6bf0743ece18 | 142 | __SVC_INDIRECT(0) t svc##f (t(*)(t1),t1); \ |
| demayer | 0:6bf0743ece18 | 143 | t svcRtx##f (t1 a1); \ |
| demayer | 0:6bf0743ece18 | 144 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 145 | __STATIC_INLINE t __svc##f (t1 a1) { \ |
| demayer | 0:6bf0743ece18 | 146 | svc##f(svcRtx##f,a1); \ |
| demayer | 0:6bf0743ece18 | 147 | } |
| demayer | 0:6bf0743ece18 | 148 | |
| demayer | 0:6bf0743ece18 | 149 | #define SVC0_1(f,t,t1) \ |
| demayer | 0:6bf0743ece18 | 150 | __SVC_INDIRECT(0) t svc##f (t(*)(t1),t1); \ |
| demayer | 0:6bf0743ece18 | 151 | t svcRtx##f (t1 a1); \ |
| demayer | 0:6bf0743ece18 | 152 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 153 | __STATIC_INLINE t __svc##f (t1 a1) { \ |
| demayer | 0:6bf0743ece18 | 154 | return svc##f(svcRtx##f,a1); \ |
| demayer | 0:6bf0743ece18 | 155 | } |
| demayer | 0:6bf0743ece18 | 156 | |
| demayer | 0:6bf0743ece18 | 157 | #define SVC0_1M(f,t,t1) \ |
| demayer | 0:6bf0743ece18 | 158 | __SVC_INDIRECT(0) t svc##f (t(*)(t1),t1); \ |
| demayer | 0:6bf0743ece18 | 159 | t svcRtx##f (t1 a1); \ |
| demayer | 0:6bf0743ece18 | 160 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 161 | __STATIC_INLINE t __svc##f (t1 a1) { \ |
| demayer | 0:6bf0743ece18 | 162 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 163 | return svc##f(svcRtx##f,a1); \ |
| demayer | 0:6bf0743ece18 | 164 | } |
| demayer | 0:6bf0743ece18 | 165 | |
| demayer | 0:6bf0743ece18 | 166 | #define SVC0_2(f,t,t1,t2) \ |
| demayer | 0:6bf0743ece18 | 167 | __SVC_INDIRECT(0) t svc##f (t(*)(t1,t2),t1,t2); \ |
| demayer | 0:6bf0743ece18 | 168 | t svcRtx##f (t1 a1, t2 a2); \ |
| demayer | 0:6bf0743ece18 | 169 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 170 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2) { \ |
| demayer | 0:6bf0743ece18 | 171 | return svc##f(svcRtx##f,a1,a2); \ |
| demayer | 0:6bf0743ece18 | 172 | } |
| demayer | 0:6bf0743ece18 | 173 | |
| demayer | 0:6bf0743ece18 | 174 | #define SVC0_2M(f,t,t1,t2) \ |
| demayer | 0:6bf0743ece18 | 175 | __SVC_INDIRECT(0) t svc##f (t(*)(t1,t2),t1,t2); \ |
| demayer | 0:6bf0743ece18 | 176 | t svcRtx##f (t1 a1, t2 a2); \ |
| demayer | 0:6bf0743ece18 | 177 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 178 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2) { \ |
| demayer | 0:6bf0743ece18 | 179 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 180 | return svc##f(svcRtx##f,a1,a2); \ |
| demayer | 0:6bf0743ece18 | 181 | } |
| demayer | 0:6bf0743ece18 | 182 | |
| demayer | 0:6bf0743ece18 | 183 | #define SVC0_3(f,t,t1,t2,t3) \ |
| demayer | 0:6bf0743ece18 | 184 | __SVC_INDIRECT(0) t svc##f (t(*)(t1,t2,t3),t1,t2,t3); \ |
| demayer | 0:6bf0743ece18 | 185 | t svcRtx##f (t1 a1, t2 a2, t3 a3); \ |
| demayer | 0:6bf0743ece18 | 186 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 187 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3) { \ |
| demayer | 0:6bf0743ece18 | 188 | return svc##f(svcRtx##f,a1,a2,a3); \ |
| demayer | 0:6bf0743ece18 | 189 | } |
| demayer | 0:6bf0743ece18 | 190 | |
| demayer | 0:6bf0743ece18 | 191 | #define SVC0_3M(f,t,t1,t2,t3) \ |
| demayer | 0:6bf0743ece18 | 192 | __SVC_INDIRECT(0) t svc##f (t(*)(t1,t2,t3),t1,t2,t3); \ |
| demayer | 0:6bf0743ece18 | 193 | t svcRtx##f (t1 a1, t2 a2, t3 a3); \ |
| demayer | 0:6bf0743ece18 | 194 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 195 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3) { \ |
| demayer | 0:6bf0743ece18 | 196 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 197 | return svc##f(svcRtx##f,a1,a2,a3); \ |
| demayer | 0:6bf0743ece18 | 198 | } |
| demayer | 0:6bf0743ece18 | 199 | |
| demayer | 0:6bf0743ece18 | 200 | #define SVC0_4(f,t,t1,t2,t3,t4) \ |
| demayer | 0:6bf0743ece18 | 201 | __SVC_INDIRECT(0) t svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4); \ |
| demayer | 0:6bf0743ece18 | 202 | t svcRtx##f (t1 a1, t2 a2, t3 a3, t4 a4); \ |
| demayer | 0:6bf0743ece18 | 203 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 204 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) { \ |
| demayer | 0:6bf0743ece18 | 205 | return svc##f(svcRtx##f,a1,a2,a3,a4); \ |
| demayer | 0:6bf0743ece18 | 206 | } |
| demayer | 0:6bf0743ece18 | 207 | |
| demayer | 0:6bf0743ece18 | 208 | #define SVC0_4M(f,t,t1,t2,t3,t4) \ |
| demayer | 0:6bf0743ece18 | 209 | __SVC_INDIRECT(0) t svc##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4); \ |
| demayer | 0:6bf0743ece18 | 210 | t svcRtx##f (t1 a1, t2 a2, t3 a3, t4 a4); \ |
| demayer | 0:6bf0743ece18 | 211 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 212 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) { \ |
| demayer | 0:6bf0743ece18 | 213 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 214 | return svc##f(svcRtx##f,a1,a2,a3,a4); \ |
| demayer | 0:6bf0743ece18 | 215 | } |
| demayer | 0:6bf0743ece18 | 216 | |
| demayer | 0:6bf0743ece18 | 217 | #elif defined(__ICCARM__) |
| demayer | 0:6bf0743ece18 | 218 | |
| demayer | 0:6bf0743ece18 | 219 | #if ((__ARM_ARCH_7M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 220 | (__ARM_ARCH_7EM__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 221 | (__ARM_ARCH_8M_MAIN__ == 1U)) |
| demayer | 0:6bf0743ece18 | 222 | #define SVC_Setup(f) \ |
| demayer | 0:6bf0743ece18 | 223 | __asm( \ |
| demayer | 0:6bf0743ece18 | 224 | "mov r12,%0\n" \ |
| demayer | 0:6bf0743ece18 | 225 | :: "r"(&f): "r12" \ |
| demayer | 0:6bf0743ece18 | 226 | ); |
| demayer | 0:6bf0743ece18 | 227 | #elif ((__ARM_ARCH_6M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 228 | (__ARM_ARCH_8M_BASE__ == 1U)) |
| demayer | 0:6bf0743ece18 | 229 | #define SVC_Setup(f) \ |
| demayer | 0:6bf0743ece18 | 230 | __asm( \ |
| demayer | 0:6bf0743ece18 | 231 | "mov r7,%0\n" \ |
| demayer | 0:6bf0743ece18 | 232 | :: "r"(&f): "r7" \ |
| demayer | 0:6bf0743ece18 | 233 | ); |
| demayer | 0:6bf0743ece18 | 234 | #endif |
| demayer | 0:6bf0743ece18 | 235 | |
| demayer | 0:6bf0743ece18 | 236 | #define STRINGIFY(a) #a |
| demayer | 0:6bf0743ece18 | 237 | #define __SVC_INDIRECT(n) _Pragma(STRINGIFY(swi_number = n)) __swi |
| demayer | 0:6bf0743ece18 | 238 | |
| demayer | 0:6bf0743ece18 | 239 | #if (__FPU_USED == 1U) |
| demayer | 0:6bf0743ece18 | 240 | #define SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 241 | uint32_t control = __get_CONTROL(); \ |
| demayer | 0:6bf0743ece18 | 242 | if ((control & 2U) == 0U) { \ |
| demayer | 0:6bf0743ece18 | 243 | __set_PSP((__get_MSP() - ((control & 4U) ? 104U : 32U)) & ~7U); \ |
| demayer | 0:6bf0743ece18 | 244 | } |
| demayer | 0:6bf0743ece18 | 245 | #else |
| demayer | 0:6bf0743ece18 | 246 | #define SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 247 | uint32_t control = __get_CONTROL(); \ |
| demayer | 0:6bf0743ece18 | 248 | if ((control & 2U) == 0U) { \ |
| demayer | 0:6bf0743ece18 | 249 | __set_PSP((__get_MSP() - 32U) & ~7U); \ |
| demayer | 0:6bf0743ece18 | 250 | } |
| demayer | 0:6bf0743ece18 | 251 | #endif |
| demayer | 0:6bf0743ece18 | 252 | |
| demayer | 0:6bf0743ece18 | 253 | #define SVC0_0N(f,t) \ |
| demayer | 0:6bf0743ece18 | 254 | __SVC_INDIRECT(0) t svc##f (); \ |
| demayer | 0:6bf0743ece18 | 255 | t svcRtx##f (void); \ |
| demayer | 0:6bf0743ece18 | 256 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 257 | __STATIC_INLINE t __svc##f (void) { \ |
| demayer | 0:6bf0743ece18 | 258 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 259 | svc##f(); \ |
| demayer | 0:6bf0743ece18 | 260 | } |
| demayer | 0:6bf0743ece18 | 261 | |
| demayer | 0:6bf0743ece18 | 262 | #define SVC0_0(f,t) \ |
| demayer | 0:6bf0743ece18 | 263 | __SVC_INDIRECT(0) t svc##f (); \ |
| demayer | 0:6bf0743ece18 | 264 | t svcRtx##f (void); \ |
| demayer | 0:6bf0743ece18 | 265 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 266 | __STATIC_INLINE t __svc##f (void) { \ |
| demayer | 0:6bf0743ece18 | 267 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 268 | return svc##f(); \ |
| demayer | 0:6bf0743ece18 | 269 | } |
| demayer | 0:6bf0743ece18 | 270 | |
| demayer | 0:6bf0743ece18 | 271 | #define SVC0_0M(f,t) \ |
| demayer | 0:6bf0743ece18 | 272 | __SVC_INDIRECT(0) t svc##f (); \ |
| demayer | 0:6bf0743ece18 | 273 | t svcRtx##f (void); \ |
| demayer | 0:6bf0743ece18 | 274 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 275 | __STATIC_INLINE t __svc##f (void) { \ |
| demayer | 0:6bf0743ece18 | 276 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 277 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 278 | return svc##f(); \ |
| demayer | 0:6bf0743ece18 | 279 | } |
| demayer | 0:6bf0743ece18 | 280 | |
| demayer | 0:6bf0743ece18 | 281 | #define SVC0_1N(f,t,t1) \ |
| demayer | 0:6bf0743ece18 | 282 | __SVC_INDIRECT(0) t svc##f (t1 a1); \ |
| demayer | 0:6bf0743ece18 | 283 | t svcRtx##f (t1 a1); \ |
| demayer | 0:6bf0743ece18 | 284 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 285 | __STATIC_INLINE t __svc##f (t1 a1) { \ |
| demayer | 0:6bf0743ece18 | 286 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 287 | svc##f(a1); \ |
| demayer | 0:6bf0743ece18 | 288 | } |
| demayer | 0:6bf0743ece18 | 289 | |
| demayer | 0:6bf0743ece18 | 290 | #define SVC0_1(f,t,t1) \ |
| demayer | 0:6bf0743ece18 | 291 | __SVC_INDIRECT(0) t svc##f (t1 a1); \ |
| demayer | 0:6bf0743ece18 | 292 | t svcRtx##f (t1 a1); \ |
| demayer | 0:6bf0743ece18 | 293 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 294 | __STATIC_INLINE t __svc##f (t1 a1) { \ |
| demayer | 0:6bf0743ece18 | 295 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 296 | return svc##f(a1); \ |
| demayer | 0:6bf0743ece18 | 297 | } |
| demayer | 0:6bf0743ece18 | 298 | |
| demayer | 0:6bf0743ece18 | 299 | #define SVC0_1M(f,t,t1) \ |
| demayer | 0:6bf0743ece18 | 300 | __SVC_INDIRECT(0) t svc##f (t1 a1); \ |
| demayer | 0:6bf0743ece18 | 301 | t svcRtx##f (t1 a1); \ |
| demayer | 0:6bf0743ece18 | 302 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 303 | __STATIC_INLINE t __svc##f (t1 a1) { \ |
| demayer | 0:6bf0743ece18 | 304 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 305 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 306 | return svc##f(a1); \ |
| demayer | 0:6bf0743ece18 | 307 | } |
| demayer | 0:6bf0743ece18 | 308 | |
| demayer | 0:6bf0743ece18 | 309 | #define SVC0_2(f,t,t1,t2) \ |
| demayer | 0:6bf0743ece18 | 310 | __SVC_INDIRECT(0) t svc##f (t1 a1, t2 a2); \ |
| demayer | 0:6bf0743ece18 | 311 | t svcRtx##f (t1 a1, t2 a2); \ |
| demayer | 0:6bf0743ece18 | 312 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 313 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2) { \ |
| demayer | 0:6bf0743ece18 | 314 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 315 | return svc##f(a1,a2); \ |
| demayer | 0:6bf0743ece18 | 316 | } |
| demayer | 0:6bf0743ece18 | 317 | |
| demayer | 0:6bf0743ece18 | 318 | #define SVC0_2M(f,t,t1,t2) \ |
| demayer | 0:6bf0743ece18 | 319 | __SVC_INDIRECT(0) t svc##f (t1 a1, t2 a2); \ |
| demayer | 0:6bf0743ece18 | 320 | t svcRtx##f (t1 a1, t2 a2); \ |
| demayer | 0:6bf0743ece18 | 321 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 322 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2) { \ |
| demayer | 0:6bf0743ece18 | 323 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 324 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 325 | return svc##f(a1,a2); \ |
| demayer | 0:6bf0743ece18 | 326 | } |
| demayer | 0:6bf0743ece18 | 327 | |
| demayer | 0:6bf0743ece18 | 328 | #define SVC0_3(f,t,t1,t2,t3) \ |
| demayer | 0:6bf0743ece18 | 329 | __SVC_INDIRECT(0) t svc##f (t1 a1, t2 a2, t3 a3); \ |
| demayer | 0:6bf0743ece18 | 330 | t svcRtx##f (t1 a1, t2 a2, t3 a3); \ |
| demayer | 0:6bf0743ece18 | 331 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 332 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3) { \ |
| demayer | 0:6bf0743ece18 | 333 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 334 | return svc##f(a1,a2,a3); \ |
| demayer | 0:6bf0743ece18 | 335 | } |
| demayer | 0:6bf0743ece18 | 336 | |
| demayer | 0:6bf0743ece18 | 337 | #define SVC0_3M(f,t,t1,t2,t3) \ |
| demayer | 0:6bf0743ece18 | 338 | __SVC_INDIRECT(0) t svc##f (t1 a1, t2 a2, t3 a3); \ |
| demayer | 0:6bf0743ece18 | 339 | t svcRtx##f (t1 a1, t2 a2, t3 a3); \ |
| demayer | 0:6bf0743ece18 | 340 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 341 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3) { \ |
| demayer | 0:6bf0743ece18 | 342 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 343 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 344 | return svc##f(a1,a2,a3); \ |
| demayer | 0:6bf0743ece18 | 345 | } |
| demayer | 0:6bf0743ece18 | 346 | |
| demayer | 0:6bf0743ece18 | 347 | #define SVC0_4(f,t,t1,t2,t3,t4) \ |
| demayer | 0:6bf0743ece18 | 348 | __SVC_INDIRECT(0) t svc##f (t1 a1, t2 a2, t3 a3, t4 a4); \ |
| demayer | 0:6bf0743ece18 | 349 | t svcRtx##f (t1 a1, t2 a2, t3 a3, t4 a4); \ |
| demayer | 0:6bf0743ece18 | 350 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 351 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) { \ |
| demayer | 0:6bf0743ece18 | 352 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 353 | return svc##f(a1,a2,a3,a4); \ |
| demayer | 0:6bf0743ece18 | 354 | } |
| demayer | 0:6bf0743ece18 | 355 | |
| demayer | 0:6bf0743ece18 | 356 | #define SVC0_4M(f,t,t1,t2,t3,t4) \ |
| demayer | 0:6bf0743ece18 | 357 | __SVC_INDIRECT(0) t svc##f (t1 a1, t2 a2, t3 a3, t4 a4); \ |
| demayer | 0:6bf0743ece18 | 358 | t svcRtx##f (t1 a1, t2 a2, t3 a3, t4 a4); \ |
| demayer | 0:6bf0743ece18 | 359 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 360 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) { \ |
| demayer | 0:6bf0743ece18 | 361 | SVC_SETUP_PSP \ |
| demayer | 0:6bf0743ece18 | 362 | SVC_Setup(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 363 | return svc##f(a1,a2,a3,a4); \ |
| demayer | 0:6bf0743ece18 | 364 | } |
| demayer | 0:6bf0743ece18 | 365 | |
| demayer | 0:6bf0743ece18 | 366 | #else // !(defined(__CC_ARM) || defined(__ICCARM__)) |
| demayer | 0:6bf0743ece18 | 367 | |
| demayer | 0:6bf0743ece18 | 368 | #if ((__ARM_ARCH_7M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 369 | (__ARM_ARCH_7EM__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 370 | (__ARM_ARCH_8M_MAIN__ == 1U)) |
| demayer | 0:6bf0743ece18 | 371 | #define SVC_RegF "r12" |
| demayer | 0:6bf0743ece18 | 372 | #elif ((__ARM_ARCH_6M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 373 | (__ARM_ARCH_8M_BASE__ == 1U)) |
| demayer | 0:6bf0743ece18 | 374 | #define SVC_RegF "r7" |
| demayer | 0:6bf0743ece18 | 375 | #endif |
| demayer | 0:6bf0743ece18 | 376 | |
| demayer | 0:6bf0743ece18 | 377 | #define SVC_ArgN(n) \ |
| demayer | 0:6bf0743ece18 | 378 | register uint32_t __r##n __ASM("r"#n) |
| demayer | 0:6bf0743ece18 | 379 | |
| demayer | 0:6bf0743ece18 | 380 | #define SVC_ArgR(n,a) \ |
| demayer | 0:6bf0743ece18 | 381 | register uint32_t __r##n __ASM("r"#n) = (uint32_t)a |
| demayer | 0:6bf0743ece18 | 382 | |
| demayer | 0:6bf0743ece18 | 383 | #define SVC_ArgF(f) \ |
| demayer | 0:6bf0743ece18 | 384 | register uint32_t __rf __ASM(SVC_RegF) = (uint32_t)f |
| demayer | 0:6bf0743ece18 | 385 | |
| demayer | 0:6bf0743ece18 | 386 | #define SVC_In0 "r"(__rf) |
| demayer | 0:6bf0743ece18 | 387 | #define SVC_In1 "r"(__rf),"r"(__r0) |
| demayer | 0:6bf0743ece18 | 388 | #define SVC_In2 "r"(__rf),"r"(__r0),"r"(__r1) |
| demayer | 0:6bf0743ece18 | 389 | #define SVC_In3 "r"(__rf),"r"(__r0),"r"(__r1),"r"(__r2) |
| demayer | 0:6bf0743ece18 | 390 | #define SVC_In4 "r"(__rf),"r"(__r0),"r"(__r1),"r"(__r2),"r"(__r3) |
| demayer | 0:6bf0743ece18 | 391 | |
| demayer | 0:6bf0743ece18 | 392 | #define SVC_Out0 |
| demayer | 0:6bf0743ece18 | 393 | #define SVC_Out1 "=r"(__r0) |
| demayer | 0:6bf0743ece18 | 394 | #define SVC_Out2 "=r"(__r0),"=r"(__r1) |
| demayer | 0:6bf0743ece18 | 395 | |
| demayer | 0:6bf0743ece18 | 396 | #define SVC_CL0 |
| demayer | 0:6bf0743ece18 | 397 | #define SVC_CL1 "r1" |
| demayer | 0:6bf0743ece18 | 398 | #define SVC_CL2 "r0","r1" |
| demayer | 0:6bf0743ece18 | 399 | |
| demayer | 0:6bf0743ece18 | 400 | #define SVC_Call0(in, out, cl) \ |
| demayer | 0:6bf0743ece18 | 401 | __ASM volatile ("svc 0" : out : in : cl) |
| demayer | 0:6bf0743ece18 | 402 | |
| demayer | 0:6bf0743ece18 | 403 | #if ((__ARM_ARCH_7M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 404 | (__ARM_ARCH_7EM__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 405 | (__ARM_ARCH_8M_MAIN__ == 1U)) |
| demayer | 0:6bf0743ece18 | 406 | #if (__FPU_USED == 1U) |
| demayer | 0:6bf0743ece18 | 407 | #define SVC_Call0M(in, out, cl) \ |
| demayer | 0:6bf0743ece18 | 408 | register uint32_t val; \ |
| demayer | 0:6bf0743ece18 | 409 | __ASM volatile ( \ |
| demayer | 0:6bf0743ece18 | 410 | ".syntax unified\n\t" \ |
| demayer | 0:6bf0743ece18 | 411 | "mrs %[val],control\n\t" \ |
| demayer | 0:6bf0743ece18 | 412 | "tst %[val],#2\n\t" \ |
| demayer | 0:6bf0743ece18 | 413 | "bne 0f\n\t" \ |
| demayer | 0:6bf0743ece18 | 414 | "tst %[val],#4\n\t" \ |
| demayer | 0:6bf0743ece18 | 415 | "mrs %[val],msp\n\t" \ |
| demayer | 0:6bf0743ece18 | 416 | "ite eq\n\t" \ |
| demayer | 0:6bf0743ece18 | 417 | "subeq %[val],#32\n\t" \ |
| demayer | 0:6bf0743ece18 | 418 | "subne %[val],#104\n\t" \ |
| demayer | 0:6bf0743ece18 | 419 | "bic %[val],#7\n\t" \ |
| demayer | 0:6bf0743ece18 | 420 | "msr psp,%[val]\n\t" \ |
| demayer | 0:6bf0743ece18 | 421 | "0:\n\t" \ |
| demayer | 0:6bf0743ece18 | 422 | "svc 0" \ |
| demayer | 0:6bf0743ece18 | 423 | : out, [val] "=&l" (val) : in : cl) |
| demayer | 0:6bf0743ece18 | 424 | #else |
| demayer | 0:6bf0743ece18 | 425 | #define SVC_Call0M(in, out, cl) \ |
| demayer | 0:6bf0743ece18 | 426 | register uint32_t val; \ |
| demayer | 0:6bf0743ece18 | 427 | __ASM volatile ( \ |
| demayer | 0:6bf0743ece18 | 428 | ".syntax unified\n\t" \ |
| demayer | 0:6bf0743ece18 | 429 | "mrs %[val],control\n\t" \ |
| demayer | 0:6bf0743ece18 | 430 | "tst %[val],#2\n\t" \ |
| demayer | 0:6bf0743ece18 | 431 | "bne 0f\n\t" \ |
| demayer | 0:6bf0743ece18 | 432 | "mrs %[val],msp\n\t" \ |
| demayer | 0:6bf0743ece18 | 433 | "subs %[val],#32\n\t" \ |
| demayer | 0:6bf0743ece18 | 434 | "bic %[val],#7\n\t" \ |
| demayer | 0:6bf0743ece18 | 435 | "msr psp,%[val]\n\t" \ |
| demayer | 0:6bf0743ece18 | 436 | "0:\n\t" \ |
| demayer | 0:6bf0743ece18 | 437 | "svc 0" \ |
| demayer | 0:6bf0743ece18 | 438 | : out, [val] "=&l" (val) : in : cl) |
| demayer | 0:6bf0743ece18 | 439 | #endif |
| demayer | 0:6bf0743ece18 | 440 | #elif ((__ARM_ARCH_6M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 441 | (__ARM_ARCH_8M_BASE__ == 1U)) |
| demayer | 0:6bf0743ece18 | 442 | #define SVC_Call0M(in, out, cl) \ |
| demayer | 0:6bf0743ece18 | 443 | register uint32_t val; \ |
| demayer | 0:6bf0743ece18 | 444 | __ASM volatile ( \ |
| demayer | 0:6bf0743ece18 | 445 | ".syntax unified\n\t" \ |
| demayer | 0:6bf0743ece18 | 446 | "mrs %[val],control\n\t" \ |
| demayer | 0:6bf0743ece18 | 447 | "lsls %[val],#30\n\t" \ |
| demayer | 0:6bf0743ece18 | 448 | "bmi 0f\n\t" \ |
| demayer | 0:6bf0743ece18 | 449 | "mrs %[val],msp\n\t" \ |
| demayer | 0:6bf0743ece18 | 450 | "subs %[val],#32\n\t" \ |
| demayer | 0:6bf0743ece18 | 451 | "lsrs %[val],#3\n\t" \ |
| demayer | 0:6bf0743ece18 | 452 | "lsls %[val],#3\n\t" \ |
| demayer | 0:6bf0743ece18 | 453 | "msr psp,%[val]\n\t" \ |
| demayer | 0:6bf0743ece18 | 454 | "0:\n\t" \ |
| demayer | 0:6bf0743ece18 | 455 | "svc 0" \ |
| demayer | 0:6bf0743ece18 | 456 | : out, [val] "=&l" (val) : in : cl) |
| demayer | 0:6bf0743ece18 | 457 | #endif |
| demayer | 0:6bf0743ece18 | 458 | |
| demayer | 0:6bf0743ece18 | 459 | #define SVC0_0N(f,t) \ |
| demayer | 0:6bf0743ece18 | 460 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 461 | __STATIC_INLINE t __svc##f (void) { \ |
| demayer | 0:6bf0743ece18 | 462 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 463 | SVC_Call0(SVC_In0, SVC_Out0, SVC_CL2); \ |
| demayer | 0:6bf0743ece18 | 464 | } |
| demayer | 0:6bf0743ece18 | 465 | |
| demayer | 0:6bf0743ece18 | 466 | #define SVC0_0(f,t) \ |
| demayer | 0:6bf0743ece18 | 467 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 468 | __STATIC_INLINE t __svc##f (void) { \ |
| demayer | 0:6bf0743ece18 | 469 | SVC_ArgN(0); \ |
| demayer | 0:6bf0743ece18 | 470 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 471 | SVC_Call0(SVC_In0, SVC_Out1, SVC_CL1); \ |
| demayer | 0:6bf0743ece18 | 472 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 473 | } |
| demayer | 0:6bf0743ece18 | 474 | |
| demayer | 0:6bf0743ece18 | 475 | #define SVC0_0M(f,t) \ |
| demayer | 0:6bf0743ece18 | 476 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 477 | __STATIC_INLINE t __svc##f (void) { \ |
| demayer | 0:6bf0743ece18 | 478 | SVC_ArgN(0); \ |
| demayer | 0:6bf0743ece18 | 479 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 480 | SVC_Call0M(SVC_In0, SVC_Out1, SVC_CL1); \ |
| demayer | 0:6bf0743ece18 | 481 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 482 | } |
| demayer | 0:6bf0743ece18 | 483 | |
| demayer | 0:6bf0743ece18 | 484 | #define SVC0_1N(f,t,t1) \ |
| demayer | 0:6bf0743ece18 | 485 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 486 | __STATIC_INLINE t __svc##f (t1 a1) { \ |
| demayer | 0:6bf0743ece18 | 487 | SVC_ArgR(0,a1); \ |
| demayer | 0:6bf0743ece18 | 488 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 489 | SVC_Call0(SVC_In1, SVC_Out0, SVC_CL1); \ |
| demayer | 0:6bf0743ece18 | 490 | } |
| demayer | 0:6bf0743ece18 | 491 | |
| demayer | 0:6bf0743ece18 | 492 | #define SVC0_1(f,t,t1) \ |
| demayer | 0:6bf0743ece18 | 493 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 494 | __STATIC_INLINE t __svc##f (t1 a1) { \ |
| demayer | 0:6bf0743ece18 | 495 | SVC_ArgR(0,a1); \ |
| demayer | 0:6bf0743ece18 | 496 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 497 | SVC_Call0(SVC_In1, SVC_Out1, SVC_CL1); \ |
| demayer | 0:6bf0743ece18 | 498 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 499 | } |
| demayer | 0:6bf0743ece18 | 500 | |
| demayer | 0:6bf0743ece18 | 501 | #define SVC0_1M(f,t,t1) \ |
| demayer | 0:6bf0743ece18 | 502 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 503 | __STATIC_INLINE t __svc##f (t1 a1) { \ |
| demayer | 0:6bf0743ece18 | 504 | SVC_ArgR(0,a1); \ |
| demayer | 0:6bf0743ece18 | 505 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 506 | SVC_Call0M(SVC_In1, SVC_Out1, SVC_CL1); \ |
| demayer | 0:6bf0743ece18 | 507 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 508 | } |
| demayer | 0:6bf0743ece18 | 509 | |
| demayer | 0:6bf0743ece18 | 510 | #define SVC0_2(f,t,t1,t2) \ |
| demayer | 0:6bf0743ece18 | 511 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 512 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2) { \ |
| demayer | 0:6bf0743ece18 | 513 | SVC_ArgR(0,a1); \ |
| demayer | 0:6bf0743ece18 | 514 | SVC_ArgR(1,a2); \ |
| demayer | 0:6bf0743ece18 | 515 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 516 | SVC_Call0(SVC_In2, SVC_Out1, SVC_CL0); \ |
| demayer | 0:6bf0743ece18 | 517 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 518 | } |
| demayer | 0:6bf0743ece18 | 519 | |
| demayer | 0:6bf0743ece18 | 520 | #define SVC0_2M(f,t,t1,t2) \ |
| demayer | 0:6bf0743ece18 | 521 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 522 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2) { \ |
| demayer | 0:6bf0743ece18 | 523 | SVC_ArgR(0,a1); \ |
| demayer | 0:6bf0743ece18 | 524 | SVC_ArgR(1,a2); \ |
| demayer | 0:6bf0743ece18 | 525 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 526 | SVC_Call0M(SVC_In2, SVC_Out1, SVC_CL0); \ |
| demayer | 0:6bf0743ece18 | 527 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 528 | } |
| demayer | 0:6bf0743ece18 | 529 | |
| demayer | 0:6bf0743ece18 | 530 | #define SVC0_3(f,t,t1,t2,t3) \ |
| demayer | 0:6bf0743ece18 | 531 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 532 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3) { \ |
| demayer | 0:6bf0743ece18 | 533 | SVC_ArgR(0,a1); \ |
| demayer | 0:6bf0743ece18 | 534 | SVC_ArgR(1,a2); \ |
| demayer | 0:6bf0743ece18 | 535 | SVC_ArgR(2,a3); \ |
| demayer | 0:6bf0743ece18 | 536 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 537 | SVC_Call0(SVC_In3, SVC_Out1, SVC_CL0); \ |
| demayer | 0:6bf0743ece18 | 538 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 539 | } |
| demayer | 0:6bf0743ece18 | 540 | |
| demayer | 0:6bf0743ece18 | 541 | #define SVC0_3M(f,t,t1,t2,t3) \ |
| demayer | 0:6bf0743ece18 | 542 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 543 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3) { \ |
| demayer | 0:6bf0743ece18 | 544 | SVC_ArgR(0,a1); \ |
| demayer | 0:6bf0743ece18 | 545 | SVC_ArgR(1,a2); \ |
| demayer | 0:6bf0743ece18 | 546 | SVC_ArgR(2,a3); \ |
| demayer | 0:6bf0743ece18 | 547 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 548 | SVC_Call0M(SVC_In3, SVC_Out1, SVC_CL0); \ |
| demayer | 0:6bf0743ece18 | 549 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 550 | } |
| demayer | 0:6bf0743ece18 | 551 | |
| demayer | 0:6bf0743ece18 | 552 | #define SVC0_4(f,t,t1,t2,t3,t4) \ |
| demayer | 0:6bf0743ece18 | 553 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 554 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) { \ |
| demayer | 0:6bf0743ece18 | 555 | SVC_ArgR(0,a1); \ |
| demayer | 0:6bf0743ece18 | 556 | SVC_ArgR(1,a2); \ |
| demayer | 0:6bf0743ece18 | 557 | SVC_ArgR(2,a3); \ |
| demayer | 0:6bf0743ece18 | 558 | SVC_ArgR(3,a4); \ |
| demayer | 0:6bf0743ece18 | 559 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 560 | SVC_Call0(SVC_In4, SVC_Out1, SVC_CL0); \ |
| demayer | 0:6bf0743ece18 | 561 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 562 | } |
| demayer | 0:6bf0743ece18 | 563 | |
| demayer | 0:6bf0743ece18 | 564 | #define SVC0_4M(f,t,t1,t2,t3,t4) \ |
| demayer | 0:6bf0743ece18 | 565 | __attribute__((always_inline)) \ |
| demayer | 0:6bf0743ece18 | 566 | __STATIC_INLINE t __svc##f (t1 a1, t2 a2, t3 a3, t4 a4) { \ |
| demayer | 0:6bf0743ece18 | 567 | SVC_ArgR(0,a1); \ |
| demayer | 0:6bf0743ece18 | 568 | SVC_ArgR(1,a2); \ |
| demayer | 0:6bf0743ece18 | 569 | SVC_ArgR(2,a3); \ |
| demayer | 0:6bf0743ece18 | 570 | SVC_ArgR(3,a4); \ |
| demayer | 0:6bf0743ece18 | 571 | SVC_ArgF(svcRtx##f); \ |
| demayer | 0:6bf0743ece18 | 572 | SVC_Call0M(SVC_In4, SVC_Out1, SVC_CL0); \ |
| demayer | 0:6bf0743ece18 | 573 | return (t) __r0; \ |
| demayer | 0:6bf0743ece18 | 574 | } |
| demayer | 0:6bf0743ece18 | 575 | |
| demayer | 0:6bf0743ece18 | 576 | #endif |
| demayer | 0:6bf0743ece18 | 577 | |
| demayer | 0:6bf0743ece18 | 578 | |
| demayer | 0:6bf0743ece18 | 579 | // ==== Core Peripherals functions ==== |
| demayer | 0:6bf0743ece18 | 580 | |
| demayer | 0:6bf0743ece18 | 581 | /// Initialize SVC and PendSV System Service Calls |
| demayer | 0:6bf0743ece18 | 582 | __STATIC_INLINE void SVC_Initialize (void) { |
| demayer | 0:6bf0743ece18 | 583 | #if ((__ARM_ARCH_8M_MAIN__ == 1U) || (defined(__CORTEX_M) && (__CORTEX_M == 7U))) |
| demayer | 0:6bf0743ece18 | 584 | uint32_t p, n; |
| demayer | 0:6bf0743ece18 | 585 | |
| demayer | 0:6bf0743ece18 | 586 | SCB->SHPR[10] = 0xFFU; |
| demayer | 0:6bf0743ece18 | 587 | n = 32U - (uint32_t)__CLZ(~(SCB->SHPR[10] | 0xFFFFFF00U)); |
| demayer | 0:6bf0743ece18 | 588 | p = NVIC_GetPriorityGrouping(); |
| demayer | 0:6bf0743ece18 | 589 | if (p >= n) { |
| demayer | 0:6bf0743ece18 | 590 | n = p + 1U; |
| demayer | 0:6bf0743ece18 | 591 | } |
| demayer | 0:6bf0743ece18 | 592 | SCB->SHPR[7] = (uint8_t)(0xFEU << n); |
| demayer | 0:6bf0743ece18 | 593 | #elif (__ARM_ARCH_8M_BASE__ == 1U) |
| demayer | 0:6bf0743ece18 | 594 | uint32_t n; |
| demayer | 0:6bf0743ece18 | 595 | |
| demayer | 0:6bf0743ece18 | 596 | SCB->SHPR[1] |= 0x00FF0000U; |
| demayer | 0:6bf0743ece18 | 597 | n = SCB->SHPR[1]; |
| demayer | 0:6bf0743ece18 | 598 | SCB->SHPR[0] |= (n << (8+1)) & 0xFC000000U; |
| demayer | 0:6bf0743ece18 | 599 | #elif ((__ARM_ARCH_7M__ == 1U) || \ |
| demayer | 0:6bf0743ece18 | 600 | (__ARM_ARCH_7EM__ == 1U)) |
| demayer | 0:6bf0743ece18 | 601 | uint32_t p, n; |
| demayer | 0:6bf0743ece18 | 602 | |
| demayer | 0:6bf0743ece18 | 603 | SCB->SHP[10] = 0xFFU; |
| demayer | 0:6bf0743ece18 | 604 | n = 32U - (uint32_t)__CLZ(~(SCB->SHP[10] | 0xFFFFFF00U)); |
| demayer | 0:6bf0743ece18 | 605 | p = NVIC_GetPriorityGrouping(); |
| demayer | 0:6bf0743ece18 | 606 | if (p >= n) { |
| demayer | 0:6bf0743ece18 | 607 | n = p + 1U; |
| demayer | 0:6bf0743ece18 | 608 | } |
| demayer | 0:6bf0743ece18 | 609 | |
| demayer | 0:6bf0743ece18 | 610 | /* Only change the SVCall priority if uVisor is not present. */ |
| demayer | 0:6bf0743ece18 | 611 | #if !(defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED)) |
| demayer | 0:6bf0743ece18 | 612 | SCB->SHP[7] = (uint8_t)(0xFEU << n); |
| demayer | 0:6bf0743ece18 | 613 | #endif |
| demayer | 0:6bf0743ece18 | 614 | #elif (__ARM_ARCH_6M__ == 1U) |
| demayer | 0:6bf0743ece18 | 615 | uint32_t n; |
| demayer | 0:6bf0743ece18 | 616 | |
| demayer | 0:6bf0743ece18 | 617 | SCB->SHP[1] |= 0x00FF0000U; |
| demayer | 0:6bf0743ece18 | 618 | n = SCB->SHP[1]; |
| demayer | 0:6bf0743ece18 | 619 | SCB->SHP[0] |= (n << (8+1)) & 0xFC000000U; |
| demayer | 0:6bf0743ece18 | 620 | #endif |
| demayer | 0:6bf0743ece18 | 621 | } |
| demayer | 0:6bf0743ece18 | 622 | |
| demayer | 0:6bf0743ece18 | 623 | /// Get Pending SV (Service Call) Flag |
| demayer | 0:6bf0743ece18 | 624 | /// \return Pending SV Flag |
| demayer | 0:6bf0743ece18 | 625 | __STATIC_INLINE uint8_t GetPendSV (void) { |
| demayer | 0:6bf0743ece18 | 626 | return ((uint8_t)((SCB->ICSR & (SCB_ICSR_PENDSVSET_Msk)) >> 24)); |
| demayer | 0:6bf0743ece18 | 627 | } |
| demayer | 0:6bf0743ece18 | 628 | |
| demayer | 0:6bf0743ece18 | 629 | /// Clear Pending SV (Service Call) Flag |
| demayer | 0:6bf0743ece18 | 630 | __STATIC_INLINE void ClrPendSV (void) { |
| demayer | 0:6bf0743ece18 | 631 | SCB->ICSR = SCB_ICSR_PENDSVCLR_Msk; |
| demayer | 0:6bf0743ece18 | 632 | } |
| demayer | 0:6bf0743ece18 | 633 | |
| demayer | 0:6bf0743ece18 | 634 | /// Set Pending SV (Service Call) Flag |
| demayer | 0:6bf0743ece18 | 635 | __STATIC_INLINE void SetPendSV (void) { |
| demayer | 0:6bf0743ece18 | 636 | SCB->ICSR = SCB_ICSR_PENDSVSET_Msk; |
| demayer | 0:6bf0743ece18 | 637 | } |
| demayer | 0:6bf0743ece18 | 638 | |
| demayer | 0:6bf0743ece18 | 639 | |
| demayer | 0:6bf0743ece18 | 640 | // ==== Exclusive Access Operation ==== |
| demayer | 0:6bf0743ece18 | 641 | |
| demayer | 0:6bf0743ece18 | 642 | #if (__EXCLUSIVE_ACCESS == 1U) |
| demayer | 0:6bf0743ece18 | 643 | |
| demayer | 0:6bf0743ece18 | 644 | /// Atomic Access Operation: Write (8-bit) |
| demayer | 0:6bf0743ece18 | 645 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 646 | /// \param[in] val Value to write |
| demayer | 0:6bf0743ece18 | 647 | /// \return Previous value |
| demayer | 0:6bf0743ece18 | 648 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 649 | static __asm uint8_t atomic_wr8 (uint8_t *mem, uint8_t val) { |
| demayer | 0:6bf0743ece18 | 650 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 651 | 1 |
| demayer | 0:6bf0743ece18 | 652 | ldrexb r0,[r2] |
| demayer | 0:6bf0743ece18 | 653 | strexb r3,r1,[r2] |
| demayer | 0:6bf0743ece18 | 654 | cbz r3,%F2 |
| demayer | 0:6bf0743ece18 | 655 | b %B1 |
| demayer | 0:6bf0743ece18 | 656 | 2 |
| demayer | 0:6bf0743ece18 | 657 | bx lr |
| demayer | 0:6bf0743ece18 | 658 | } |
| demayer | 0:6bf0743ece18 | 659 | #else |
| demayer | 0:6bf0743ece18 | 660 | __STATIC_INLINE uint8_t atomic_wr8 (uint8_t *mem, uint8_t val) { |
| demayer | 0:6bf0743ece18 | 661 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 662 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 663 | #endif |
| demayer | 0:6bf0743ece18 | 664 | register uint32_t res; |
| demayer | 0:6bf0743ece18 | 665 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 666 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 667 | #endif |
| demayer | 0:6bf0743ece18 | 668 | register uint8_t ret; |
| demayer | 0:6bf0743ece18 | 669 | |
| demayer | 0:6bf0743ece18 | 670 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 671 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 672 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 673 | #endif |
| demayer | 0:6bf0743ece18 | 674 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 675 | "ldrexb %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 676 | "strexb %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 677 | "cbz %[res],2f\n\t" |
| demayer | 0:6bf0743ece18 | 678 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 679 | "2:" |
| demayer | 0:6bf0743ece18 | 680 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 681 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 682 | : [mem] "l" (mem), |
| demayer | 0:6bf0743ece18 | 683 | [val] "l" (val) |
| demayer | 0:6bf0743ece18 | 684 | : "memory" |
| demayer | 0:6bf0743ece18 | 685 | ); |
| demayer | 0:6bf0743ece18 | 686 | |
| demayer | 0:6bf0743ece18 | 687 | return ret; |
| demayer | 0:6bf0743ece18 | 688 | } |
| demayer | 0:6bf0743ece18 | 689 | #endif |
| demayer | 0:6bf0743ece18 | 690 | |
| demayer | 0:6bf0743ece18 | 691 | /// Atomic Access Operation: Set bits (32-bit) |
| demayer | 0:6bf0743ece18 | 692 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 693 | /// \param[in] bits Bit mask |
| demayer | 0:6bf0743ece18 | 694 | /// \return New value |
| demayer | 0:6bf0743ece18 | 695 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 696 | static __asm uint32_t atomic_set32 (uint32_t *mem, uint32_t bits) { |
| demayer | 0:6bf0743ece18 | 697 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 698 | 1 |
| demayer | 0:6bf0743ece18 | 699 | ldrex r0,[r2] |
| demayer | 0:6bf0743ece18 | 700 | orr r0,r0,r1 |
| demayer | 0:6bf0743ece18 | 701 | strex r3,r0,[r2] |
| demayer | 0:6bf0743ece18 | 702 | cbz r3,%F2 |
| demayer | 0:6bf0743ece18 | 703 | b %B1 |
| demayer | 0:6bf0743ece18 | 704 | 2 |
| demayer | 0:6bf0743ece18 | 705 | bx lr |
| demayer | 0:6bf0743ece18 | 706 | } |
| demayer | 0:6bf0743ece18 | 707 | #else |
| demayer | 0:6bf0743ece18 | 708 | __STATIC_INLINE uint32_t atomic_set32 (uint32_t *mem, uint32_t bits) { |
| demayer | 0:6bf0743ece18 | 709 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 710 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 711 | #endif |
| demayer | 0:6bf0743ece18 | 712 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 713 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 714 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 715 | #endif |
| demayer | 0:6bf0743ece18 | 716 | register uint32_t ret; |
| demayer | 0:6bf0743ece18 | 717 | |
| demayer | 0:6bf0743ece18 | 718 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 719 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 720 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 721 | #endif |
| demayer | 0:6bf0743ece18 | 722 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 723 | "ldrex %[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 724 | #if (__ARM_ARCH_8M_BASE__ == 1U) |
| demayer | 0:6bf0743ece18 | 725 | "mov %[ret],%[val]\n\t" |
| demayer | 0:6bf0743ece18 | 726 | "orrs %[ret],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 727 | #else |
| demayer | 0:6bf0743ece18 | 728 | "orr %[ret],%[val],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 729 | #endif |
| demayer | 0:6bf0743ece18 | 730 | "strex %[res],%[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 731 | "cbz %[res],2f\n\t" |
| demayer | 0:6bf0743ece18 | 732 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 733 | "2:" |
| demayer | 0:6bf0743ece18 | 734 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 735 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 736 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 737 | : [mem] "l" (mem), |
| demayer | 0:6bf0743ece18 | 738 | [bits] "l" (bits) |
| demayer | 0:6bf0743ece18 | 739 | #if (__ARM_ARCH_8M_BASE__ == 1U) |
| demayer | 0:6bf0743ece18 | 740 | : "memory", "cc" |
| demayer | 0:6bf0743ece18 | 741 | #else |
| demayer | 0:6bf0743ece18 | 742 | : "memory" |
| demayer | 0:6bf0743ece18 | 743 | #endif |
| demayer | 0:6bf0743ece18 | 744 | ); |
| demayer | 0:6bf0743ece18 | 745 | |
| demayer | 0:6bf0743ece18 | 746 | return ret; |
| demayer | 0:6bf0743ece18 | 747 | } |
| demayer | 0:6bf0743ece18 | 748 | #endif |
| demayer | 0:6bf0743ece18 | 749 | |
| demayer | 0:6bf0743ece18 | 750 | /// Atomic Access Operation: Clear bits (32-bit) |
| demayer | 0:6bf0743ece18 | 751 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 752 | /// \param[in] bits Bit mask |
| demayer | 0:6bf0743ece18 | 753 | /// \return Previous value |
| demayer | 0:6bf0743ece18 | 754 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 755 | static __asm uint32_t atomic_clr32 (uint32_t *mem, uint32_t bits) { |
| demayer | 0:6bf0743ece18 | 756 | push {r4,lr} |
| demayer | 0:6bf0743ece18 | 757 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 758 | 1 |
| demayer | 0:6bf0743ece18 | 759 | ldrex r0,[r2] |
| demayer | 0:6bf0743ece18 | 760 | bic r4,r0,r1 |
| demayer | 0:6bf0743ece18 | 761 | strex r3,r4,[r2] |
| demayer | 0:6bf0743ece18 | 762 | cbz r3,%F2 |
| demayer | 0:6bf0743ece18 | 763 | b %B1 |
| demayer | 0:6bf0743ece18 | 764 | 2 |
| demayer | 0:6bf0743ece18 | 765 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 766 | } |
| demayer | 0:6bf0743ece18 | 767 | #else |
| demayer | 0:6bf0743ece18 | 768 | __STATIC_INLINE uint32_t atomic_clr32 (uint32_t *mem, uint32_t bits) { |
| demayer | 0:6bf0743ece18 | 769 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 770 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 771 | #endif |
| demayer | 0:6bf0743ece18 | 772 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 773 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 774 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 775 | #endif |
| demayer | 0:6bf0743ece18 | 776 | register uint32_t ret; |
| demayer | 0:6bf0743ece18 | 777 | |
| demayer | 0:6bf0743ece18 | 778 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 779 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 780 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 781 | #endif |
| demayer | 0:6bf0743ece18 | 782 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 783 | "ldrex %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 784 | #if (__ARM_ARCH_8M_BASE__ == 1U) |
| demayer | 0:6bf0743ece18 | 785 | "mov %[val],%[ret]\n\t" |
| demayer | 0:6bf0743ece18 | 786 | "bics %[val],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 787 | #else |
| demayer | 0:6bf0743ece18 | 788 | "bic %[val],%[ret],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 789 | #endif |
| demayer | 0:6bf0743ece18 | 790 | "strex %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 791 | "cbz %[res],2f\n\t" |
| demayer | 0:6bf0743ece18 | 792 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 793 | "2:" |
| demayer | 0:6bf0743ece18 | 794 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 795 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 796 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 797 | : [mem] "l" (mem), |
| demayer | 0:6bf0743ece18 | 798 | [bits] "l" (bits) |
| demayer | 0:6bf0743ece18 | 799 | #if (__ARM_ARCH_8M_BASE__ == 1U) |
| demayer | 0:6bf0743ece18 | 800 | : "memory", "cc" |
| demayer | 0:6bf0743ece18 | 801 | #else |
| demayer | 0:6bf0743ece18 | 802 | : "memory" |
| demayer | 0:6bf0743ece18 | 803 | #endif |
| demayer | 0:6bf0743ece18 | 804 | ); |
| demayer | 0:6bf0743ece18 | 805 | |
| demayer | 0:6bf0743ece18 | 806 | return ret; |
| demayer | 0:6bf0743ece18 | 807 | } |
| demayer | 0:6bf0743ece18 | 808 | #endif |
| demayer | 0:6bf0743ece18 | 809 | |
| demayer | 0:6bf0743ece18 | 810 | /// Atomic Access Operation: Check if all specified bits (32-bit) are active and clear them |
| demayer | 0:6bf0743ece18 | 811 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 812 | /// \param[in] bits Bit mask |
| demayer | 0:6bf0743ece18 | 813 | /// \return Active bits before clearing or 0 if not active |
| demayer | 0:6bf0743ece18 | 814 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 815 | static __asm uint32_t atomic_chk32_all (uint32_t *mem, uint32_t bits) { |
| demayer | 0:6bf0743ece18 | 816 | push {r4,lr} |
| demayer | 0:6bf0743ece18 | 817 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 818 | 1 |
| demayer | 0:6bf0743ece18 | 819 | ldrex r0,[r2] |
| demayer | 0:6bf0743ece18 | 820 | and r4,r0,r1 |
| demayer | 0:6bf0743ece18 | 821 | cmp r4,r1 |
| demayer | 0:6bf0743ece18 | 822 | beq %F2 |
| demayer | 0:6bf0743ece18 | 823 | clrex |
| demayer | 0:6bf0743ece18 | 824 | movs r0,#0 |
| demayer | 0:6bf0743ece18 | 825 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 826 | 2 |
| demayer | 0:6bf0743ece18 | 827 | bic r4,r0,r1 |
| demayer | 0:6bf0743ece18 | 828 | strex r3,r4,[r2] |
| demayer | 0:6bf0743ece18 | 829 | cbz r3,%F3 |
| demayer | 0:6bf0743ece18 | 830 | b %B1 |
| demayer | 0:6bf0743ece18 | 831 | 3 |
| demayer | 0:6bf0743ece18 | 832 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 833 | } |
| demayer | 0:6bf0743ece18 | 834 | #else |
| demayer | 0:6bf0743ece18 | 835 | __STATIC_INLINE uint32_t atomic_chk32_all (uint32_t *mem, uint32_t bits) { |
| demayer | 0:6bf0743ece18 | 836 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 837 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 838 | #endif |
| demayer | 0:6bf0743ece18 | 839 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 840 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 841 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 842 | #endif |
| demayer | 0:6bf0743ece18 | 843 | register uint32_t ret; |
| demayer | 0:6bf0743ece18 | 844 | |
| demayer | 0:6bf0743ece18 | 845 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 846 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 847 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 848 | #endif |
| demayer | 0:6bf0743ece18 | 849 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 850 | "ldrex %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 851 | #if (__ARM_ARCH_8M_BASE__ == 1U) |
| demayer | 0:6bf0743ece18 | 852 | "mov %[val],%[ret]\n\t" |
| demayer | 0:6bf0743ece18 | 853 | "ands %[val],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 854 | #else |
| demayer | 0:6bf0743ece18 | 855 | "and %[val],%[ret],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 856 | #endif |
| demayer | 0:6bf0743ece18 | 857 | "cmp %[val],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 858 | "beq 2f\n\t" |
| demayer | 0:6bf0743ece18 | 859 | "clrex\n\t" |
| demayer | 0:6bf0743ece18 | 860 | "movs %[ret],#0\n\t" |
| demayer | 0:6bf0743ece18 | 861 | "b 3f\n" |
| demayer | 0:6bf0743ece18 | 862 | "2:\n\t" |
| demayer | 0:6bf0743ece18 | 863 | #if (__ARM_ARCH_8M_BASE__ == 1U) |
| demayer | 0:6bf0743ece18 | 864 | "mov %[val],%[ret]\n\t" |
| demayer | 0:6bf0743ece18 | 865 | "bics %[val],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 866 | #else |
| demayer | 0:6bf0743ece18 | 867 | "bic %[val],%[ret],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 868 | #endif |
| demayer | 0:6bf0743ece18 | 869 | "strex %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 870 | "cbz %[res],3f\n\t" |
| demayer | 0:6bf0743ece18 | 871 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 872 | "3:" |
| demayer | 0:6bf0743ece18 | 873 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 874 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 875 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 876 | : [mem] "l" (mem), |
| demayer | 0:6bf0743ece18 | 877 | [bits] "l" (bits) |
| demayer | 0:6bf0743ece18 | 878 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 879 | ); |
| demayer | 0:6bf0743ece18 | 880 | |
| demayer | 0:6bf0743ece18 | 881 | return ret; |
| demayer | 0:6bf0743ece18 | 882 | } |
| demayer | 0:6bf0743ece18 | 883 | #endif |
| demayer | 0:6bf0743ece18 | 884 | |
| demayer | 0:6bf0743ece18 | 885 | /// Atomic Access Operation: Check if any specified bits (32-bit) are active and clear them |
| demayer | 0:6bf0743ece18 | 886 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 887 | /// \param[in] bits Bit mask |
| demayer | 0:6bf0743ece18 | 888 | /// \return Active bits before clearing or 0 if not active |
| demayer | 0:6bf0743ece18 | 889 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 890 | static __asm uint32_t atomic_chk32_any (uint32_t *mem, uint32_t bits) { |
| demayer | 0:6bf0743ece18 | 891 | push {r4,lr} |
| demayer | 0:6bf0743ece18 | 892 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 893 | 1 |
| demayer | 0:6bf0743ece18 | 894 | ldrex r0,[r2] |
| demayer | 0:6bf0743ece18 | 895 | tst r0,r1 |
| demayer | 0:6bf0743ece18 | 896 | bne %F2 |
| demayer | 0:6bf0743ece18 | 897 | clrex |
| demayer | 0:6bf0743ece18 | 898 | movs r0,#0 |
| demayer | 0:6bf0743ece18 | 899 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 900 | 2 |
| demayer | 0:6bf0743ece18 | 901 | bic r4,r0,r1 |
| demayer | 0:6bf0743ece18 | 902 | strex r3,r4,[r2] |
| demayer | 0:6bf0743ece18 | 903 | cbz r3,%F3 |
| demayer | 0:6bf0743ece18 | 904 | b %B1 |
| demayer | 0:6bf0743ece18 | 905 | 3 |
| demayer | 0:6bf0743ece18 | 906 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 907 | } |
| demayer | 0:6bf0743ece18 | 908 | #else |
| demayer | 0:6bf0743ece18 | 909 | __STATIC_INLINE uint32_t atomic_chk32_any (uint32_t *mem, uint32_t bits) { |
| demayer | 0:6bf0743ece18 | 910 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 911 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 912 | #endif |
| demayer | 0:6bf0743ece18 | 913 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 914 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 915 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 916 | #endif |
| demayer | 0:6bf0743ece18 | 917 | register uint32_t ret; |
| demayer | 0:6bf0743ece18 | 918 | |
| demayer | 0:6bf0743ece18 | 919 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 920 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 921 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 922 | #endif |
| demayer | 0:6bf0743ece18 | 923 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 924 | "ldrex %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 925 | "tst %[ret],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 926 | "bne 2f\n\t" |
| demayer | 0:6bf0743ece18 | 927 | "clrex\n\t" |
| demayer | 0:6bf0743ece18 | 928 | "movs %[ret],#0\n\t" |
| demayer | 0:6bf0743ece18 | 929 | "b 3f\n" |
| demayer | 0:6bf0743ece18 | 930 | "2:\n\t" |
| demayer | 0:6bf0743ece18 | 931 | #if (__ARM_ARCH_8M_BASE__ == 1U) |
| demayer | 0:6bf0743ece18 | 932 | "mov %[val],%[ret]\n\t" |
| demayer | 0:6bf0743ece18 | 933 | "bics %[val],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 934 | #else |
| demayer | 0:6bf0743ece18 | 935 | "bic %[val],%[ret],%[bits]\n\t" |
| demayer | 0:6bf0743ece18 | 936 | #endif |
| demayer | 0:6bf0743ece18 | 937 | "strex %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 938 | "cbz %[res],3f\n\t" |
| demayer | 0:6bf0743ece18 | 939 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 940 | "3:" |
| demayer | 0:6bf0743ece18 | 941 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 942 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 943 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 944 | : [mem] "l" (mem), |
| demayer | 0:6bf0743ece18 | 945 | [bits] "l" (bits) |
| demayer | 0:6bf0743ece18 | 946 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 947 | ); |
| demayer | 0:6bf0743ece18 | 948 | |
| demayer | 0:6bf0743ece18 | 949 | return ret; |
| demayer | 0:6bf0743ece18 | 950 | } |
| demayer | 0:6bf0743ece18 | 951 | #endif |
| demayer | 0:6bf0743ece18 | 952 | |
| demayer | 0:6bf0743ece18 | 953 | /// Atomic Access Operation: Increment (32-bit) |
| demayer | 0:6bf0743ece18 | 954 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 955 | /// \return Previous value |
| demayer | 0:6bf0743ece18 | 956 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 957 | static __asm uint32_t atomic_inc32 (uint32_t *mem) { |
| demayer | 0:6bf0743ece18 | 958 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 959 | 1 |
| demayer | 0:6bf0743ece18 | 960 | ldrex r0,[r2] |
| demayer | 0:6bf0743ece18 | 961 | adds r1,r0,#1 |
| demayer | 0:6bf0743ece18 | 962 | strex r3,r1,[r2] |
| demayer | 0:6bf0743ece18 | 963 | cbz r3,%F2 |
| demayer | 0:6bf0743ece18 | 964 | b %B1 |
| demayer | 0:6bf0743ece18 | 965 | 2 |
| demayer | 0:6bf0743ece18 | 966 | bx lr |
| demayer | 0:6bf0743ece18 | 967 | } |
| demayer | 0:6bf0743ece18 | 968 | #else |
| demayer | 0:6bf0743ece18 | 969 | __STATIC_INLINE uint32_t atomic_inc32 (uint32_t *mem) { |
| demayer | 0:6bf0743ece18 | 970 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 971 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 972 | #endif |
| demayer | 0:6bf0743ece18 | 973 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 974 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 975 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 976 | #endif |
| demayer | 0:6bf0743ece18 | 977 | register uint32_t ret; |
| demayer | 0:6bf0743ece18 | 978 | |
| demayer | 0:6bf0743ece18 | 979 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 980 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 981 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 982 | #endif |
| demayer | 0:6bf0743ece18 | 983 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 984 | "ldrex %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 985 | "adds %[val],%[ret],#1\n\t" |
| demayer | 0:6bf0743ece18 | 986 | "strex %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 987 | "cbz %[res],2f\n\t" |
| demayer | 0:6bf0743ece18 | 988 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 989 | "2:" |
| demayer | 0:6bf0743ece18 | 990 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 991 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 992 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 993 | : [mem] "l" (mem) |
| demayer | 0:6bf0743ece18 | 994 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 995 | ); |
| demayer | 0:6bf0743ece18 | 996 | |
| demayer | 0:6bf0743ece18 | 997 | return ret; |
| demayer | 0:6bf0743ece18 | 998 | } |
| demayer | 0:6bf0743ece18 | 999 | #endif |
| demayer | 0:6bf0743ece18 | 1000 | |
| demayer | 0:6bf0743ece18 | 1001 | /// atomic Access Operation: Increment (32-bit) if Less Than |
| demayer | 0:6bf0743ece18 | 1002 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 1003 | /// \param[in] max Maximum value |
| demayer | 0:6bf0743ece18 | 1004 | /// \return Previous value |
| demayer | 0:6bf0743ece18 | 1005 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 1006 | static __asm uint32_t atomic_inc32_lt (uint32_t *mem, uint32_t max) { |
| demayer | 0:6bf0743ece18 | 1007 | push {r4,lr} |
| demayer | 0:6bf0743ece18 | 1008 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 1009 | 1 |
| demayer | 0:6bf0743ece18 | 1010 | ldrex r0,[r2] |
| demayer | 0:6bf0743ece18 | 1011 | cmp r1,r0 |
| demayer | 0:6bf0743ece18 | 1012 | bhi %F2 |
| demayer | 0:6bf0743ece18 | 1013 | clrex |
| demayer | 0:6bf0743ece18 | 1014 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 1015 | 2 |
| demayer | 0:6bf0743ece18 | 1016 | adds r4,r0,#1 |
| demayer | 0:6bf0743ece18 | 1017 | strex r3,r4,[r2] |
| demayer | 0:6bf0743ece18 | 1018 | cbz r3,%F3 |
| demayer | 0:6bf0743ece18 | 1019 | b %B1 |
| demayer | 0:6bf0743ece18 | 1020 | 3 |
| demayer | 0:6bf0743ece18 | 1021 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 1022 | } |
| demayer | 0:6bf0743ece18 | 1023 | #else |
| demayer | 0:6bf0743ece18 | 1024 | __STATIC_INLINE uint32_t atomic_inc32_lt (uint32_t *mem, uint32_t max) { |
| demayer | 0:6bf0743ece18 | 1025 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1026 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 1027 | #endif |
| demayer | 0:6bf0743ece18 | 1028 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 1029 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1030 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 1031 | #endif |
| demayer | 0:6bf0743ece18 | 1032 | register uint32_t ret; |
| demayer | 0:6bf0743ece18 | 1033 | |
| demayer | 0:6bf0743ece18 | 1034 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 1035 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1036 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 1037 | #endif |
| demayer | 0:6bf0743ece18 | 1038 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 1039 | "ldrex %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1040 | "cmp %[max],%[ret]\n\t" |
| demayer | 0:6bf0743ece18 | 1041 | "bhi 2f\n\t" |
| demayer | 0:6bf0743ece18 | 1042 | "clrex\n\t" |
| demayer | 0:6bf0743ece18 | 1043 | "b 3f\n" |
| demayer | 0:6bf0743ece18 | 1044 | "2:\n\t" |
| demayer | 0:6bf0743ece18 | 1045 | "adds %[val],%[ret],#1\n\t" |
| demayer | 0:6bf0743ece18 | 1046 | "strex %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1047 | "cbz %[res],3f\n\t" |
| demayer | 0:6bf0743ece18 | 1048 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 1049 | "3:" |
| demayer | 0:6bf0743ece18 | 1050 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 1051 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 1052 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 1053 | : [mem] "l" (mem), |
| demayer | 0:6bf0743ece18 | 1054 | [max] "l" (max) |
| demayer | 0:6bf0743ece18 | 1055 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 1056 | ); |
| demayer | 0:6bf0743ece18 | 1057 | |
| demayer | 0:6bf0743ece18 | 1058 | return ret; |
| demayer | 0:6bf0743ece18 | 1059 | } |
| demayer | 0:6bf0743ece18 | 1060 | #endif |
| demayer | 0:6bf0743ece18 | 1061 | |
| demayer | 0:6bf0743ece18 | 1062 | /// Atomic Access Operation: Increment (16-bit) if Less Than |
| demayer | 0:6bf0743ece18 | 1063 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 1064 | /// \param[in] max Maximum value |
| demayer | 0:6bf0743ece18 | 1065 | /// \return Previous value |
| demayer | 0:6bf0743ece18 | 1066 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 1067 | static __asm uint16_t atomic_inc16_lt (uint16_t *mem, uint16_t max) { |
| demayer | 0:6bf0743ece18 | 1068 | push {r4,lr} |
| demayer | 0:6bf0743ece18 | 1069 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 1070 | 1 |
| demayer | 0:6bf0743ece18 | 1071 | ldrexh r0,[r2] |
| demayer | 0:6bf0743ece18 | 1072 | cmp r1,r0 |
| demayer | 0:6bf0743ece18 | 1073 | bhi %F2 |
| demayer | 0:6bf0743ece18 | 1074 | clrex |
| demayer | 0:6bf0743ece18 | 1075 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 1076 | 2 |
| demayer | 0:6bf0743ece18 | 1077 | adds r4,r0,#1 |
| demayer | 0:6bf0743ece18 | 1078 | strexh r3,r4,[r2] |
| demayer | 0:6bf0743ece18 | 1079 | cbz r3,%F3 |
| demayer | 0:6bf0743ece18 | 1080 | b %B1 |
| demayer | 0:6bf0743ece18 | 1081 | 3 |
| demayer | 0:6bf0743ece18 | 1082 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 1083 | } |
| demayer | 0:6bf0743ece18 | 1084 | #else |
| demayer | 0:6bf0743ece18 | 1085 | __STATIC_INLINE uint16_t atomic_inc16_lt (uint16_t *mem, uint16_t max) { |
| demayer | 0:6bf0743ece18 | 1086 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1087 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 1088 | #endif |
| demayer | 0:6bf0743ece18 | 1089 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 1090 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1091 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 1092 | #endif |
| demayer | 0:6bf0743ece18 | 1093 | register uint16_t ret; |
| demayer | 0:6bf0743ece18 | 1094 | |
| demayer | 0:6bf0743ece18 | 1095 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 1096 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1097 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 1098 | #endif |
| demayer | 0:6bf0743ece18 | 1099 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 1100 | "ldrexh %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1101 | "cmp %[max],%[ret]\n\t" |
| demayer | 0:6bf0743ece18 | 1102 | "bhi 2f\n\t" |
| demayer | 0:6bf0743ece18 | 1103 | "clrex\n\t" |
| demayer | 0:6bf0743ece18 | 1104 | "b 3f\n" |
| demayer | 0:6bf0743ece18 | 1105 | "2:\n\t" |
| demayer | 0:6bf0743ece18 | 1106 | "adds %[val],%[ret],#1\n\t" |
| demayer | 0:6bf0743ece18 | 1107 | "strexh %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1108 | "cbz %[res],3f\n\t" |
| demayer | 0:6bf0743ece18 | 1109 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 1110 | "3:" |
| demayer | 0:6bf0743ece18 | 1111 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 1112 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 1113 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 1114 | : [mem] "l" (mem), |
| demayer | 0:6bf0743ece18 | 1115 | [max] "l" (max) |
| demayer | 0:6bf0743ece18 | 1116 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 1117 | ); |
| demayer | 0:6bf0743ece18 | 1118 | |
| demayer | 0:6bf0743ece18 | 1119 | return ret; |
| demayer | 0:6bf0743ece18 | 1120 | } |
| demayer | 0:6bf0743ece18 | 1121 | #endif |
| demayer | 0:6bf0743ece18 | 1122 | |
| demayer | 0:6bf0743ece18 | 1123 | /// Atomic Access Operation: Increment (16-bit) and clear on Limit |
| demayer | 0:6bf0743ece18 | 1124 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 1125 | /// \param[in] max Maximum value |
| demayer | 0:6bf0743ece18 | 1126 | /// \return Previous value |
| demayer | 0:6bf0743ece18 | 1127 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 1128 | static __asm uint16_t atomic_inc16_lim (uint16_t *mem, uint16_t lim) { |
| demayer | 0:6bf0743ece18 | 1129 | push {r4,lr} |
| demayer | 0:6bf0743ece18 | 1130 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 1131 | 1 |
| demayer | 0:6bf0743ece18 | 1132 | ldrexh r0,[r2] |
| demayer | 0:6bf0743ece18 | 1133 | adds r4,r0,#1 |
| demayer | 0:6bf0743ece18 | 1134 | cmp r1,r4 |
| demayer | 0:6bf0743ece18 | 1135 | bhi %F2 |
| demayer | 0:6bf0743ece18 | 1136 | movs r4,#0 |
| demayer | 0:6bf0743ece18 | 1137 | 2 |
| demayer | 0:6bf0743ece18 | 1138 | strexh r3,r4,[r2] |
| demayer | 0:6bf0743ece18 | 1139 | cbz r3,%F3 |
| demayer | 0:6bf0743ece18 | 1140 | b %B1 |
| demayer | 0:6bf0743ece18 | 1141 | 3 |
| demayer | 0:6bf0743ece18 | 1142 | pop {r4,pc} |
| demayer | 0:6bf0743ece18 | 1143 | } |
| demayer | 0:6bf0743ece18 | 1144 | #else |
| demayer | 0:6bf0743ece18 | 1145 | __STATIC_INLINE uint16_t atomic_inc16_lim (uint16_t *mem, uint16_t lim) { |
| demayer | 0:6bf0743ece18 | 1146 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1147 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 1148 | #endif |
| demayer | 0:6bf0743ece18 | 1149 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 1150 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1151 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 1152 | #endif |
| demayer | 0:6bf0743ece18 | 1153 | register uint16_t ret; |
| demayer | 0:6bf0743ece18 | 1154 | |
| demayer | 0:6bf0743ece18 | 1155 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 1156 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1157 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 1158 | #endif |
| demayer | 0:6bf0743ece18 | 1159 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 1160 | "ldrexh %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1161 | "adds %[val],%[ret],#1\n\t" |
| demayer | 0:6bf0743ece18 | 1162 | "cmp %[lim],%[val]\n\t" |
| demayer | 0:6bf0743ece18 | 1163 | "bhi 2f\n\t" |
| demayer | 0:6bf0743ece18 | 1164 | "movs %[val],#0\n" |
| demayer | 0:6bf0743ece18 | 1165 | "2:\n\t" |
| demayer | 0:6bf0743ece18 | 1166 | "strexh %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1167 | "cbz %[res],3f\n\t" |
| demayer | 0:6bf0743ece18 | 1168 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 1169 | "3:" |
| demayer | 0:6bf0743ece18 | 1170 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 1171 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 1172 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 1173 | : [mem] "l" (mem), |
| demayer | 0:6bf0743ece18 | 1174 | [lim] "l" (lim) |
| demayer | 0:6bf0743ece18 | 1175 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 1176 | ); |
| demayer | 0:6bf0743ece18 | 1177 | |
| demayer | 0:6bf0743ece18 | 1178 | return ret; |
| demayer | 0:6bf0743ece18 | 1179 | } |
| demayer | 0:6bf0743ece18 | 1180 | #endif |
| demayer | 0:6bf0743ece18 | 1181 | |
| demayer | 0:6bf0743ece18 | 1182 | /// Atomic Access Operation: Decrement (32-bit) if Not Zero |
| demayer | 0:6bf0743ece18 | 1183 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 1184 | /// \return Previous value |
| demayer | 0:6bf0743ece18 | 1185 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 1186 | static __asm uint32_t atomic_dec32_nz (uint32_t *mem) { |
| demayer | 0:6bf0743ece18 | 1187 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 1188 | 1 |
| demayer | 0:6bf0743ece18 | 1189 | ldrex r0,[r2] |
| demayer | 0:6bf0743ece18 | 1190 | cbnz r0,%F2 |
| demayer | 0:6bf0743ece18 | 1191 | clrex |
| demayer | 0:6bf0743ece18 | 1192 | bx lr |
| demayer | 0:6bf0743ece18 | 1193 | 2 |
| demayer | 0:6bf0743ece18 | 1194 | subs r1,r0,#1 |
| demayer | 0:6bf0743ece18 | 1195 | strex r3,r1,[r2] |
| demayer | 0:6bf0743ece18 | 1196 | cbz r3,%F3 |
| demayer | 0:6bf0743ece18 | 1197 | b %B1 |
| demayer | 0:6bf0743ece18 | 1198 | 3 |
| demayer | 0:6bf0743ece18 | 1199 | bx lr |
| demayer | 0:6bf0743ece18 | 1200 | } |
| demayer | 0:6bf0743ece18 | 1201 | #else |
| demayer | 0:6bf0743ece18 | 1202 | __STATIC_INLINE uint32_t atomic_dec32_nz (uint32_t *mem) { |
| demayer | 0:6bf0743ece18 | 1203 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1204 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 1205 | #endif |
| demayer | 0:6bf0743ece18 | 1206 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 1207 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1208 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 1209 | #endif |
| demayer | 0:6bf0743ece18 | 1210 | register uint32_t ret; |
| demayer | 0:6bf0743ece18 | 1211 | |
| demayer | 0:6bf0743ece18 | 1212 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 1213 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1214 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 1215 | #endif |
| demayer | 0:6bf0743ece18 | 1216 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 1217 | "ldrex %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1218 | "cbnz %[ret],2f\n\t" |
| demayer | 0:6bf0743ece18 | 1219 | "clrex\n\t" |
| demayer | 0:6bf0743ece18 | 1220 | "b 3f\n" |
| demayer | 0:6bf0743ece18 | 1221 | "2:\n\t" |
| demayer | 0:6bf0743ece18 | 1222 | "subs %[val],%[ret],#1\n\t" |
| demayer | 0:6bf0743ece18 | 1223 | "strex %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1224 | "cbz %[res],3f\n\t" |
| demayer | 0:6bf0743ece18 | 1225 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 1226 | "3:" |
| demayer | 0:6bf0743ece18 | 1227 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 1228 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 1229 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 1230 | : [mem] "l" (mem) |
| demayer | 0:6bf0743ece18 | 1231 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 1232 | ); |
| demayer | 0:6bf0743ece18 | 1233 | |
| demayer | 0:6bf0743ece18 | 1234 | return ret; |
| demayer | 0:6bf0743ece18 | 1235 | } |
| demayer | 0:6bf0743ece18 | 1236 | #endif |
| demayer | 0:6bf0743ece18 | 1237 | |
| demayer | 0:6bf0743ece18 | 1238 | /// Atomic Access Operation: Decrement (16-bit) if Not Zero |
| demayer | 0:6bf0743ece18 | 1239 | /// \param[in] mem Memory address |
| demayer | 0:6bf0743ece18 | 1240 | /// \return Previous value |
| demayer | 0:6bf0743ece18 | 1241 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 1242 | static __asm uint16_t atomic_dec16_nz (uint16_t *mem) { |
| demayer | 0:6bf0743ece18 | 1243 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 1244 | 1 |
| demayer | 0:6bf0743ece18 | 1245 | ldrexh r0,[r2] |
| demayer | 0:6bf0743ece18 | 1246 | cbnz r0,%F2 |
| demayer | 0:6bf0743ece18 | 1247 | clrex |
| demayer | 0:6bf0743ece18 | 1248 | bx lr |
| demayer | 0:6bf0743ece18 | 1249 | 2 |
| demayer | 0:6bf0743ece18 | 1250 | subs r1,r0,#1 |
| demayer | 0:6bf0743ece18 | 1251 | strexh r3,r1,[r2] |
| demayer | 0:6bf0743ece18 | 1252 | cbz r3,%F3 |
| demayer | 0:6bf0743ece18 | 1253 | b %B1 |
| demayer | 0:6bf0743ece18 | 1254 | 3 |
| demayer | 0:6bf0743ece18 | 1255 | bx lr |
| demayer | 0:6bf0743ece18 | 1256 | } |
| demayer | 0:6bf0743ece18 | 1257 | #else |
| demayer | 0:6bf0743ece18 | 1258 | __STATIC_INLINE uint16_t atomic_dec16_nz (uint16_t *mem) { |
| demayer | 0:6bf0743ece18 | 1259 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1260 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 1261 | #endif |
| demayer | 0:6bf0743ece18 | 1262 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 1263 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1264 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 1265 | #endif |
| demayer | 0:6bf0743ece18 | 1266 | register uint16_t ret; |
| demayer | 0:6bf0743ece18 | 1267 | |
| demayer | 0:6bf0743ece18 | 1268 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 1269 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1270 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 1271 | #endif |
| demayer | 0:6bf0743ece18 | 1272 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 1273 | "ldrexh %[ret],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1274 | "cbnz %[ret],2f\n\t" |
| demayer | 0:6bf0743ece18 | 1275 | "clrex\n\t" |
| demayer | 0:6bf0743ece18 | 1276 | "b 3f\n" |
| demayer | 0:6bf0743ece18 | 1277 | "2:\n\t" |
| demayer | 0:6bf0743ece18 | 1278 | "subs %[val],%[ret],#1\n\t" |
| demayer | 0:6bf0743ece18 | 1279 | "strexh %[res],%[val],[%[mem]]\n\t" |
| demayer | 0:6bf0743ece18 | 1280 | "cbz %[res],3f\n\t" |
| demayer | 0:6bf0743ece18 | 1281 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 1282 | "3:" |
| demayer | 0:6bf0743ece18 | 1283 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 1284 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 1285 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 1286 | : [mem] "l" (mem) |
| demayer | 0:6bf0743ece18 | 1287 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 1288 | ); |
| demayer | 0:6bf0743ece18 | 1289 | |
| demayer | 0:6bf0743ece18 | 1290 | return ret; |
| demayer | 0:6bf0743ece18 | 1291 | } |
| demayer | 0:6bf0743ece18 | 1292 | #endif |
| demayer | 0:6bf0743ece18 | 1293 | |
| demayer | 0:6bf0743ece18 | 1294 | /// Atomic Access Operation: Link Get |
| demayer | 0:6bf0743ece18 | 1295 | /// \param[in] root Root address |
| demayer | 0:6bf0743ece18 | 1296 | /// \return Link |
| demayer | 0:6bf0743ece18 | 1297 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 1298 | static __asm void *atomic_link_get (void **root) { |
| demayer | 0:6bf0743ece18 | 1299 | mov r2,r0 |
| demayer | 0:6bf0743ece18 | 1300 | 1 |
| demayer | 0:6bf0743ece18 | 1301 | ldrex r0,[r2] |
| demayer | 0:6bf0743ece18 | 1302 | cbnz r0,%F2 |
| demayer | 0:6bf0743ece18 | 1303 | clrex |
| demayer | 0:6bf0743ece18 | 1304 | bx lr |
| demayer | 0:6bf0743ece18 | 1305 | 2 |
| demayer | 0:6bf0743ece18 | 1306 | ldr r1,[r0] |
| demayer | 0:6bf0743ece18 | 1307 | strex r3,r1,[r2] |
| demayer | 0:6bf0743ece18 | 1308 | cbz r3,%F3 |
| demayer | 0:6bf0743ece18 | 1309 | b %B1 |
| demayer | 0:6bf0743ece18 | 1310 | 3 |
| demayer | 0:6bf0743ece18 | 1311 | bx lr |
| demayer | 0:6bf0743ece18 | 1312 | } |
| demayer | 0:6bf0743ece18 | 1313 | #else |
| demayer | 0:6bf0743ece18 | 1314 | __STATIC_INLINE void *atomic_link_get (void **root) { |
| demayer | 0:6bf0743ece18 | 1315 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1316 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 1317 | #endif |
| demayer | 0:6bf0743ece18 | 1318 | register uint32_t val, res; |
| demayer | 0:6bf0743ece18 | 1319 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1320 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 1321 | #endif |
| demayer | 0:6bf0743ece18 | 1322 | register void *ret; |
| demayer | 0:6bf0743ece18 | 1323 | |
| demayer | 0:6bf0743ece18 | 1324 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 1325 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1326 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 1327 | #endif |
| demayer | 0:6bf0743ece18 | 1328 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 1329 | "ldrex %[ret],[%[root]]\n\t" |
| demayer | 0:6bf0743ece18 | 1330 | "cbnz %[ret],2f\n\t" |
| demayer | 0:6bf0743ece18 | 1331 | "clrex\n\t" |
| demayer | 0:6bf0743ece18 | 1332 | "b 3f\n" |
| demayer | 0:6bf0743ece18 | 1333 | "2:\n\t" |
| demayer | 0:6bf0743ece18 | 1334 | "ldr %[val],[%[ret]]\n\t" |
| demayer | 0:6bf0743ece18 | 1335 | "strex %[res],%[val],[%[root]]\n\t" |
| demayer | 0:6bf0743ece18 | 1336 | "cbz %[res],3f\n\t" |
| demayer | 0:6bf0743ece18 | 1337 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 1338 | "3:" |
| demayer | 0:6bf0743ece18 | 1339 | : [ret] "=&l" (ret), |
| demayer | 0:6bf0743ece18 | 1340 | [val] "=&l" (val), |
| demayer | 0:6bf0743ece18 | 1341 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 1342 | : [root] "l" (root) |
| demayer | 0:6bf0743ece18 | 1343 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 1344 | ); |
| demayer | 0:6bf0743ece18 | 1345 | |
| demayer | 0:6bf0743ece18 | 1346 | return ret; |
| demayer | 0:6bf0743ece18 | 1347 | } |
| demayer | 0:6bf0743ece18 | 1348 | #endif |
| demayer | 0:6bf0743ece18 | 1349 | |
| demayer | 0:6bf0743ece18 | 1350 | /// Atomic Access Operation: Link Put |
| demayer | 0:6bf0743ece18 | 1351 | /// \param[in] root Root address |
| demayer | 0:6bf0743ece18 | 1352 | /// \param[in] lnk Link |
| demayer | 0:6bf0743ece18 | 1353 | #if defined(__CC_ARM) |
| demayer | 0:6bf0743ece18 | 1354 | static __asm void atomic_link_put (void **root, void *link) { |
| demayer | 0:6bf0743ece18 | 1355 | 1 |
| demayer | 0:6bf0743ece18 | 1356 | ldr r2,[r0] |
| demayer | 0:6bf0743ece18 | 1357 | str r2,[r1] |
| demayer | 0:6bf0743ece18 | 1358 | dmb |
| demayer | 0:6bf0743ece18 | 1359 | ldrex r2,[r0] |
| demayer | 0:6bf0743ece18 | 1360 | ldr r3,[r1] |
| demayer | 0:6bf0743ece18 | 1361 | cmp r3,r2 |
| demayer | 0:6bf0743ece18 | 1362 | bne %B1 |
| demayer | 0:6bf0743ece18 | 1363 | strex r3,r1,[r0] |
| demayer | 0:6bf0743ece18 | 1364 | cbz r3,%F2 |
| demayer | 0:6bf0743ece18 | 1365 | b %B1 |
| demayer | 0:6bf0743ece18 | 1366 | 2 |
| demayer | 0:6bf0743ece18 | 1367 | bx lr |
| demayer | 0:6bf0743ece18 | 1368 | } |
| demayer | 0:6bf0743ece18 | 1369 | #else |
| demayer | 0:6bf0743ece18 | 1370 | __STATIC_INLINE void atomic_link_put (void **root, void *link) { |
| demayer | 0:6bf0743ece18 | 1371 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1372 | #pragma diag_suppress=Pe550 |
| demayer | 0:6bf0743ece18 | 1373 | #endif |
| demayer | 0:6bf0743ece18 | 1374 | register uint32_t val1, val2, res; |
| demayer | 0:6bf0743ece18 | 1375 | #ifdef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1376 | #pragma diag_default=Pe550 |
| demayer | 0:6bf0743ece18 | 1377 | #endif |
| demayer | 0:6bf0743ece18 | 1378 | |
| demayer | 0:6bf0743ece18 | 1379 | __ASM volatile ( |
| demayer | 0:6bf0743ece18 | 1380 | #ifndef __ICCARM__ |
| demayer | 0:6bf0743ece18 | 1381 | ".syntax unified\n\t" |
| demayer | 0:6bf0743ece18 | 1382 | #endif |
| demayer | 0:6bf0743ece18 | 1383 | "1:\n\t" |
| demayer | 0:6bf0743ece18 | 1384 | "ldr %[val1],[%[root]]\n\t" |
| demayer | 0:6bf0743ece18 | 1385 | "str %[val1],[%[link]]\n\t" |
| demayer | 0:6bf0743ece18 | 1386 | "dmb\n\t" |
| demayer | 0:6bf0743ece18 | 1387 | "ldrex %[val1],[%[root]]\n\t" |
| demayer | 0:6bf0743ece18 | 1388 | "ldr %[val2],[%[link]]\n\t" |
| demayer | 0:6bf0743ece18 | 1389 | "cmp %[val2],%[val1]\n\t" |
| demayer | 0:6bf0743ece18 | 1390 | "bne 1b\n\t" |
| demayer | 0:6bf0743ece18 | 1391 | "strex %[res],%[link],[%[root]]\n\t" |
| demayer | 0:6bf0743ece18 | 1392 | "cbz %[res],2f\n\t" |
| demayer | 0:6bf0743ece18 | 1393 | "b 1b\n" |
| demayer | 0:6bf0743ece18 | 1394 | "2:" |
| demayer | 0:6bf0743ece18 | 1395 | : [val1] "=&l" (val1), |
| demayer | 0:6bf0743ece18 | 1396 | [val2] "=&l" (val2), |
| demayer | 0:6bf0743ece18 | 1397 | [res] "=&l" (res) |
| demayer | 0:6bf0743ece18 | 1398 | : [root] "l" (root), |
| demayer | 0:6bf0743ece18 | 1399 | [link] "l" (link) |
| demayer | 0:6bf0743ece18 | 1400 | : "cc", "memory" |
| demayer | 0:6bf0743ece18 | 1401 | ); |
| demayer | 0:6bf0743ece18 | 1402 | } |
| demayer | 0:6bf0743ece18 | 1403 | #endif |
| demayer | 0:6bf0743ece18 | 1404 | |
| demayer | 0:6bf0743ece18 | 1405 | #endif // (__EXCLUSIVE_ACCESS == 1U) |
| demayer | 0:6bf0743ece18 | 1406 | |
| demayer | 0:6bf0743ece18 | 1407 | |
| demayer | 0:6bf0743ece18 | 1408 | #endif // RTX_CORE_CM_H_ |