mbed library sources. Supersedes mbed-src.

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

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 180:96ed750bd169 1 /**************************************************************************//**
Anna Bridge 180:96ed750bd169 2 * @file cmsis_gcc.h
Anna Bridge 180:96ed750bd169 3 * @brief CMSIS compiler specific macros, functions, instructions
AnnaBridge 188:bcfe06ba3d64 4 * @version V1.0.2
AnnaBridge 188:bcfe06ba3d64 5 * @date 09. April 2018
Anna Bridge 180:96ed750bd169 6 ******************************************************************************/
Anna Bridge 180:96ed750bd169 7 /*
AnnaBridge 188:bcfe06ba3d64 8 * Copyright (c) 2009-2018 Arm Limited. All rights reserved.
Anna Bridge 180:96ed750bd169 9 *
Anna Bridge 180:96ed750bd169 10 * SPDX-License-Identifier: Apache-2.0
Anna Bridge 180:96ed750bd169 11 *
Anna Bridge 180:96ed750bd169 12 * Licensed under the Apache License, Version 2.0 (the License); you may
Anna Bridge 180:96ed750bd169 13 * not use this file except in compliance with the License.
Anna Bridge 180:96ed750bd169 14 * You may obtain a copy of the License at
Anna Bridge 180:96ed750bd169 15 *
Anna Bridge 180:96ed750bd169 16 * www.apache.org/licenses/LICENSE-2.0
Anna Bridge 180:96ed750bd169 17 *
Anna Bridge 180:96ed750bd169 18 * Unless required by applicable law or agreed to in writing, software
Anna Bridge 180:96ed750bd169 19 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
Anna Bridge 180:96ed750bd169 20 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Anna Bridge 180:96ed750bd169 21 * See the License for the specific language governing permissions and
Anna Bridge 180:96ed750bd169 22 * limitations under the License.
Anna Bridge 180:96ed750bd169 23 */
Anna Bridge 180:96ed750bd169 24
Anna Bridge 180:96ed750bd169 25 #ifndef __CMSIS_GCC_H
Anna Bridge 180:96ed750bd169 26 #define __CMSIS_GCC_H
Anna Bridge 180:96ed750bd169 27
Anna Bridge 180:96ed750bd169 28 /* ignore some GCC warnings */
Anna Bridge 180:96ed750bd169 29 #pragma GCC diagnostic push
Anna Bridge 180:96ed750bd169 30 #pragma GCC diagnostic ignored "-Wsign-conversion"
Anna Bridge 180:96ed750bd169 31 #pragma GCC diagnostic ignored "-Wconversion"
Anna Bridge 180:96ed750bd169 32 #pragma GCC diagnostic ignored "-Wunused-parameter"
Anna Bridge 180:96ed750bd169 33
Anna Bridge 180:96ed750bd169 34 /* Fallback for __has_builtin */
Anna Bridge 180:96ed750bd169 35 #ifndef __has_builtin
Anna Bridge 180:96ed750bd169 36 #define __has_builtin(x) (0)
Anna Bridge 180:96ed750bd169 37 #endif
Anna Bridge 180:96ed750bd169 38
Anna Bridge 180:96ed750bd169 39 /* CMSIS compiler specific defines */
Anna Bridge 180:96ed750bd169 40 #ifndef __ASM
Anna Bridge 180:96ed750bd169 41 #define __ASM asm
Anna Bridge 180:96ed750bd169 42 #endif
Anna Bridge 180:96ed750bd169 43 #ifndef __INLINE
Anna Bridge 180:96ed750bd169 44 #define __INLINE inline
Anna Bridge 180:96ed750bd169 45 #endif
Anna Bridge 180:96ed750bd169 46 #ifndef __FORCEINLINE
Anna Bridge 180:96ed750bd169 47 #define __FORCEINLINE __attribute__((always_inline))
Anna Bridge 180:96ed750bd169 48 #endif
Anna Bridge 180:96ed750bd169 49 #ifndef __STATIC_INLINE
Anna Bridge 180:96ed750bd169 50 #define __STATIC_INLINE static inline
Anna Bridge 180:96ed750bd169 51 #endif
Anna Bridge 180:96ed750bd169 52 #ifndef __STATIC_FORCEINLINE
Anna Bridge 180:96ed750bd169 53 #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline
Anna Bridge 180:96ed750bd169 54 #endif
Anna Bridge 180:96ed750bd169 55 #ifndef __NO_RETURN
Anna Bridge 180:96ed750bd169 56 #define __NO_RETURN __attribute__((__noreturn__))
Anna Bridge 180:96ed750bd169 57 #endif
Anna Bridge 180:96ed750bd169 58 #ifndef CMSIS_DEPRECATED
Anna Bridge 180:96ed750bd169 59 #define CMSIS_DEPRECATED __attribute__((deprecated))
Anna Bridge 180:96ed750bd169 60 #endif
Anna Bridge 180:96ed750bd169 61 #ifndef __USED
Anna Bridge 180:96ed750bd169 62 #define __USED __attribute__((used))
Anna Bridge 180:96ed750bd169 63 #endif
Anna Bridge 180:96ed750bd169 64 #ifndef __WEAK
Anna Bridge 180:96ed750bd169 65 #define __WEAK __attribute__((weak))
Anna Bridge 180:96ed750bd169 66 #endif
Anna Bridge 180:96ed750bd169 67 #ifndef __PACKED
Anna Bridge 180:96ed750bd169 68 #define __PACKED __attribute__((packed, aligned(1)))
Anna Bridge 180:96ed750bd169 69 #endif
Anna Bridge 180:96ed750bd169 70 #ifndef __PACKED_STRUCT
Anna Bridge 180:96ed750bd169 71 #define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
Anna Bridge 180:96ed750bd169 72 #endif
Anna Bridge 180:96ed750bd169 73 #ifndef __UNALIGNED_UINT16_WRITE
Anna Bridge 180:96ed750bd169 74 #pragma GCC diagnostic push
Anna Bridge 180:96ed750bd169 75 #pragma GCC diagnostic ignored "-Wpacked"
Anna Bridge 180:96ed750bd169 76 /*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */
Anna Bridge 180:96ed750bd169 77 __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
Anna Bridge 180:96ed750bd169 78 #pragma GCC diagnostic pop
Anna Bridge 180:96ed750bd169 79 #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
Anna Bridge 180:96ed750bd169 80 #endif
Anna Bridge 180:96ed750bd169 81 #ifndef __UNALIGNED_UINT16_READ
Anna Bridge 180:96ed750bd169 82 #pragma GCC diagnostic push
Anna Bridge 180:96ed750bd169 83 #pragma GCC diagnostic ignored "-Wpacked"
Anna Bridge 180:96ed750bd169 84 /*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */
Anna Bridge 180:96ed750bd169 85 __PACKED_STRUCT T_UINT16_READ { uint16_t v; };
Anna Bridge 180:96ed750bd169 86 #pragma GCC diagnostic pop
Anna Bridge 180:96ed750bd169 87 #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
Anna Bridge 180:96ed750bd169 88 #endif
Anna Bridge 180:96ed750bd169 89 #ifndef __UNALIGNED_UINT32_WRITE
Anna Bridge 180:96ed750bd169 90 #pragma GCC diagnostic push
Anna Bridge 180:96ed750bd169 91 #pragma GCC diagnostic ignored "-Wpacked"
Anna Bridge 180:96ed750bd169 92 /*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */
Anna Bridge 180:96ed750bd169 93 __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
Anna Bridge 180:96ed750bd169 94 #pragma GCC diagnostic pop
Anna Bridge 180:96ed750bd169 95 #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
Anna Bridge 180:96ed750bd169 96 #endif
Anna Bridge 180:96ed750bd169 97 #ifndef __UNALIGNED_UINT32_READ
Anna Bridge 180:96ed750bd169 98 #pragma GCC diagnostic push
Anna Bridge 180:96ed750bd169 99 #pragma GCC diagnostic ignored "-Wpacked"
Anna Bridge 180:96ed750bd169 100 __PACKED_STRUCT T_UINT32_READ { uint32_t v; };
Anna Bridge 180:96ed750bd169 101 #pragma GCC diagnostic pop
Anna Bridge 180:96ed750bd169 102 #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
Anna Bridge 180:96ed750bd169 103 #endif
Anna Bridge 180:96ed750bd169 104 #ifndef __ALIGNED
Anna Bridge 180:96ed750bd169 105 #define __ALIGNED(x) __attribute__((aligned(x)))
Anna Bridge 180:96ed750bd169 106 #endif
Anna Bridge 180:96ed750bd169 107
Anna Bridge 180:96ed750bd169 108 /* ########################## Core Instruction Access ######################### */
Anna Bridge 180:96ed750bd169 109 /**
Anna Bridge 180:96ed750bd169 110 \brief No Operation
Anna Bridge 180:96ed750bd169 111 */
Anna Bridge 180:96ed750bd169 112 #define __NOP() __ASM volatile ("nop")
Anna Bridge 180:96ed750bd169 113
Anna Bridge 180:96ed750bd169 114 /**
Anna Bridge 180:96ed750bd169 115 \brief Wait For Interrupt
Anna Bridge 180:96ed750bd169 116 */
Anna Bridge 180:96ed750bd169 117 #define __WFI() __ASM volatile ("wfi")
Anna Bridge 180:96ed750bd169 118
Anna Bridge 180:96ed750bd169 119 /**
Anna Bridge 180:96ed750bd169 120 \brief Wait For Event
Anna Bridge 180:96ed750bd169 121 */
Anna Bridge 180:96ed750bd169 122 #define __WFE() __ASM volatile ("wfe")
Anna Bridge 180:96ed750bd169 123
Anna Bridge 180:96ed750bd169 124 /**
Anna Bridge 180:96ed750bd169 125 \brief Send Event
Anna Bridge 180:96ed750bd169 126 */
Anna Bridge 180:96ed750bd169 127 #define __SEV() __ASM volatile ("sev")
Anna Bridge 180:96ed750bd169 128
Anna Bridge 180:96ed750bd169 129 /**
Anna Bridge 180:96ed750bd169 130 \brief Instruction Synchronization Barrier
Anna Bridge 180:96ed750bd169 131 \details Instruction Synchronization Barrier flushes the pipeline in the processor,
Anna Bridge 180:96ed750bd169 132 so that all instructions following the ISB are fetched from cache or memory,
Anna Bridge 180:96ed750bd169 133 after the instruction has been completed.
Anna Bridge 180:96ed750bd169 134 */
Anna Bridge 180:96ed750bd169 135 __STATIC_FORCEINLINE void __ISB(void)
Anna Bridge 180:96ed750bd169 136 {
Anna Bridge 180:96ed750bd169 137 __ASM volatile ("isb 0xF":::"memory");
Anna Bridge 180:96ed750bd169 138 }
Anna Bridge 180:96ed750bd169 139
Anna Bridge 180:96ed750bd169 140
Anna Bridge 180:96ed750bd169 141 /**
Anna Bridge 180:96ed750bd169 142 \brief Data Synchronization Barrier
Anna Bridge 180:96ed750bd169 143 \details Acts as a special kind of Data Memory Barrier.
Anna Bridge 180:96ed750bd169 144 It completes when all explicit memory accesses before this instruction complete.
Anna Bridge 180:96ed750bd169 145 */
Anna Bridge 180:96ed750bd169 146 __STATIC_FORCEINLINE void __DSB(void)
Anna Bridge 180:96ed750bd169 147 {
Anna Bridge 180:96ed750bd169 148 __ASM volatile ("dsb 0xF":::"memory");
Anna Bridge 180:96ed750bd169 149 }
Anna Bridge 180:96ed750bd169 150
Anna Bridge 180:96ed750bd169 151 /**
Anna Bridge 180:96ed750bd169 152 \brief Data Memory Barrier
Anna Bridge 180:96ed750bd169 153 \details Ensures the apparent order of the explicit memory operations before
Anna Bridge 180:96ed750bd169 154 and after the instruction, without ensuring their completion.
Anna Bridge 180:96ed750bd169 155 */
Anna Bridge 180:96ed750bd169 156 __STATIC_FORCEINLINE void __DMB(void)
Anna Bridge 180:96ed750bd169 157 {
Anna Bridge 180:96ed750bd169 158 __ASM volatile ("dmb 0xF":::"memory");
Anna Bridge 180:96ed750bd169 159 }
Anna Bridge 180:96ed750bd169 160
Anna Bridge 180:96ed750bd169 161 /**
Anna Bridge 180:96ed750bd169 162 \brief Reverse byte order (32 bit)
Anna Bridge 180:96ed750bd169 163 \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
Anna Bridge 180:96ed750bd169 164 \param [in] value Value to reverse
Anna Bridge 180:96ed750bd169 165 \return Reversed value
Anna Bridge 180:96ed750bd169 166 */
Anna Bridge 180:96ed750bd169 167 __STATIC_FORCEINLINE uint32_t __REV(uint32_t value)
Anna Bridge 180:96ed750bd169 168 {
Anna Bridge 180:96ed750bd169 169 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
Anna Bridge 180:96ed750bd169 170 return __builtin_bswap32(value);
Anna Bridge 180:96ed750bd169 171 #else
Anna Bridge 180:96ed750bd169 172 uint32_t result;
Anna Bridge 180:96ed750bd169 173
Anna Bridge 180:96ed750bd169 174 __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
Anna Bridge 180:96ed750bd169 175 return result;
Anna Bridge 180:96ed750bd169 176 #endif
Anna Bridge 180:96ed750bd169 177 }
Anna Bridge 180:96ed750bd169 178
Anna Bridge 180:96ed750bd169 179 /**
Anna Bridge 180:96ed750bd169 180 \brief Reverse byte order (16 bit)
Anna Bridge 180:96ed750bd169 181 \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
Anna Bridge 180:96ed750bd169 182 \param [in] value Value to reverse
Anna Bridge 180:96ed750bd169 183 \return Reversed value
Anna Bridge 180:96ed750bd169 184 */
Anna Bridge 180:96ed750bd169 185 #ifndef __NO_EMBEDDED_ASM
Anna Bridge 180:96ed750bd169 186 __attribute__((section(".rev16_text"))) __STATIC_INLINE uint32_t __REV16(uint32_t value)
Anna Bridge 180:96ed750bd169 187 {
Anna Bridge 180:96ed750bd169 188 uint32_t result;
Anna Bridge 180:96ed750bd169 189 __ASM volatile("rev16 %0, %1" : "=r" (result) : "r" (value));
Anna Bridge 180:96ed750bd169 190 return result;
Anna Bridge 180:96ed750bd169 191 }
Anna Bridge 180:96ed750bd169 192 #endif
Anna Bridge 180:96ed750bd169 193
Anna Bridge 180:96ed750bd169 194 /**
Anna Bridge 180:96ed750bd169 195 \brief Reverse byte order (16 bit)
Anna Bridge 180:96ed750bd169 196 \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.
Anna Bridge 180:96ed750bd169 197 \param [in] value Value to reverse
Anna Bridge 180:96ed750bd169 198 \return Reversed value
Anna Bridge 180:96ed750bd169 199 */
Anna Bridge 180:96ed750bd169 200 __STATIC_FORCEINLINE int16_t __REVSH(int16_t value)
Anna Bridge 180:96ed750bd169 201 {
Anna Bridge 180:96ed750bd169 202 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
Anna Bridge 180:96ed750bd169 203 return (int16_t)__builtin_bswap16(value);
Anna Bridge 180:96ed750bd169 204 #else
Anna Bridge 180:96ed750bd169 205 int16_t result;
Anna Bridge 180:96ed750bd169 206
Anna Bridge 180:96ed750bd169 207 __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
Anna Bridge 180:96ed750bd169 208 return result;
Anna Bridge 180:96ed750bd169 209 #endif
Anna Bridge 180:96ed750bd169 210 }
Anna Bridge 180:96ed750bd169 211
Anna Bridge 180:96ed750bd169 212 /**
Anna Bridge 180:96ed750bd169 213 \brief Rotate Right in unsigned value (32 bit)
Anna Bridge 180:96ed750bd169 214 \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
Anna Bridge 180:96ed750bd169 215 \param [in] op1 Value to rotate
Anna Bridge 180:96ed750bd169 216 \param [in] op2 Number of Bits to rotate
Anna Bridge 180:96ed750bd169 217 \return Rotated value
Anna Bridge 180:96ed750bd169 218 */
Anna Bridge 180:96ed750bd169 219 __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
Anna Bridge 180:96ed750bd169 220 {
Anna Bridge 180:96ed750bd169 221 op2 %= 32U;
Anna Bridge 180:96ed750bd169 222 if (op2 == 0U) {
Anna Bridge 180:96ed750bd169 223 return op1;
Anna Bridge 180:96ed750bd169 224 }
Anna Bridge 180:96ed750bd169 225 return (op1 >> op2) | (op1 << (32U - op2));
Anna Bridge 180:96ed750bd169 226 }
Anna Bridge 180:96ed750bd169 227
Anna Bridge 180:96ed750bd169 228
Anna Bridge 180:96ed750bd169 229 /**
Anna Bridge 180:96ed750bd169 230 \brief Breakpoint
Anna Bridge 180:96ed750bd169 231 \param [in] value is ignored by the processor.
Anna Bridge 180:96ed750bd169 232 If required, a debugger can use it to store additional information about the breakpoint.
Anna Bridge 180:96ed750bd169 233 */
Anna Bridge 180:96ed750bd169 234 #define __BKPT(value) __ASM volatile ("bkpt "#value)
Anna Bridge 180:96ed750bd169 235
Anna Bridge 180:96ed750bd169 236 /**
Anna Bridge 180:96ed750bd169 237 \brief Reverse bit order of value
Anna Bridge 180:96ed750bd169 238 \details Reverses the bit order of the given value.
Anna Bridge 180:96ed750bd169 239 \param [in] value Value to reverse
Anna Bridge 180:96ed750bd169 240 \return Reversed value
Anna Bridge 180:96ed750bd169 241 */
Anna Bridge 180:96ed750bd169 242 __STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value)
Anna Bridge 180:96ed750bd169 243 {
Anna Bridge 180:96ed750bd169 244 uint32_t result;
Anna Bridge 180:96ed750bd169 245
Anna Bridge 180:96ed750bd169 246 #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
Anna Bridge 180:96ed750bd169 247 (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
Anna Bridge 180:96ed750bd169 248 (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) )
Anna Bridge 180:96ed750bd169 249 __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
Anna Bridge 180:96ed750bd169 250 #else
Anna Bridge 180:96ed750bd169 251 int32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */
Anna Bridge 180:96ed750bd169 252
Anna Bridge 180:96ed750bd169 253 result = value; /* r will be reversed bits of v; first get LSB of v */
Anna Bridge 180:96ed750bd169 254 for (value >>= 1U; value; value >>= 1U)
Anna Bridge 180:96ed750bd169 255 {
Anna Bridge 180:96ed750bd169 256 result <<= 1U;
Anna Bridge 180:96ed750bd169 257 result |= value & 1U;
Anna Bridge 180:96ed750bd169 258 s--;
Anna Bridge 180:96ed750bd169 259 }
Anna Bridge 180:96ed750bd169 260 result <<= s; /* shift when v's highest bits are zero */
Anna Bridge 180:96ed750bd169 261 #endif
Anna Bridge 180:96ed750bd169 262 return result;
Anna Bridge 180:96ed750bd169 263 }
Anna Bridge 180:96ed750bd169 264
Anna Bridge 180:96ed750bd169 265 /**
Anna Bridge 180:96ed750bd169 266 \brief Count leading zeros
Anna Bridge 180:96ed750bd169 267 \param [in] value Value to count the leading zeros
Anna Bridge 180:96ed750bd169 268 \return number of leading zeros in value
Anna Bridge 180:96ed750bd169 269 */
Anna Bridge 180:96ed750bd169 270 #define __CLZ (uint8_t)__builtin_clz
Anna Bridge 180:96ed750bd169 271
Anna Bridge 180:96ed750bd169 272 /**
Anna Bridge 180:96ed750bd169 273 \brief LDR Exclusive (8 bit)
Anna Bridge 180:96ed750bd169 274 \details Executes a exclusive LDR instruction for 8 bit value.
Anna Bridge 180:96ed750bd169 275 \param [in] ptr Pointer to data
Anna Bridge 180:96ed750bd169 276 \return value of type uint8_t at (*ptr)
Anna Bridge 180:96ed750bd169 277 */
Anna Bridge 180:96ed750bd169 278 __STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr)
Anna Bridge 180:96ed750bd169 279 {
Anna Bridge 180:96ed750bd169 280 uint32_t result;
Anna Bridge 180:96ed750bd169 281
Anna Bridge 180:96ed750bd169 282 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
Anna Bridge 180:96ed750bd169 283 __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
Anna Bridge 180:96ed750bd169 284 #else
Anna Bridge 180:96ed750bd169 285 /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
Anna Bridge 180:96ed750bd169 286 accepted by assembler. So has to use following less efficient pattern.
Anna Bridge 180:96ed750bd169 287 */
Anna Bridge 180:96ed750bd169 288 __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
Anna Bridge 180:96ed750bd169 289 #endif
Anna Bridge 180:96ed750bd169 290 return ((uint8_t) result); /* Add explicit type cast here */
Anna Bridge 180:96ed750bd169 291 }
Anna Bridge 180:96ed750bd169 292
Anna Bridge 180:96ed750bd169 293
Anna Bridge 180:96ed750bd169 294 /**
Anna Bridge 180:96ed750bd169 295 \brief LDR Exclusive (16 bit)
Anna Bridge 180:96ed750bd169 296 \details Executes a exclusive LDR instruction for 16 bit values.
Anna Bridge 180:96ed750bd169 297 \param [in] ptr Pointer to data
Anna Bridge 180:96ed750bd169 298 \return value of type uint16_t at (*ptr)
Anna Bridge 180:96ed750bd169 299 */
Anna Bridge 180:96ed750bd169 300 __STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr)
Anna Bridge 180:96ed750bd169 301 {
Anna Bridge 180:96ed750bd169 302 uint32_t result;
Anna Bridge 180:96ed750bd169 303
Anna Bridge 180:96ed750bd169 304 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
Anna Bridge 180:96ed750bd169 305 __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
Anna Bridge 180:96ed750bd169 306 #else
Anna Bridge 180:96ed750bd169 307 /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
Anna Bridge 180:96ed750bd169 308 accepted by assembler. So has to use following less efficient pattern.
Anna Bridge 180:96ed750bd169 309 */
Anna Bridge 180:96ed750bd169 310 __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
Anna Bridge 180:96ed750bd169 311 #endif
Anna Bridge 180:96ed750bd169 312 return ((uint16_t) result); /* Add explicit type cast here */
Anna Bridge 180:96ed750bd169 313 }
Anna Bridge 180:96ed750bd169 314
Anna Bridge 180:96ed750bd169 315
Anna Bridge 180:96ed750bd169 316 /**
Anna Bridge 180:96ed750bd169 317 \brief LDR Exclusive (32 bit)
Anna Bridge 180:96ed750bd169 318 \details Executes a exclusive LDR instruction for 32 bit values.
Anna Bridge 180:96ed750bd169 319 \param [in] ptr Pointer to data
Anna Bridge 180:96ed750bd169 320 \return value of type uint32_t at (*ptr)
Anna Bridge 180:96ed750bd169 321 */
Anna Bridge 180:96ed750bd169 322 __STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr)
Anna Bridge 180:96ed750bd169 323 {
Anna Bridge 180:96ed750bd169 324 uint32_t result;
Anna Bridge 180:96ed750bd169 325
Anna Bridge 180:96ed750bd169 326 __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
Anna Bridge 180:96ed750bd169 327 return(result);
Anna Bridge 180:96ed750bd169 328 }
Anna Bridge 180:96ed750bd169 329
Anna Bridge 180:96ed750bd169 330
Anna Bridge 180:96ed750bd169 331 /**
Anna Bridge 180:96ed750bd169 332 \brief STR Exclusive (8 bit)
Anna Bridge 180:96ed750bd169 333 \details Executes a exclusive STR instruction for 8 bit values.
Anna Bridge 180:96ed750bd169 334 \param [in] value Value to store
Anna Bridge 180:96ed750bd169 335 \param [in] ptr Pointer to location
Anna Bridge 180:96ed750bd169 336 \return 0 Function succeeded
Anna Bridge 180:96ed750bd169 337 \return 1 Function failed
Anna Bridge 180:96ed750bd169 338 */
Anna Bridge 180:96ed750bd169 339 __STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
Anna Bridge 180:96ed750bd169 340 {
Anna Bridge 180:96ed750bd169 341 uint32_t result;
Anna Bridge 180:96ed750bd169 342
Anna Bridge 180:96ed750bd169 343 __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
Anna Bridge 180:96ed750bd169 344 return(result);
Anna Bridge 180:96ed750bd169 345 }
Anna Bridge 180:96ed750bd169 346
Anna Bridge 180:96ed750bd169 347
Anna Bridge 180:96ed750bd169 348 /**
Anna Bridge 180:96ed750bd169 349 \brief STR Exclusive (16 bit)
Anna Bridge 180:96ed750bd169 350 \details Executes a exclusive STR instruction for 16 bit values.
Anna Bridge 180:96ed750bd169 351 \param [in] value Value to store
Anna Bridge 180:96ed750bd169 352 \param [in] ptr Pointer to location
Anna Bridge 180:96ed750bd169 353 \return 0 Function succeeded
Anna Bridge 180:96ed750bd169 354 \return 1 Function failed
Anna Bridge 180:96ed750bd169 355 */
Anna Bridge 180:96ed750bd169 356 __STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
Anna Bridge 180:96ed750bd169 357 {
Anna Bridge 180:96ed750bd169 358 uint32_t result;
Anna Bridge 180:96ed750bd169 359
Anna Bridge 180:96ed750bd169 360 __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
Anna Bridge 180:96ed750bd169 361 return(result);
Anna Bridge 180:96ed750bd169 362 }
Anna Bridge 180:96ed750bd169 363
Anna Bridge 180:96ed750bd169 364
Anna Bridge 180:96ed750bd169 365 /**
Anna Bridge 180:96ed750bd169 366 \brief STR Exclusive (32 bit)
Anna Bridge 180:96ed750bd169 367 \details Executes a exclusive STR instruction for 32 bit values.
Anna Bridge 180:96ed750bd169 368 \param [in] value Value to store
Anna Bridge 180:96ed750bd169 369 \param [in] ptr Pointer to location
Anna Bridge 180:96ed750bd169 370 \return 0 Function succeeded
Anna Bridge 180:96ed750bd169 371 \return 1 Function failed
Anna Bridge 180:96ed750bd169 372 */
Anna Bridge 180:96ed750bd169 373 __STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
Anna Bridge 180:96ed750bd169 374 {
Anna Bridge 180:96ed750bd169 375 uint32_t result;
Anna Bridge 180:96ed750bd169 376
Anna Bridge 180:96ed750bd169 377 __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
Anna Bridge 180:96ed750bd169 378 return(result);
Anna Bridge 180:96ed750bd169 379 }
Anna Bridge 180:96ed750bd169 380
Anna Bridge 180:96ed750bd169 381
Anna Bridge 180:96ed750bd169 382 /**
Anna Bridge 180:96ed750bd169 383 \brief Remove the exclusive lock
Anna Bridge 180:96ed750bd169 384 \details Removes the exclusive lock which is created by LDREX.
Anna Bridge 180:96ed750bd169 385 */
Anna Bridge 180:96ed750bd169 386 __STATIC_FORCEINLINE void __CLREX(void)
Anna Bridge 180:96ed750bd169 387 {
Anna Bridge 180:96ed750bd169 388 __ASM volatile ("clrex" ::: "memory");
Anna Bridge 180:96ed750bd169 389 }
Anna Bridge 180:96ed750bd169 390
Anna Bridge 180:96ed750bd169 391 /**
Anna Bridge 180:96ed750bd169 392 \brief Signed Saturate
Anna Bridge 180:96ed750bd169 393 \details Saturates a signed value.
Anna Bridge 180:96ed750bd169 394 \param [in] value Value to be saturated
Anna Bridge 180:96ed750bd169 395 \param [in] sat Bit position to saturate to (1..32)
Anna Bridge 180:96ed750bd169 396 \return Saturated value
Anna Bridge 180:96ed750bd169 397 */
Anna Bridge 180:96ed750bd169 398 #define __SSAT(ARG1,ARG2) \
Anna Bridge 180:96ed750bd169 399 __extension__ \
Anna Bridge 180:96ed750bd169 400 ({ \
Anna Bridge 180:96ed750bd169 401 int32_t __RES, __ARG1 = (ARG1); \
Anna Bridge 180:96ed750bd169 402 __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
Anna Bridge 180:96ed750bd169 403 __RES; \
Anna Bridge 180:96ed750bd169 404 })
Anna Bridge 180:96ed750bd169 405
Anna Bridge 180:96ed750bd169 406
Anna Bridge 180:96ed750bd169 407 /**
Anna Bridge 180:96ed750bd169 408 \brief Unsigned Saturate
Anna Bridge 180:96ed750bd169 409 \details Saturates an unsigned value.
Anna Bridge 180:96ed750bd169 410 \param [in] value Value to be saturated
Anna Bridge 180:96ed750bd169 411 \param [in] sat Bit position to saturate to (0..31)
Anna Bridge 180:96ed750bd169 412 \return Saturated value
Anna Bridge 180:96ed750bd169 413 */
Anna Bridge 180:96ed750bd169 414 #define __USAT(ARG1,ARG2) \
Anna Bridge 180:96ed750bd169 415 __extension__ \
Anna Bridge 180:96ed750bd169 416 ({ \
Anna Bridge 180:96ed750bd169 417 uint32_t __RES, __ARG1 = (ARG1); \
Anna Bridge 180:96ed750bd169 418 __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
Anna Bridge 180:96ed750bd169 419 __RES; \
Anna Bridge 180:96ed750bd169 420 })
Anna Bridge 180:96ed750bd169 421
Anna Bridge 180:96ed750bd169 422 /* ########################### Core Function Access ########################### */
Anna Bridge 180:96ed750bd169 423
Anna Bridge 180:96ed750bd169 424 /**
Anna Bridge 180:96ed750bd169 425 \brief Enable IRQ Interrupts
Anna Bridge 180:96ed750bd169 426 \details Enables IRQ interrupts by clearing the I-bit in the CPSR.
Anna Bridge 180:96ed750bd169 427 Can only be executed in Privileged modes.
Anna Bridge 180:96ed750bd169 428 */
Anna Bridge 180:96ed750bd169 429 __STATIC_FORCEINLINE void __enable_irq(void)
Anna Bridge 180:96ed750bd169 430 {
Anna Bridge 180:96ed750bd169 431 __ASM volatile ("cpsie i" : : : "memory");
Anna Bridge 180:96ed750bd169 432 }
Anna Bridge 180:96ed750bd169 433
Anna Bridge 180:96ed750bd169 434 /**
Anna Bridge 180:96ed750bd169 435 \brief Disable IRQ Interrupts
Anna Bridge 180:96ed750bd169 436 \details Disables IRQ interrupts by setting the I-bit in the CPSR.
Anna Bridge 180:96ed750bd169 437 Can only be executed in Privileged modes.
Anna Bridge 180:96ed750bd169 438 */
Anna Bridge 180:96ed750bd169 439 __STATIC_FORCEINLINE void __disable_irq(void)
Anna Bridge 180:96ed750bd169 440 {
Anna Bridge 180:96ed750bd169 441 __ASM volatile ("cpsid i" : : : "memory");
Anna Bridge 180:96ed750bd169 442 }
Anna Bridge 180:96ed750bd169 443
Anna Bridge 180:96ed750bd169 444 /**
Anna Bridge 180:96ed750bd169 445 \brief Get FPSCR
Anna Bridge 180:96ed750bd169 446 \details Returns the current value of the Floating Point Status/Control register.
Anna Bridge 180:96ed750bd169 447 \return Floating Point Status/Control register value
Anna Bridge 180:96ed750bd169 448 */
Anna Bridge 180:96ed750bd169 449 __STATIC_FORCEINLINE uint32_t __get_FPSCR(void)
Anna Bridge 180:96ed750bd169 450 {
Anna Bridge 180:96ed750bd169 451 #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
Anna Bridge 180:96ed750bd169 452 (defined (__FPU_USED ) && (__FPU_USED == 1U)) )
AnnaBridge 188:bcfe06ba3d64 453 #if __has_builtin(__builtin_arm_get_fpscr)
AnnaBridge 188:bcfe06ba3d64 454 // Re-enable using built-in when GCC has been fixed
AnnaBridge 188:bcfe06ba3d64 455 // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2)
Anna Bridge 180:96ed750bd169 456 /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */
Anna Bridge 180:96ed750bd169 457 return __builtin_arm_get_fpscr();
Anna Bridge 180:96ed750bd169 458 #else
Anna Bridge 180:96ed750bd169 459 uint32_t result;
Anna Bridge 180:96ed750bd169 460
Anna Bridge 180:96ed750bd169 461 __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
Anna Bridge 180:96ed750bd169 462 return(result);
Anna Bridge 180:96ed750bd169 463 #endif
Anna Bridge 180:96ed750bd169 464 #else
Anna Bridge 180:96ed750bd169 465 return(0U);
Anna Bridge 180:96ed750bd169 466 #endif
Anna Bridge 180:96ed750bd169 467 }
Anna Bridge 180:96ed750bd169 468
Anna Bridge 180:96ed750bd169 469 /**
Anna Bridge 180:96ed750bd169 470 \brief Set FPSCR
Anna Bridge 180:96ed750bd169 471 \details Assigns the given value to the Floating Point Status/Control register.
Anna Bridge 180:96ed750bd169 472 \param [in] fpscr Floating Point Status/Control value to set
Anna Bridge 180:96ed750bd169 473 */
Anna Bridge 180:96ed750bd169 474 __STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr)
Anna Bridge 180:96ed750bd169 475 {
Anna Bridge 180:96ed750bd169 476 #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
Anna Bridge 180:96ed750bd169 477 (defined (__FPU_USED ) && (__FPU_USED == 1U)) )
AnnaBridge 188:bcfe06ba3d64 478 #if __has_builtin(__builtin_arm_set_fpscr)
AnnaBridge 188:bcfe06ba3d64 479 // Re-enable using built-in when GCC has been fixed
AnnaBridge 188:bcfe06ba3d64 480 // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2)
Anna Bridge 180:96ed750bd169 481 /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */
Anna Bridge 180:96ed750bd169 482 __builtin_arm_set_fpscr(fpscr);
Anna Bridge 180:96ed750bd169 483 #else
Anna Bridge 180:96ed750bd169 484 __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory");
Anna Bridge 180:96ed750bd169 485 #endif
Anna Bridge 180:96ed750bd169 486 #else
Anna Bridge 180:96ed750bd169 487 (void)fpscr;
Anna Bridge 180:96ed750bd169 488 #endif
Anna Bridge 180:96ed750bd169 489 }
Anna Bridge 180:96ed750bd169 490
Anna Bridge 180:96ed750bd169 491 /** \brief Get CPSR Register
Anna Bridge 180:96ed750bd169 492 \return CPSR Register value
Anna Bridge 180:96ed750bd169 493 */
Anna Bridge 180:96ed750bd169 494 __STATIC_FORCEINLINE uint32_t __get_CPSR(void)
Anna Bridge 180:96ed750bd169 495 {
Anna Bridge 180:96ed750bd169 496 uint32_t result;
Anna Bridge 180:96ed750bd169 497 __ASM volatile("MRS %0, cpsr" : "=r" (result) );
Anna Bridge 180:96ed750bd169 498 return(result);
Anna Bridge 180:96ed750bd169 499 }
Anna Bridge 180:96ed750bd169 500
Anna Bridge 180:96ed750bd169 501 /** \brief Set CPSR Register
Anna Bridge 180:96ed750bd169 502 \param [in] cpsr CPSR value to set
Anna Bridge 180:96ed750bd169 503 */
Anna Bridge 180:96ed750bd169 504 __STATIC_FORCEINLINE void __set_CPSR(uint32_t cpsr)
Anna Bridge 180:96ed750bd169 505 {
Anna Bridge 180:96ed750bd169 506 __ASM volatile ("MSR cpsr, %0" : : "r" (cpsr) : "memory");
Anna Bridge 180:96ed750bd169 507 }
Anna Bridge 180:96ed750bd169 508
Anna Bridge 180:96ed750bd169 509 /** \brief Get Mode
Anna Bridge 180:96ed750bd169 510 \return Processor Mode
Anna Bridge 180:96ed750bd169 511 */
Anna Bridge 180:96ed750bd169 512 __STATIC_FORCEINLINE uint32_t __get_mode(void)
Anna Bridge 180:96ed750bd169 513 {
Anna Bridge 180:96ed750bd169 514 return (__get_CPSR() & 0x1FU);
Anna Bridge 180:96ed750bd169 515 }
Anna Bridge 180:96ed750bd169 516
Anna Bridge 180:96ed750bd169 517 /** \brief Set Mode
Anna Bridge 180:96ed750bd169 518 \param [in] mode Mode value to set
Anna Bridge 180:96ed750bd169 519 */
Anna Bridge 180:96ed750bd169 520 __STATIC_FORCEINLINE void __set_mode(uint32_t mode)
Anna Bridge 180:96ed750bd169 521 {
Anna Bridge 180:96ed750bd169 522 __ASM volatile("MSR cpsr_c, %0" : : "r" (mode) : "memory");
Anna Bridge 180:96ed750bd169 523 }
Anna Bridge 180:96ed750bd169 524
Anna Bridge 180:96ed750bd169 525 /** \brief Get Stack Pointer
Anna Bridge 180:96ed750bd169 526 \return Stack Pointer value
Anna Bridge 180:96ed750bd169 527 */
Anna Bridge 180:96ed750bd169 528 __STATIC_FORCEINLINE uint32_t __get_SP(void)
Anna Bridge 180:96ed750bd169 529 {
Anna Bridge 180:96ed750bd169 530 uint32_t result;
Anna Bridge 180:96ed750bd169 531 __ASM volatile("MOV %0, sp" : "=r" (result) : : "memory");
Anna Bridge 180:96ed750bd169 532 return result;
Anna Bridge 180:96ed750bd169 533 }
Anna Bridge 180:96ed750bd169 534
Anna Bridge 180:96ed750bd169 535 /** \brief Set Stack Pointer
Anna Bridge 180:96ed750bd169 536 \param [in] stack Stack Pointer value to set
Anna Bridge 180:96ed750bd169 537 */
Anna Bridge 180:96ed750bd169 538 __STATIC_FORCEINLINE void __set_SP(uint32_t stack)
Anna Bridge 180:96ed750bd169 539 {
Anna Bridge 180:96ed750bd169 540 __ASM volatile("MOV sp, %0" : : "r" (stack) : "memory");
Anna Bridge 180:96ed750bd169 541 }
Anna Bridge 180:96ed750bd169 542
Anna Bridge 180:96ed750bd169 543 /** \brief Get USR/SYS Stack Pointer
Anna Bridge 180:96ed750bd169 544 \return USR/SYS Stack Pointer value
Anna Bridge 180:96ed750bd169 545 */
Anna Bridge 180:96ed750bd169 546 __STATIC_FORCEINLINE uint32_t __get_SP_usr(void)
Anna Bridge 180:96ed750bd169 547 {
Anna Bridge 180:96ed750bd169 548 uint32_t cpsr = __get_CPSR();
Anna Bridge 180:96ed750bd169 549 uint32_t result;
Anna Bridge 180:96ed750bd169 550 __ASM volatile(
Anna Bridge 180:96ed750bd169 551 "CPS #0x1F \n"
Anna Bridge 180:96ed750bd169 552 "MOV %0, sp " : "=r"(result) : : "memory"
Anna Bridge 180:96ed750bd169 553 );
Anna Bridge 180:96ed750bd169 554 __set_CPSR(cpsr);
Anna Bridge 180:96ed750bd169 555 __ISB();
Anna Bridge 180:96ed750bd169 556 return result;
Anna Bridge 180:96ed750bd169 557 }
Anna Bridge 180:96ed750bd169 558
Anna Bridge 180:96ed750bd169 559 /** \brief Set USR/SYS Stack Pointer
Anna Bridge 180:96ed750bd169 560 \param [in] topOfProcStack USR/SYS Stack Pointer value to set
Anna Bridge 180:96ed750bd169 561 */
Anna Bridge 180:96ed750bd169 562 __STATIC_FORCEINLINE void __set_SP_usr(uint32_t topOfProcStack)
Anna Bridge 180:96ed750bd169 563 {
Anna Bridge 180:96ed750bd169 564 uint32_t cpsr = __get_CPSR();
Anna Bridge 180:96ed750bd169 565 __ASM volatile(
Anna Bridge 180:96ed750bd169 566 "CPS #0x1F \n"
Anna Bridge 180:96ed750bd169 567 "MOV sp, %0 " : : "r" (topOfProcStack) : "memory"
Anna Bridge 180:96ed750bd169 568 );
Anna Bridge 180:96ed750bd169 569 __set_CPSR(cpsr);
Anna Bridge 180:96ed750bd169 570 __ISB();
Anna Bridge 180:96ed750bd169 571 }
Anna Bridge 180:96ed750bd169 572
Anna Bridge 180:96ed750bd169 573 /** \brief Get FPEXC
Anna Bridge 180:96ed750bd169 574 \return Floating Point Exception Control register value
Anna Bridge 180:96ed750bd169 575 */
Anna Bridge 180:96ed750bd169 576 __STATIC_FORCEINLINE uint32_t __get_FPEXC(void)
Anna Bridge 180:96ed750bd169 577 {
Anna Bridge 180:96ed750bd169 578 #if (__FPU_PRESENT == 1)
Anna Bridge 180:96ed750bd169 579 uint32_t result;
Anna Bridge 180:96ed750bd169 580 __ASM volatile("VMRS %0, fpexc" : "=r" (result) );
Anna Bridge 180:96ed750bd169 581 return(result);
Anna Bridge 180:96ed750bd169 582 #else
Anna Bridge 180:96ed750bd169 583 return(0);
Anna Bridge 180:96ed750bd169 584 #endif
Anna Bridge 180:96ed750bd169 585 }
Anna Bridge 180:96ed750bd169 586
Anna Bridge 180:96ed750bd169 587 /** \brief Set FPEXC
Anna Bridge 180:96ed750bd169 588 \param [in] fpexc Floating Point Exception Control value to set
Anna Bridge 180:96ed750bd169 589 */
Anna Bridge 180:96ed750bd169 590 __STATIC_FORCEINLINE void __set_FPEXC(uint32_t fpexc)
Anna Bridge 180:96ed750bd169 591 {
Anna Bridge 180:96ed750bd169 592 #if (__FPU_PRESENT == 1)
Anna Bridge 180:96ed750bd169 593 __ASM volatile ("VMSR fpexc, %0" : : "r" (fpexc) : "memory");
Anna Bridge 180:96ed750bd169 594 #endif
Anna Bridge 180:96ed750bd169 595 }
Anna Bridge 180:96ed750bd169 596
Anna Bridge 180:96ed750bd169 597 /*
Anna Bridge 180:96ed750bd169 598 * Include common core functions to access Coprocessor 15 registers
Anna Bridge 180:96ed750bd169 599 */
Anna Bridge 180:96ed750bd169 600
Anna Bridge 180:96ed750bd169 601 #define __get_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MRC p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : "=r" (Rt) : : "memory" )
Anna Bridge 180:96ed750bd169 602 #define __set_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" )
Anna Bridge 180:96ed750bd169 603 #define __get_CP64(cp, op1, Rt, CRm) __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" )
Anna Bridge 180:96ed750bd169 604 #define __set_CP64(cp, op1, Rt, CRm) __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" )
Anna Bridge 180:96ed750bd169 605
Anna Bridge 180:96ed750bd169 606 #include "cmsis_cp15.h"
Anna Bridge 180:96ed750bd169 607
Anna Bridge 180:96ed750bd169 608 /** \brief Enable Floating Point Unit
Anna Bridge 180:96ed750bd169 609
Anna Bridge 180:96ed750bd169 610 Critical section, called from undef handler, so systick is disabled
Anna Bridge 180:96ed750bd169 611 */
Anna Bridge 180:96ed750bd169 612 __STATIC_INLINE void __FPU_Enable(void)
Anna Bridge 180:96ed750bd169 613 {
Anna Bridge 180:96ed750bd169 614 __ASM volatile(
Anna Bridge 180:96ed750bd169 615 //Permit access to VFP/NEON, registers by modifying CPACR
Anna Bridge 180:96ed750bd169 616 " MRC p15,0,R1,c1,c0,2 \n"
Anna Bridge 180:96ed750bd169 617 " ORR R1,R1,#0x00F00000 \n"
Anna Bridge 180:96ed750bd169 618 " MCR p15,0,R1,c1,c0,2 \n"
Anna Bridge 180:96ed750bd169 619
Anna Bridge 180:96ed750bd169 620 //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted
Anna Bridge 180:96ed750bd169 621 " ISB \n"
Anna Bridge 180:96ed750bd169 622
Anna Bridge 180:96ed750bd169 623 //Enable VFP/NEON
Anna Bridge 180:96ed750bd169 624 " VMRS R1,FPEXC \n"
Anna Bridge 180:96ed750bd169 625 " ORR R1,R1,#0x40000000 \n"
Anna Bridge 180:96ed750bd169 626 " VMSR FPEXC,R1 \n"
Anna Bridge 180:96ed750bd169 627
Anna Bridge 180:96ed750bd169 628 //Initialise VFP/NEON registers to 0
Anna Bridge 180:96ed750bd169 629 " MOV R2,#0 \n"
Anna Bridge 180:96ed750bd169 630
Anna Bridge 180:96ed750bd169 631 //Initialise D16 registers to 0
Anna Bridge 180:96ed750bd169 632 " VMOV D0, R2,R2 \n"
Anna Bridge 180:96ed750bd169 633 " VMOV D1, R2,R2 \n"
Anna Bridge 180:96ed750bd169 634 " VMOV D2, R2,R2 \n"
Anna Bridge 180:96ed750bd169 635 " VMOV D3, R2,R2 \n"
Anna Bridge 180:96ed750bd169 636 " VMOV D4, R2,R2 \n"
Anna Bridge 180:96ed750bd169 637 " VMOV D5, R2,R2 \n"
Anna Bridge 180:96ed750bd169 638 " VMOV D6, R2,R2 \n"
Anna Bridge 180:96ed750bd169 639 " VMOV D7, R2,R2 \n"
Anna Bridge 180:96ed750bd169 640 " VMOV D8, R2,R2 \n"
Anna Bridge 180:96ed750bd169 641 " VMOV D9, R2,R2 \n"
Anna Bridge 180:96ed750bd169 642 " VMOV D10,R2,R2 \n"
Anna Bridge 180:96ed750bd169 643 " VMOV D11,R2,R2 \n"
Anna Bridge 180:96ed750bd169 644 " VMOV D12,R2,R2 \n"
Anna Bridge 180:96ed750bd169 645 " VMOV D13,R2,R2 \n"
Anna Bridge 180:96ed750bd169 646 " VMOV D14,R2,R2 \n"
Anna Bridge 180:96ed750bd169 647 " VMOV D15,R2,R2 \n"
Anna Bridge 180:96ed750bd169 648
Anna Bridge 186:707f6e361f3e 649 #if (defined(__ARM_NEON) && (__ARM_NEON == 1))
Anna Bridge 180:96ed750bd169 650 //Initialise D32 registers to 0
Anna Bridge 180:96ed750bd169 651 " VMOV D16,R2,R2 \n"
Anna Bridge 180:96ed750bd169 652 " VMOV D17,R2,R2 \n"
Anna Bridge 180:96ed750bd169 653 " VMOV D18,R2,R2 \n"
Anna Bridge 180:96ed750bd169 654 " VMOV D19,R2,R2 \n"
Anna Bridge 180:96ed750bd169 655 " VMOV D20,R2,R2 \n"
Anna Bridge 180:96ed750bd169 656 " VMOV D21,R2,R2 \n"
Anna Bridge 180:96ed750bd169 657 " VMOV D22,R2,R2 \n"
Anna Bridge 180:96ed750bd169 658 " VMOV D23,R2,R2 \n"
Anna Bridge 180:96ed750bd169 659 " VMOV D24,R2,R2 \n"
Anna Bridge 180:96ed750bd169 660 " VMOV D25,R2,R2 \n"
Anna Bridge 180:96ed750bd169 661 " VMOV D26,R2,R2 \n"
Anna Bridge 180:96ed750bd169 662 " VMOV D27,R2,R2 \n"
Anna Bridge 180:96ed750bd169 663 " VMOV D28,R2,R2 \n"
Anna Bridge 180:96ed750bd169 664 " VMOV D29,R2,R2 \n"
Anna Bridge 180:96ed750bd169 665 " VMOV D30,R2,R2 \n"
Anna Bridge 180:96ed750bd169 666 " VMOV D31,R2,R2 \n"
Anna Bridge 180:96ed750bd169 667 #endif
Anna Bridge 180:96ed750bd169 668
Anna Bridge 180:96ed750bd169 669 //Initialise FPSCR to a known state
Anna Bridge 180:96ed750bd169 670 " VMRS R2,FPSCR \n"
Anna Bridge 180:96ed750bd169 671 " LDR R3,=0x00086060 \n" //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero.
Anna Bridge 180:96ed750bd169 672 " AND R2,R2,R3 \n"
Anna Bridge 180:96ed750bd169 673 " VMSR FPSCR,R2 "
Anna Bridge 180:96ed750bd169 674 );
Anna Bridge 180:96ed750bd169 675 }
Anna Bridge 180:96ed750bd169 676
Anna Bridge 180:96ed750bd169 677 #pragma GCC diagnostic pop
Anna Bridge 180:96ed750bd169 678
Anna Bridge 180:96ed750bd169 679 #endif /* __CMSIS_GCC_H */