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:
Fri Jun 22 15:38:59 2018 +0100
Revision:
169:a7c7b631e539
Parent:
165:d1b4690b3f8b
mbed library. Release version 162

Who changed what in which revision?

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