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