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:
Anna Bridge
Date:
Wed Jan 17 16:13:02 2018 +0000
Revision:
160:5571c4ff569f
Child:
169:a7c7b631e539
mbed library. Release version 158

Who changed what in which revision?

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