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:
161:aa5281ff4a02
mbed library. Release version 162

Who changed what in which revision?

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