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:
186:707f6e361f3e
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_armclang.h
Anna Bridge 180:96ed750bd169 3 * @brief CMSIS compiler specific macros, functions, instructions
Anna Bridge 186:707f6e361f3e 4 * @version V1.0.2
Anna Bridge 186:707f6e361f3e 5 * @date 10. January 2018
Anna Bridge 180:96ed750bd169 6 ******************************************************************************/
Anna Bridge 180:96ed750bd169 7 /*
Anna Bridge 186:707f6e361f3e 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_ARMCLANG_H
Anna Bridge 180:96ed750bd169 26 #define __CMSIS_ARMCLANG_H
Anna Bridge 180:96ed750bd169 27
Anna Bridge 180:96ed750bd169 28 #pragma clang system_header /* treat file as system include file */
Anna Bridge 180:96ed750bd169 29
Anna Bridge 180:96ed750bd169 30 #ifndef __ARM_COMPAT_H
Anna Bridge 186:707f6e361f3e 31 #include <arm_compat.h> /* Compatibility header for Arm Compiler 5 intrinsics */
Anna Bridge 180:96ed750bd169 32 #endif
Anna Bridge 180:96ed750bd169 33
Anna Bridge 180:96ed750bd169 34 /* CMSIS compiler specific defines */
Anna Bridge 180:96ed750bd169 35 #ifndef __ASM
Anna Bridge 180:96ed750bd169 36 #define __ASM __asm
Anna Bridge 180:96ed750bd169 37 #endif
Anna Bridge 180:96ed750bd169 38 #ifndef __INLINE
Anna Bridge 180:96ed750bd169 39 #define __INLINE __inline
Anna Bridge 180:96ed750bd169 40 #endif
Anna Bridge 180:96ed750bd169 41 #ifndef __FORCEINLINE
Anna Bridge 180:96ed750bd169 42 #define __FORCEINLINE __attribute__((always_inline))
Anna Bridge 180:96ed750bd169 43 #endif
Anna Bridge 180:96ed750bd169 44 #ifndef __STATIC_INLINE
Anna Bridge 180:96ed750bd169 45 #define __STATIC_INLINE static __inline
Anna Bridge 180:96ed750bd169 46 #endif
Anna Bridge 180:96ed750bd169 47 #ifndef __STATIC_FORCEINLINE
Anna Bridge 180:96ed750bd169 48 #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline
Anna Bridge 180:96ed750bd169 49 #endif
Anna Bridge 180:96ed750bd169 50 #ifndef __NO_RETURN
Anna Bridge 180:96ed750bd169 51 #define __NO_RETURN __attribute__((__noreturn__))
Anna Bridge 180:96ed750bd169 52 #endif
Anna Bridge 180:96ed750bd169 53 #ifndef CMSIS_DEPRECATED
Anna Bridge 180:96ed750bd169 54 #define CMSIS_DEPRECATED __attribute__((deprecated))
Anna Bridge 180:96ed750bd169 55 #endif
Anna Bridge 180:96ed750bd169 56 #ifndef __USED
Anna Bridge 180:96ed750bd169 57 #define __USED __attribute__((used))
Anna Bridge 180:96ed750bd169 58 #endif
Anna Bridge 180:96ed750bd169 59 #ifndef __WEAK
Anna Bridge 180:96ed750bd169 60 #define __WEAK __attribute__((weak))
Anna Bridge 180:96ed750bd169 61 #endif
Anna Bridge 180:96ed750bd169 62 #ifndef __PACKED
Anna Bridge 180:96ed750bd169 63 #define __PACKED __attribute__((packed, aligned(1)))
Anna Bridge 180:96ed750bd169 64 #endif
Anna Bridge 180:96ed750bd169 65 #ifndef __PACKED_STRUCT
Anna Bridge 180:96ed750bd169 66 #define __PACKED_STRUCT struct __attribute__((packed, aligned(1)))
Anna Bridge 180:96ed750bd169 67 #endif
Anna Bridge 180:96ed750bd169 68 #ifndef __UNALIGNED_UINT16_WRITE
Anna Bridge 180:96ed750bd169 69 #pragma clang diagnostic push
Anna Bridge 180:96ed750bd169 70 #pragma clang diagnostic ignored "-Wpacked"
Anna Bridge 180:96ed750bd169 71 /*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */
Anna Bridge 180:96ed750bd169 72 __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };
Anna Bridge 180:96ed750bd169 73 #pragma clang diagnostic pop
Anna Bridge 180:96ed750bd169 74 #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))
Anna Bridge 180:96ed750bd169 75 #endif
Anna Bridge 180:96ed750bd169 76 #ifndef __UNALIGNED_UINT16_READ
Anna Bridge 180:96ed750bd169 77 #pragma clang diagnostic push
Anna Bridge 180:96ed750bd169 78 #pragma clang diagnostic ignored "-Wpacked"
Anna Bridge 180:96ed750bd169 79 /*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */
Anna Bridge 180:96ed750bd169 80 __PACKED_STRUCT T_UINT16_READ { uint16_t v; };
Anna Bridge 180:96ed750bd169 81 #pragma clang diagnostic pop
Anna Bridge 180:96ed750bd169 82 #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v)
Anna Bridge 180:96ed750bd169 83 #endif
Anna Bridge 180:96ed750bd169 84 #ifndef __UNALIGNED_UINT32_WRITE
Anna Bridge 180:96ed750bd169 85 #pragma clang diagnostic push
Anna Bridge 180:96ed750bd169 86 #pragma clang diagnostic ignored "-Wpacked"
Anna Bridge 180:96ed750bd169 87 /*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */
Anna Bridge 180:96ed750bd169 88 __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };
Anna Bridge 180:96ed750bd169 89 #pragma clang diagnostic pop
Anna Bridge 180:96ed750bd169 90 #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))
Anna Bridge 180:96ed750bd169 91 #endif
Anna Bridge 180:96ed750bd169 92 #ifndef __UNALIGNED_UINT32_READ
Anna Bridge 180:96ed750bd169 93 #pragma clang diagnostic push
Anna Bridge 180:96ed750bd169 94 #pragma clang diagnostic ignored "-Wpacked"
Anna Bridge 180:96ed750bd169 95 __PACKED_STRUCT T_UINT32_READ { uint32_t v; };
Anna Bridge 180:96ed750bd169 96 #pragma clang diagnostic pop
Anna Bridge 180:96ed750bd169 97 #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v)
Anna Bridge 180:96ed750bd169 98 #endif
Anna Bridge 180:96ed750bd169 99 #ifndef __ALIGNED
Anna Bridge 180:96ed750bd169 100 #define __ALIGNED(x) __attribute__((aligned(x)))
Anna Bridge 180:96ed750bd169 101 #endif
Anna Bridge 180:96ed750bd169 102 #ifndef __PACKED
Anna Bridge 180:96ed750bd169 103 #define __PACKED __attribute__((packed))
Anna Bridge 180:96ed750bd169 104 #endif
Anna Bridge 180:96ed750bd169 105
Anna Bridge 180:96ed750bd169 106 /* ########################## Core Instruction Access ######################### */
Anna Bridge 180:96ed750bd169 107 /**
Anna Bridge 180:96ed750bd169 108 \brief No Operation
Anna Bridge 180:96ed750bd169 109 */
Anna Bridge 180:96ed750bd169 110 #define __NOP __builtin_arm_nop
Anna Bridge 180:96ed750bd169 111
Anna Bridge 180:96ed750bd169 112 /**
Anna Bridge 180:96ed750bd169 113 \brief Wait For Interrupt
Anna Bridge 180:96ed750bd169 114 */
Anna Bridge 180:96ed750bd169 115 #define __WFI __builtin_arm_wfi
Anna Bridge 180:96ed750bd169 116
Anna Bridge 180:96ed750bd169 117 /**
Anna Bridge 180:96ed750bd169 118 \brief Wait For Event
Anna Bridge 180:96ed750bd169 119 */
Anna Bridge 180:96ed750bd169 120 #define __WFE __builtin_arm_wfe
Anna Bridge 180:96ed750bd169 121
Anna Bridge 180:96ed750bd169 122 /**
Anna Bridge 180:96ed750bd169 123 \brief Send Event
Anna Bridge 180:96ed750bd169 124 */
Anna Bridge 180:96ed750bd169 125 #define __SEV __builtin_arm_sev
Anna Bridge 180:96ed750bd169 126
Anna Bridge 180:96ed750bd169 127 /**
Anna Bridge 180:96ed750bd169 128 \brief Instruction Synchronization Barrier
Anna Bridge 180:96ed750bd169 129 */
Anna Bridge 180:96ed750bd169 130 #define __ISB() do {\
Anna Bridge 180:96ed750bd169 131 __schedule_barrier();\
Anna Bridge 180:96ed750bd169 132 __builtin_arm_isb(0xF);\
Anna Bridge 180:96ed750bd169 133 __schedule_barrier();\
Anna Bridge 180:96ed750bd169 134 } while (0U)
Anna Bridge 180:96ed750bd169 135
Anna Bridge 180:96ed750bd169 136 /**
Anna Bridge 180:96ed750bd169 137 \brief Data Synchronization Barrier
Anna Bridge 180:96ed750bd169 138 */
Anna Bridge 180:96ed750bd169 139 #define __DSB() do {\
Anna Bridge 180:96ed750bd169 140 __schedule_barrier();\
Anna Bridge 180:96ed750bd169 141 __builtin_arm_dsb(0xF);\
Anna Bridge 180:96ed750bd169 142 __schedule_barrier();\
Anna Bridge 180:96ed750bd169 143 } while (0U)
Anna Bridge 180:96ed750bd169 144
Anna Bridge 180:96ed750bd169 145 /**
Anna Bridge 180:96ed750bd169 146 \brief Data Memory Barrier
Anna Bridge 180:96ed750bd169 147 */
Anna Bridge 180:96ed750bd169 148 #define __DMB() do {\
Anna Bridge 180:96ed750bd169 149 __schedule_barrier();\
Anna Bridge 180:96ed750bd169 150 __builtin_arm_dmb(0xF);\
Anna Bridge 180:96ed750bd169 151 __schedule_barrier();\
Anna Bridge 180:96ed750bd169 152 } while (0U)
Anna Bridge 180:96ed750bd169 153
Anna Bridge 180:96ed750bd169 154 /**
Anna Bridge 180:96ed750bd169 155 \brief Reverse byte order (32 bit)
Anna Bridge 180:96ed750bd169 156 \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.
Anna Bridge 180:96ed750bd169 157 \param [in] value Value to reverse
Anna Bridge 180:96ed750bd169 158 \return Reversed value
Anna Bridge 180:96ed750bd169 159 */
Anna Bridge 180:96ed750bd169 160 #define __REV(value) __builtin_bswap32(value)
Anna Bridge 180:96ed750bd169 161
Anna Bridge 180:96ed750bd169 162 /**
Anna Bridge 180:96ed750bd169 163 \brief Reverse byte order (16 bit)
Anna Bridge 180:96ed750bd169 164 \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.
Anna Bridge 180:96ed750bd169 165 \param [in] value Value to reverse
Anna Bridge 180:96ed750bd169 166 \return Reversed value
Anna Bridge 180:96ed750bd169 167 */
Anna Bridge 180:96ed750bd169 168 #define __REV16(value) __ROR(__REV(value), 16)
Anna Bridge 180:96ed750bd169 169
Anna Bridge 180:96ed750bd169 170
Anna Bridge 180:96ed750bd169 171 /**
Anna Bridge 180:96ed750bd169 172 \brief Reverse byte order (16 bit)
Anna Bridge 180:96ed750bd169 173 \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 174 \param [in] value Value to reverse
Anna Bridge 180:96ed750bd169 175 \return Reversed value
Anna Bridge 180:96ed750bd169 176 */
Anna Bridge 180:96ed750bd169 177 #define __REVSH(value) (int16_t)__builtin_bswap16(value)
Anna Bridge 180:96ed750bd169 178
Anna Bridge 180:96ed750bd169 179
Anna Bridge 180:96ed750bd169 180 /**
Anna Bridge 180:96ed750bd169 181 \brief Rotate Right in unsigned value (32 bit)
Anna Bridge 180:96ed750bd169 182 \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
Anna Bridge 180:96ed750bd169 183 \param [in] op1 Value to rotate
Anna Bridge 180:96ed750bd169 184 \param [in] op2 Number of Bits to rotate
Anna Bridge 180:96ed750bd169 185 \return Rotated value
Anna Bridge 180:96ed750bd169 186 */
Anna Bridge 180:96ed750bd169 187 __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
Anna Bridge 180:96ed750bd169 188 {
Anna Bridge 180:96ed750bd169 189 op2 %= 32U;
Anna Bridge 180:96ed750bd169 190 if (op2 == 0U)
Anna Bridge 180:96ed750bd169 191 {
Anna Bridge 180:96ed750bd169 192 return op1;
Anna Bridge 180:96ed750bd169 193 }
Anna Bridge 180:96ed750bd169 194 return (op1 >> op2) | (op1 << (32U - op2));
Anna Bridge 180:96ed750bd169 195 }
Anna Bridge 180:96ed750bd169 196
Anna Bridge 180:96ed750bd169 197
Anna Bridge 180:96ed750bd169 198 /**
Anna Bridge 180:96ed750bd169 199 \brief Breakpoint
Anna Bridge 180:96ed750bd169 200 \param [in] value is ignored by the processor.
Anna Bridge 180:96ed750bd169 201 If required, a debugger can use it to store additional information about the breakpoint.
Anna Bridge 180:96ed750bd169 202 */
Anna Bridge 180:96ed750bd169 203 #define __BKPT(value) __ASM volatile ("bkpt "#value)
Anna Bridge 180:96ed750bd169 204
Anna Bridge 180:96ed750bd169 205 /**
Anna Bridge 180:96ed750bd169 206 \brief Reverse bit order of value
Anna Bridge 180:96ed750bd169 207 \param [in] value Value to reverse
Anna Bridge 180:96ed750bd169 208 \return Reversed value
Anna Bridge 180:96ed750bd169 209 */
Anna Bridge 180:96ed750bd169 210 #define __RBIT __builtin_arm_rbit
Anna Bridge 180:96ed750bd169 211
Anna Bridge 180:96ed750bd169 212 /**
Anna Bridge 180:96ed750bd169 213 \brief Count leading zeros
Anna Bridge 180:96ed750bd169 214 \param [in] value Value to count the leading zeros
Anna Bridge 180:96ed750bd169 215 \return number of leading zeros in value
Anna Bridge 180:96ed750bd169 216 */
Anna Bridge 180:96ed750bd169 217 #define __CLZ (uint8_t)__builtin_clz
Anna Bridge 180:96ed750bd169 218
Anna Bridge 180:96ed750bd169 219 /**
Anna Bridge 180:96ed750bd169 220 \brief LDR Exclusive (8 bit)
Anna Bridge 180:96ed750bd169 221 \details Executes a exclusive LDR instruction for 8 bit value.
Anna Bridge 180:96ed750bd169 222 \param [in] ptr Pointer to data
Anna Bridge 180:96ed750bd169 223 \return value of type uint8_t at (*ptr)
Anna Bridge 180:96ed750bd169 224 */
Anna Bridge 180:96ed750bd169 225 #define __LDREXB (uint8_t)__builtin_arm_ldrex
Anna Bridge 180:96ed750bd169 226
Anna Bridge 180:96ed750bd169 227
Anna Bridge 180:96ed750bd169 228 /**
Anna Bridge 180:96ed750bd169 229 \brief LDR Exclusive (16 bit)
Anna Bridge 180:96ed750bd169 230 \details Executes a exclusive LDR instruction for 16 bit values.
Anna Bridge 180:96ed750bd169 231 \param [in] ptr Pointer to data
Anna Bridge 180:96ed750bd169 232 \return value of type uint16_t at (*ptr)
Anna Bridge 180:96ed750bd169 233 */
Anna Bridge 180:96ed750bd169 234 #define __LDREXH (uint16_t)__builtin_arm_ldrex
Anna Bridge 180:96ed750bd169 235
Anna Bridge 180:96ed750bd169 236 /**
Anna Bridge 180:96ed750bd169 237 \brief LDR Exclusive (32 bit)
Anna Bridge 180:96ed750bd169 238 \details Executes a exclusive LDR instruction for 32 bit values.
Anna Bridge 180:96ed750bd169 239 \param [in] ptr Pointer to data
Anna Bridge 180:96ed750bd169 240 \return value of type uint32_t at (*ptr)
Anna Bridge 180:96ed750bd169 241 */
Anna Bridge 180:96ed750bd169 242 #define __LDREXW (uint32_t)__builtin_arm_ldrex
Anna Bridge 180:96ed750bd169 243
Anna Bridge 180:96ed750bd169 244 /**
Anna Bridge 180:96ed750bd169 245 \brief STR Exclusive (8 bit)
Anna Bridge 180:96ed750bd169 246 \details Executes a exclusive STR instruction for 8 bit values.
Anna Bridge 180:96ed750bd169 247 \param [in] value Value to store
Anna Bridge 180:96ed750bd169 248 \param [in] ptr Pointer to location
Anna Bridge 180:96ed750bd169 249 \return 0 Function succeeded
Anna Bridge 180:96ed750bd169 250 \return 1 Function failed
Anna Bridge 180:96ed750bd169 251 */
Anna Bridge 180:96ed750bd169 252 #define __STREXB (uint32_t)__builtin_arm_strex
Anna Bridge 180:96ed750bd169 253
Anna Bridge 180:96ed750bd169 254 /**
Anna Bridge 180:96ed750bd169 255 \brief STR Exclusive (16 bit)
Anna Bridge 180:96ed750bd169 256 \details Executes a exclusive STR instruction for 16 bit values.
Anna Bridge 180:96ed750bd169 257 \param [in] value Value to store
Anna Bridge 180:96ed750bd169 258 \param [in] ptr Pointer to location
Anna Bridge 180:96ed750bd169 259 \return 0 Function succeeded
Anna Bridge 180:96ed750bd169 260 \return 1 Function failed
Anna Bridge 180:96ed750bd169 261 */
Anna Bridge 180:96ed750bd169 262 #define __STREXH (uint32_t)__builtin_arm_strex
Anna Bridge 180:96ed750bd169 263
Anna Bridge 180:96ed750bd169 264 /**
Anna Bridge 180:96ed750bd169 265 \brief STR Exclusive (32 bit)
Anna Bridge 180:96ed750bd169 266 \details Executes a exclusive STR instruction for 32 bit values.
Anna Bridge 180:96ed750bd169 267 \param [in] value Value to store
Anna Bridge 180:96ed750bd169 268 \param [in] ptr Pointer to location
Anna Bridge 180:96ed750bd169 269 \return 0 Function succeeded
Anna Bridge 180:96ed750bd169 270 \return 1 Function failed
Anna Bridge 180:96ed750bd169 271 */
Anna Bridge 180:96ed750bd169 272 #define __STREXW (uint32_t)__builtin_arm_strex
Anna Bridge 180:96ed750bd169 273
Anna Bridge 180:96ed750bd169 274 /**
Anna Bridge 180:96ed750bd169 275 \brief Remove the exclusive lock
Anna Bridge 180:96ed750bd169 276 \details Removes the exclusive lock which is created by LDREX.
Anna Bridge 180:96ed750bd169 277 */
Anna Bridge 180:96ed750bd169 278 #define __CLREX __builtin_arm_clrex
Anna Bridge 180:96ed750bd169 279
Anna Bridge 180:96ed750bd169 280 /**
Anna Bridge 180:96ed750bd169 281 \brief Signed Saturate
Anna Bridge 180:96ed750bd169 282 \details Saturates a signed value.
Anna Bridge 180:96ed750bd169 283 \param [in] value Value to be saturated
Anna Bridge 180:96ed750bd169 284 \param [in] sat Bit position to saturate to (1..32)
Anna Bridge 180:96ed750bd169 285 \return Saturated value
Anna Bridge 180:96ed750bd169 286 */
Anna Bridge 180:96ed750bd169 287 #define __SSAT __builtin_arm_ssat
Anna Bridge 180:96ed750bd169 288
Anna Bridge 180:96ed750bd169 289 /**
Anna Bridge 180:96ed750bd169 290 \brief Unsigned Saturate
Anna Bridge 180:96ed750bd169 291 \details Saturates an unsigned value.
Anna Bridge 180:96ed750bd169 292 \param [in] value Value to be saturated
Anna Bridge 180:96ed750bd169 293 \param [in] sat Bit position to saturate to (0..31)
Anna Bridge 180:96ed750bd169 294 \return Saturated value
Anna Bridge 180:96ed750bd169 295 */
Anna Bridge 180:96ed750bd169 296 #define __USAT __builtin_arm_usat
Anna Bridge 180:96ed750bd169 297
Anna Bridge 180:96ed750bd169 298
Anna Bridge 180:96ed750bd169 299 /* ########################### Core Function Access ########################### */
Anna Bridge 180:96ed750bd169 300
Anna Bridge 180:96ed750bd169 301 /**
Anna Bridge 180:96ed750bd169 302 \brief Get FPSCR
Anna Bridge 180:96ed750bd169 303 \details Returns the current value of the Floating Point Status/Control register.
Anna Bridge 180:96ed750bd169 304 \return Floating Point Status/Control register value
Anna Bridge 180:96ed750bd169 305 */
Anna Bridge 180:96ed750bd169 306 #define __get_FPSCR __builtin_arm_get_fpscr
Anna Bridge 180:96ed750bd169 307
Anna Bridge 180:96ed750bd169 308 /**
Anna Bridge 180:96ed750bd169 309 \brief Set FPSCR
Anna Bridge 180:96ed750bd169 310 \details Assigns the given value to the Floating Point Status/Control register.
Anna Bridge 180:96ed750bd169 311 \param [in] fpscr Floating Point Status/Control value to set
Anna Bridge 180:96ed750bd169 312 */
Anna Bridge 180:96ed750bd169 313 #define __set_FPSCR __builtin_arm_set_fpscr
Anna Bridge 180:96ed750bd169 314
Anna Bridge 180:96ed750bd169 315 /** \brief Get CPSR Register
Anna Bridge 180:96ed750bd169 316 \return CPSR Register value
Anna Bridge 180:96ed750bd169 317 */
Anna Bridge 180:96ed750bd169 318 __STATIC_FORCEINLINE uint32_t __get_CPSR(void)
Anna Bridge 180:96ed750bd169 319 {
Anna Bridge 180:96ed750bd169 320 uint32_t result;
Anna Bridge 180:96ed750bd169 321 __ASM volatile("MRS %0, cpsr" : "=r" (result) );
Anna Bridge 180:96ed750bd169 322 return(result);
Anna Bridge 180:96ed750bd169 323 }
Anna Bridge 180:96ed750bd169 324
Anna Bridge 180:96ed750bd169 325 /** \brief Set CPSR Register
Anna Bridge 180:96ed750bd169 326 \param [in] cpsr CPSR value to set
Anna Bridge 180:96ed750bd169 327 */
Anna Bridge 180:96ed750bd169 328 __STATIC_FORCEINLINE void __set_CPSR(uint32_t cpsr)
Anna Bridge 180:96ed750bd169 329 {
Anna Bridge 180:96ed750bd169 330 __ASM volatile ("MSR cpsr, %0" : : "r" (cpsr) : "memory");
Anna Bridge 180:96ed750bd169 331 }
Anna Bridge 180:96ed750bd169 332
Anna Bridge 180:96ed750bd169 333 /** \brief Get Mode
Anna Bridge 180:96ed750bd169 334 \return Processor Mode
Anna Bridge 180:96ed750bd169 335 */
Anna Bridge 180:96ed750bd169 336 __STATIC_FORCEINLINE uint32_t __get_mode(void)
Anna Bridge 180:96ed750bd169 337 {
Anna Bridge 180:96ed750bd169 338 return (__get_CPSR() & 0x1FU);
Anna Bridge 180:96ed750bd169 339 }
Anna Bridge 180:96ed750bd169 340
Anna Bridge 180:96ed750bd169 341 /** \brief Set Mode
Anna Bridge 180:96ed750bd169 342 \param [in] mode Mode value to set
Anna Bridge 180:96ed750bd169 343 */
Anna Bridge 180:96ed750bd169 344 __STATIC_FORCEINLINE void __set_mode(uint32_t mode)
Anna Bridge 180:96ed750bd169 345 {
Anna Bridge 180:96ed750bd169 346 __ASM volatile("MSR cpsr_c, %0" : : "r" (mode) : "memory");
Anna Bridge 180:96ed750bd169 347 }
Anna Bridge 180:96ed750bd169 348
Anna Bridge 180:96ed750bd169 349 /** \brief Get Stack Pointer
Anna Bridge 180:96ed750bd169 350 \return Stack Pointer value
Anna Bridge 180:96ed750bd169 351 */
Anna Bridge 180:96ed750bd169 352 __STATIC_FORCEINLINE uint32_t __get_SP()
Anna Bridge 180:96ed750bd169 353 {
Anna Bridge 180:96ed750bd169 354 uint32_t result;
Anna Bridge 180:96ed750bd169 355 __ASM volatile("MOV %0, sp" : "=r" (result) : : "memory");
Anna Bridge 180:96ed750bd169 356 return result;
Anna Bridge 180:96ed750bd169 357 }
Anna Bridge 180:96ed750bd169 358
Anna Bridge 180:96ed750bd169 359 /** \brief Set Stack Pointer
Anna Bridge 180:96ed750bd169 360 \param [in] stack Stack Pointer value to set
Anna Bridge 180:96ed750bd169 361 */
Anna Bridge 180:96ed750bd169 362 __STATIC_FORCEINLINE void __set_SP(uint32_t stack)
Anna Bridge 180:96ed750bd169 363 {
Anna Bridge 180:96ed750bd169 364 __ASM volatile("MOV sp, %0" : : "r" (stack) : "memory");
Anna Bridge 180:96ed750bd169 365 }
Anna Bridge 180:96ed750bd169 366
Anna Bridge 180:96ed750bd169 367 /** \brief Get USR/SYS Stack Pointer
Anna Bridge 180:96ed750bd169 368 \return USR/SYS Stack Pointer value
Anna Bridge 180:96ed750bd169 369 */
Anna Bridge 180:96ed750bd169 370 __STATIC_FORCEINLINE uint32_t __get_SP_usr()
Anna Bridge 180:96ed750bd169 371 {
Anna Bridge 180:96ed750bd169 372 uint32_t cpsr;
Anna Bridge 180:96ed750bd169 373 uint32_t result;
Anna Bridge 180:96ed750bd169 374 __ASM volatile(
Anna Bridge 180:96ed750bd169 375 "MRS %0, cpsr \n"
Anna Bridge 180:96ed750bd169 376 "CPS #0x1F \n" // no effect in USR mode
Anna Bridge 180:96ed750bd169 377 "MOV %1, sp \n"
Anna Bridge 180:96ed750bd169 378 "MSR cpsr_c, %2 \n" // no effect in USR mode
Anna Bridge 180:96ed750bd169 379 "ISB" : "=r"(cpsr), "=r"(result) : "r"(cpsr) : "memory"
Anna Bridge 180:96ed750bd169 380 );
Anna Bridge 180:96ed750bd169 381 return result;
Anna Bridge 180:96ed750bd169 382 }
Anna Bridge 180:96ed750bd169 383
Anna Bridge 180:96ed750bd169 384 /** \brief Set USR/SYS Stack Pointer
Anna Bridge 180:96ed750bd169 385 \param [in] topOfProcStack USR/SYS Stack Pointer value to set
Anna Bridge 180:96ed750bd169 386 */
Anna Bridge 180:96ed750bd169 387 __STATIC_FORCEINLINE void __set_SP_usr(uint32_t topOfProcStack)
Anna Bridge 180:96ed750bd169 388 {
Anna Bridge 180:96ed750bd169 389 uint32_t cpsr;
Anna Bridge 180:96ed750bd169 390 __ASM volatile(
Anna Bridge 180:96ed750bd169 391 "MRS %0, cpsr \n"
Anna Bridge 180:96ed750bd169 392 "CPS #0x1F \n" // no effect in USR mode
Anna Bridge 180:96ed750bd169 393 "MOV sp, %1 \n"
Anna Bridge 180:96ed750bd169 394 "MSR cpsr_c, %2 \n" // no effect in USR mode
Anna Bridge 180:96ed750bd169 395 "ISB" : "=r"(cpsr) : "r" (topOfProcStack), "r"(cpsr) : "memory"
Anna Bridge 180:96ed750bd169 396 );
Anna Bridge 180:96ed750bd169 397 }
Anna Bridge 180:96ed750bd169 398
Anna Bridge 180:96ed750bd169 399 /** \brief Get FPEXC
Anna Bridge 180:96ed750bd169 400 \return Floating Point Exception Control register value
Anna Bridge 180:96ed750bd169 401 */
Anna Bridge 180:96ed750bd169 402 __STATIC_FORCEINLINE uint32_t __get_FPEXC(void)
Anna Bridge 180:96ed750bd169 403 {
Anna Bridge 180:96ed750bd169 404 #if (__FPU_PRESENT == 1)
Anna Bridge 180:96ed750bd169 405 uint32_t result;
Anna Bridge 180:96ed750bd169 406 __ASM volatile("VMRS %0, fpexc" : "=r" (result) : : "memory");
Anna Bridge 180:96ed750bd169 407 return(result);
Anna Bridge 180:96ed750bd169 408 #else
Anna Bridge 180:96ed750bd169 409 return(0);
Anna Bridge 180:96ed750bd169 410 #endif
Anna Bridge 180:96ed750bd169 411 }
Anna Bridge 180:96ed750bd169 412
Anna Bridge 180:96ed750bd169 413 /** \brief Set FPEXC
Anna Bridge 180:96ed750bd169 414 \param [in] fpexc Floating Point Exception Control value to set
Anna Bridge 180:96ed750bd169 415 */
Anna Bridge 180:96ed750bd169 416 __STATIC_FORCEINLINE void __set_FPEXC(uint32_t fpexc)
Anna Bridge 180:96ed750bd169 417 {
Anna Bridge 180:96ed750bd169 418 #if (__FPU_PRESENT == 1)
Anna Bridge 180:96ed750bd169 419 __ASM volatile ("VMSR fpexc, %0" : : "r" (fpexc) : "memory");
Anna Bridge 180:96ed750bd169 420 #endif
Anna Bridge 180:96ed750bd169 421 }
Anna Bridge 180:96ed750bd169 422
Anna Bridge 180:96ed750bd169 423 /*
Anna Bridge 180:96ed750bd169 424 * Include common core functions to access Coprocessor 15 registers
Anna Bridge 180:96ed750bd169 425 */
Anna Bridge 180:96ed750bd169 426
Anna Bridge 180:96ed750bd169 427 #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 428 #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 429 #define __get_CP64(cp, op1, Rt, CRm) __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" )
Anna Bridge 180:96ed750bd169 430 #define __set_CP64(cp, op1, Rt, CRm) __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" )
Anna Bridge 180:96ed750bd169 431
Anna Bridge 180:96ed750bd169 432 #include "cmsis_cp15.h"
Anna Bridge 180:96ed750bd169 433
Anna Bridge 180:96ed750bd169 434 /** \brief Enable Floating Point Unit
Anna Bridge 180:96ed750bd169 435
Anna Bridge 180:96ed750bd169 436 Critical section, called from undef handler, so systick is disabled
Anna Bridge 180:96ed750bd169 437 */
Anna Bridge 180:96ed750bd169 438 __STATIC_INLINE void __FPU_Enable(void)
Anna Bridge 180:96ed750bd169 439 {
Anna Bridge 180:96ed750bd169 440 __ASM volatile(
Anna Bridge 180:96ed750bd169 441 //Permit access to VFP/NEON, registers by modifying CPACR
Anna Bridge 180:96ed750bd169 442 " MRC p15,0,R1,c1,c0,2 \n"
Anna Bridge 180:96ed750bd169 443 " ORR R1,R1,#0x00F00000 \n"
Anna Bridge 180:96ed750bd169 444 " MCR p15,0,R1,c1,c0,2 \n"
Anna Bridge 180:96ed750bd169 445
Anna Bridge 180:96ed750bd169 446 //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted
Anna Bridge 180:96ed750bd169 447 " ISB \n"
Anna Bridge 180:96ed750bd169 448
Anna Bridge 180:96ed750bd169 449 //Enable VFP/NEON
Anna Bridge 180:96ed750bd169 450 " VMRS R1,FPEXC \n"
Anna Bridge 180:96ed750bd169 451 " ORR R1,R1,#0x40000000 \n"
Anna Bridge 180:96ed750bd169 452 " VMSR FPEXC,R1 \n"
Anna Bridge 180:96ed750bd169 453
Anna Bridge 180:96ed750bd169 454 //Initialise VFP/NEON registers to 0
Anna Bridge 180:96ed750bd169 455 " MOV R2,#0 \n"
Anna Bridge 180:96ed750bd169 456
Anna Bridge 180:96ed750bd169 457 //Initialise D16 registers to 0
Anna Bridge 180:96ed750bd169 458 " VMOV D0, R2,R2 \n"
Anna Bridge 180:96ed750bd169 459 " VMOV D1, R2,R2 \n"
Anna Bridge 180:96ed750bd169 460 " VMOV D2, R2,R2 \n"
Anna Bridge 180:96ed750bd169 461 " VMOV D3, R2,R2 \n"
Anna Bridge 180:96ed750bd169 462 " VMOV D4, R2,R2 \n"
Anna Bridge 180:96ed750bd169 463 " VMOV D5, R2,R2 \n"
Anna Bridge 180:96ed750bd169 464 " VMOV D6, R2,R2 \n"
Anna Bridge 180:96ed750bd169 465 " VMOV D7, R2,R2 \n"
Anna Bridge 180:96ed750bd169 466 " VMOV D8, R2,R2 \n"
Anna Bridge 180:96ed750bd169 467 " VMOV D9, R2,R2 \n"
Anna Bridge 180:96ed750bd169 468 " VMOV D10,R2,R2 \n"
Anna Bridge 180:96ed750bd169 469 " VMOV D11,R2,R2 \n"
Anna Bridge 180:96ed750bd169 470 " VMOV D12,R2,R2 \n"
Anna Bridge 180:96ed750bd169 471 " VMOV D13,R2,R2 \n"
Anna Bridge 180:96ed750bd169 472 " VMOV D14,R2,R2 \n"
Anna Bridge 180:96ed750bd169 473 " VMOV D15,R2,R2 \n"
Anna Bridge 180:96ed750bd169 474
Anna Bridge 180:96ed750bd169 475 #if __ARM_NEON == 1
Anna Bridge 180:96ed750bd169 476 //Initialise D32 registers to 0
Anna Bridge 180:96ed750bd169 477 " VMOV D16,R2,R2 \n"
Anna Bridge 180:96ed750bd169 478 " VMOV D17,R2,R2 \n"
Anna Bridge 180:96ed750bd169 479 " VMOV D18,R2,R2 \n"
Anna Bridge 180:96ed750bd169 480 " VMOV D19,R2,R2 \n"
Anna Bridge 180:96ed750bd169 481 " VMOV D20,R2,R2 \n"
Anna Bridge 180:96ed750bd169 482 " VMOV D21,R2,R2 \n"
Anna Bridge 180:96ed750bd169 483 " VMOV D22,R2,R2 \n"
Anna Bridge 180:96ed750bd169 484 " VMOV D23,R2,R2 \n"
Anna Bridge 180:96ed750bd169 485 " VMOV D24,R2,R2 \n"
Anna Bridge 180:96ed750bd169 486 " VMOV D25,R2,R2 \n"
Anna Bridge 180:96ed750bd169 487 " VMOV D26,R2,R2 \n"
Anna Bridge 180:96ed750bd169 488 " VMOV D27,R2,R2 \n"
Anna Bridge 180:96ed750bd169 489 " VMOV D28,R2,R2 \n"
Anna Bridge 180:96ed750bd169 490 " VMOV D29,R2,R2 \n"
Anna Bridge 180:96ed750bd169 491 " VMOV D30,R2,R2 \n"
Anna Bridge 180:96ed750bd169 492 " VMOV D31,R2,R2 \n"
Anna Bridge 180:96ed750bd169 493 #endif
Anna Bridge 180:96ed750bd169 494
Anna Bridge 180:96ed750bd169 495 //Initialise FPSCR to a known state
Anna Bridge 180:96ed750bd169 496 " VMRS R2,FPSCR \n"
Anna Bridge 180:96ed750bd169 497 " 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 498 " AND R2,R2,R3 \n"
Anna Bridge 180:96ed750bd169 499 " VMSR FPSCR,R2 "
Anna Bridge 180:96ed750bd169 500 );
Anna Bridge 180:96ed750bd169 501 }
Anna Bridge 180:96ed750bd169 502
Anna Bridge 180:96ed750bd169 503 #endif /* __CMSIS_ARMCLANG_H */