The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Thu Sep 06 13:39:34 2018 +0100
Revision:
170:e95d10626187
Parent:
169:a7c7b631e539
mbed library. Release version 163

Who changed what in which revision?

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