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:
AnnaBridge
Date:
Fri May 26 12:30:20 2017 +0100
Revision:
143:86740a56073b
Parent:
142:4eea097334d6
Release 143 of the mbed library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 142:4eea097334d6 1 /**************************************************************************//**
Anna Bridge 142:4eea097334d6 2 * @file core_cmInstr.h
Anna Bridge 142:4eea097334d6 3 * @brief CMSIS Cortex-M Core Instruction Access Header File
Anna Bridge 142:4eea097334d6 4 * @version V4.10
Anna Bridge 142:4eea097334d6 5 * @date 18. March 2015
Anna Bridge 142:4eea097334d6 6 *
Anna Bridge 142:4eea097334d6 7 * @note
Anna Bridge 142:4eea097334d6 8 *
Anna Bridge 142:4eea097334d6 9 ******************************************************************************/
Anna Bridge 142:4eea097334d6 10 /* Copyright (c) 2009 - 2014 ARM LIMITED
Anna Bridge 142:4eea097334d6 11
Anna Bridge 142:4eea097334d6 12 All rights reserved.
Anna Bridge 142:4eea097334d6 13 Redistribution and use in source and binary forms, with or without
Anna Bridge 142:4eea097334d6 14 modification, are permitted provided that the following conditions are met:
Anna Bridge 142:4eea097334d6 15 - Redistributions of source code must retain the above copyright
Anna Bridge 142:4eea097334d6 16 notice, this list of conditions and the following disclaimer.
Anna Bridge 142:4eea097334d6 17 - Redistributions in binary form must reproduce the above copyright
Anna Bridge 142:4eea097334d6 18 notice, this list of conditions and the following disclaimer in the
Anna Bridge 142:4eea097334d6 19 documentation and/or other materials provided with the distribution.
Anna Bridge 142:4eea097334d6 20 - Neither the name of ARM nor the names of its contributors may be used
Anna Bridge 142:4eea097334d6 21 to endorse or promote products derived from this software without
Anna Bridge 142:4eea097334d6 22 specific prior written permission.
Anna Bridge 142:4eea097334d6 23 *
Anna Bridge 142:4eea097334d6 24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Anna Bridge 142:4eea097334d6 25 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Anna Bridge 142:4eea097334d6 26 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Anna Bridge 142:4eea097334d6 27 ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
Anna Bridge 142:4eea097334d6 28 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Anna Bridge 142:4eea097334d6 29 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
Anna Bridge 142:4eea097334d6 30 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Anna Bridge 142:4eea097334d6 31 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
Anna Bridge 142:4eea097334d6 32 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
Anna Bridge 142:4eea097334d6 33 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Anna Bridge 142:4eea097334d6 34 POSSIBILITY OF SUCH DAMAGE.
Anna Bridge 142:4eea097334d6 35 ---------------------------------------------------------------------------*/
Anna Bridge 142:4eea097334d6 36
Anna Bridge 142:4eea097334d6 37
Anna Bridge 142:4eea097334d6 38 #ifndef __CORE_CMINSTR_H
Anna Bridge 142:4eea097334d6 39 #define __CORE_CMINSTR_H
Anna Bridge 142:4eea097334d6 40
Anna Bridge 142:4eea097334d6 41
Anna Bridge 142:4eea097334d6 42 /* ########################## Core Instruction Access ######################### */
Anna Bridge 142:4eea097334d6 43 /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
Anna Bridge 142:4eea097334d6 44 Access to dedicated instructions
Anna Bridge 142:4eea097334d6 45 @{
Anna Bridge 142:4eea097334d6 46 */
Anna Bridge 142:4eea097334d6 47
Anna Bridge 142:4eea097334d6 48 #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
Anna Bridge 142:4eea097334d6 49 /* ARM armcc specific functions */
Anna Bridge 142:4eea097334d6 50
Anna Bridge 142:4eea097334d6 51 #if (__ARMCC_VERSION < 400677)
Anna Bridge 142:4eea097334d6 52 #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
Anna Bridge 142:4eea097334d6 53 #endif
Anna Bridge 142:4eea097334d6 54
Anna Bridge 142:4eea097334d6 55
Anna Bridge 142:4eea097334d6 56 /** \brief No Operation
Anna Bridge 142:4eea097334d6 57
Anna Bridge 142:4eea097334d6 58 No Operation does nothing. This instruction can be used for code alignment purposes.
Anna Bridge 142:4eea097334d6 59 */
Anna Bridge 142:4eea097334d6 60 #define __NOP __nop
Anna Bridge 142:4eea097334d6 61
Anna Bridge 142:4eea097334d6 62
Anna Bridge 142:4eea097334d6 63 /** \brief Wait For Interrupt
Anna Bridge 142:4eea097334d6 64
Anna Bridge 142:4eea097334d6 65 Wait For Interrupt is a hint instruction that suspends execution
Anna Bridge 142:4eea097334d6 66 until one of a number of events occurs.
Anna Bridge 142:4eea097334d6 67 */
Anna Bridge 142:4eea097334d6 68 #define __WFI __wfi
Anna Bridge 142:4eea097334d6 69
Anna Bridge 142:4eea097334d6 70
Anna Bridge 142:4eea097334d6 71 /** \brief Wait For Event
Anna Bridge 142:4eea097334d6 72
Anna Bridge 142:4eea097334d6 73 Wait For Event is a hint instruction that permits the processor to enter
Anna Bridge 142:4eea097334d6 74 a low-power state until one of a number of events occurs.
Anna Bridge 142:4eea097334d6 75 */
Anna Bridge 142:4eea097334d6 76 #define __WFE __wfe
Anna Bridge 142:4eea097334d6 77
Anna Bridge 142:4eea097334d6 78
Anna Bridge 142:4eea097334d6 79 /** \brief Send Event
Anna Bridge 142:4eea097334d6 80
Anna Bridge 142:4eea097334d6 81 Send Event is a hint instruction. It causes an event to be signaled to the CPU.
Anna Bridge 142:4eea097334d6 82 */
Anna Bridge 142:4eea097334d6 83 #define __SEV __sev
Anna Bridge 142:4eea097334d6 84
Anna Bridge 142:4eea097334d6 85
Anna Bridge 142:4eea097334d6 86 /** \brief Instruction Synchronization Barrier
Anna Bridge 142:4eea097334d6 87
Anna Bridge 142:4eea097334d6 88 Instruction Synchronization Barrier flushes the pipeline in the processor,
Anna Bridge 142:4eea097334d6 89 so that all instructions following the ISB are fetched from cache or
Anna Bridge 142:4eea097334d6 90 memory, after the instruction has been completed.
Anna Bridge 142:4eea097334d6 91 */
Anna Bridge 142:4eea097334d6 92 #define __ISB() do {\
Anna Bridge 142:4eea097334d6 93 __schedule_barrier();\
Anna Bridge 142:4eea097334d6 94 __isb(0xF);\
Anna Bridge 142:4eea097334d6 95 __schedule_barrier();\
Anna Bridge 142:4eea097334d6 96 } while (0)
Anna Bridge 142:4eea097334d6 97
Anna Bridge 142:4eea097334d6 98 /** \brief Data Synchronization Barrier
Anna Bridge 142:4eea097334d6 99
Anna Bridge 142:4eea097334d6 100 This function acts as a special kind of Data Memory Barrier.
Anna Bridge 142:4eea097334d6 101 It completes when all explicit memory accesses before this instruction complete.
Anna Bridge 142:4eea097334d6 102 */
Anna Bridge 142:4eea097334d6 103 #define __DSB() do {\
Anna Bridge 142:4eea097334d6 104 __schedule_barrier();\
Anna Bridge 142:4eea097334d6 105 __dsb(0xF);\
Anna Bridge 142:4eea097334d6 106 __schedule_barrier();\
Anna Bridge 142:4eea097334d6 107 } while (0)
Anna Bridge 142:4eea097334d6 108
Anna Bridge 142:4eea097334d6 109 /** \brief Data Memory Barrier
Anna Bridge 142:4eea097334d6 110
Anna Bridge 142:4eea097334d6 111 This function ensures the apparent order of the explicit memory operations before
Anna Bridge 142:4eea097334d6 112 and after the instruction, without ensuring their completion.
Anna Bridge 142:4eea097334d6 113 */
Anna Bridge 142:4eea097334d6 114 #define __DMB() do {\
Anna Bridge 142:4eea097334d6 115 __schedule_barrier();\
Anna Bridge 142:4eea097334d6 116 __dmb(0xF);\
Anna Bridge 142:4eea097334d6 117 __schedule_barrier();\
Anna Bridge 142:4eea097334d6 118 } while (0)
Anna Bridge 142:4eea097334d6 119
Anna Bridge 142:4eea097334d6 120 /** \brief Reverse byte order (32 bit)
Anna Bridge 142:4eea097334d6 121
Anna Bridge 142:4eea097334d6 122 This function reverses the byte order in integer value.
Anna Bridge 142:4eea097334d6 123
Anna Bridge 142:4eea097334d6 124 \param [in] value Value to reverse
Anna Bridge 142:4eea097334d6 125 \return Reversed value
Anna Bridge 142:4eea097334d6 126 */
Anna Bridge 142:4eea097334d6 127 #define __REV __rev
Anna Bridge 142:4eea097334d6 128
Anna Bridge 142:4eea097334d6 129
Anna Bridge 142:4eea097334d6 130 /** \brief Reverse byte order (16 bit)
Anna Bridge 142:4eea097334d6 131
Anna Bridge 142:4eea097334d6 132 This function reverses the byte order in two unsigned short values.
Anna Bridge 142:4eea097334d6 133
Anna Bridge 142:4eea097334d6 134 \param [in] value Value to reverse
Anna Bridge 142:4eea097334d6 135 \return Reversed value
Anna Bridge 142:4eea097334d6 136 */
Anna Bridge 142:4eea097334d6 137 #ifndef __NO_EMBEDDED_ASM
Anna Bridge 142:4eea097334d6 138 __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
Anna Bridge 142:4eea097334d6 139 {
Anna Bridge 142:4eea097334d6 140 rev16 r0, r0
Anna Bridge 142:4eea097334d6 141 bx lr
Anna Bridge 142:4eea097334d6 142 }
Anna Bridge 142:4eea097334d6 143 #endif
Anna Bridge 142:4eea097334d6 144
Anna Bridge 142:4eea097334d6 145 /** \brief Reverse byte order in signed short value
Anna Bridge 142:4eea097334d6 146
Anna Bridge 142:4eea097334d6 147 This function reverses the byte order in a signed short value with sign extension to integer.
Anna Bridge 142:4eea097334d6 148
Anna Bridge 142:4eea097334d6 149 \param [in] value Value to reverse
Anna Bridge 142:4eea097334d6 150 \return Reversed value
Anna Bridge 142:4eea097334d6 151 */
Anna Bridge 142:4eea097334d6 152 #ifndef __NO_EMBEDDED_ASM
Anna Bridge 142:4eea097334d6 153 __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
Anna Bridge 142:4eea097334d6 154 {
Anna Bridge 142:4eea097334d6 155 revsh r0, r0
Anna Bridge 142:4eea097334d6 156 bx lr
Anna Bridge 142:4eea097334d6 157 }
Anna Bridge 142:4eea097334d6 158 #endif
Anna Bridge 142:4eea097334d6 159
Anna Bridge 142:4eea097334d6 160
Anna Bridge 142:4eea097334d6 161 /** \brief Rotate Right in unsigned value (32 bit)
Anna Bridge 142:4eea097334d6 162
Anna Bridge 142:4eea097334d6 163 This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
Anna Bridge 142:4eea097334d6 164
Anna Bridge 142:4eea097334d6 165 \param [in] value Value to rotate
Anna Bridge 142:4eea097334d6 166 \param [in] value Number of Bits to rotate
Anna Bridge 142:4eea097334d6 167 \return Rotated value
Anna Bridge 142:4eea097334d6 168 */
Anna Bridge 142:4eea097334d6 169 #define __ROR __ror
Anna Bridge 142:4eea097334d6 170
Anna Bridge 142:4eea097334d6 171
Anna Bridge 142:4eea097334d6 172 /** \brief Breakpoint
Anna Bridge 142:4eea097334d6 173
Anna Bridge 142:4eea097334d6 174 This function causes the processor to enter Debug state.
Anna Bridge 142:4eea097334d6 175 Debug tools can use this to investigate system state when the instruction at a particular address is reached.
Anna Bridge 142:4eea097334d6 176
Anna Bridge 142:4eea097334d6 177 \param [in] value is ignored by the processor.
Anna Bridge 142:4eea097334d6 178 If required, a debugger can use it to store additional information about the breakpoint.
Anna Bridge 142:4eea097334d6 179 */
Anna Bridge 142:4eea097334d6 180 #define __BKPT(value) __breakpoint(value)
Anna Bridge 142:4eea097334d6 181
Anna Bridge 142:4eea097334d6 182
Anna Bridge 142:4eea097334d6 183 /** \brief Reverse bit order of value
Anna Bridge 142:4eea097334d6 184
Anna Bridge 142:4eea097334d6 185 This function reverses the bit order of the given value.
Anna Bridge 142:4eea097334d6 186
Anna Bridge 142:4eea097334d6 187 \param [in] value Value to reverse
Anna Bridge 142:4eea097334d6 188 \return Reversed value
Anna Bridge 142:4eea097334d6 189 */
Anna Bridge 142:4eea097334d6 190 #if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
Anna Bridge 142:4eea097334d6 191 #define __RBIT __rbit
Anna Bridge 142:4eea097334d6 192 #else
Anna Bridge 142:4eea097334d6 193 __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
Anna Bridge 142:4eea097334d6 194 {
Anna Bridge 142:4eea097334d6 195 uint32_t result;
Anna Bridge 142:4eea097334d6 196 int32_t s = 4 /*sizeof(v)*/ * 8 - 1; // extra shift needed at end
Anna Bridge 142:4eea097334d6 197
Anna Bridge 142:4eea097334d6 198 result = value; // r will be reversed bits of v; first get LSB of v
Anna Bridge 142:4eea097334d6 199 for (value >>= 1; value; value >>= 1)
Anna Bridge 142:4eea097334d6 200 {
Anna Bridge 142:4eea097334d6 201 result <<= 1;
Anna Bridge 142:4eea097334d6 202 result |= value & 1;
Anna Bridge 142:4eea097334d6 203 s--;
Anna Bridge 142:4eea097334d6 204 }
Anna Bridge 142:4eea097334d6 205 result <<= s; // shift when v's highest bits are zero
Anna Bridge 142:4eea097334d6 206 return(result);
Anna Bridge 142:4eea097334d6 207 }
Anna Bridge 142:4eea097334d6 208 #endif
Anna Bridge 142:4eea097334d6 209
Anna Bridge 142:4eea097334d6 210
Anna Bridge 142:4eea097334d6 211 /** \brief Count leading zeros
Anna Bridge 142:4eea097334d6 212
Anna Bridge 142:4eea097334d6 213 This function counts the number of leading zeros of a data value.
Anna Bridge 142:4eea097334d6 214
Anna Bridge 142:4eea097334d6 215 \param [in] value Value to count the leading zeros
Anna Bridge 142:4eea097334d6 216 \return number of leading zeros in value
Anna Bridge 142:4eea097334d6 217 */
Anna Bridge 142:4eea097334d6 218 #define __CLZ __clz
Anna Bridge 142:4eea097334d6 219
Anna Bridge 142:4eea097334d6 220
Anna Bridge 142:4eea097334d6 221 #if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
Anna Bridge 142:4eea097334d6 222
Anna Bridge 142:4eea097334d6 223 /** \brief LDR Exclusive (8 bit)
Anna Bridge 142:4eea097334d6 224
Anna Bridge 142:4eea097334d6 225 This function executes a exclusive LDR instruction for 8 bit value.
Anna Bridge 142:4eea097334d6 226
Anna Bridge 142:4eea097334d6 227 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 228 \return value of type uint8_t at (*ptr)
Anna Bridge 142:4eea097334d6 229 */
Anna Bridge 142:4eea097334d6 230 #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
Anna Bridge 142:4eea097334d6 231
Anna Bridge 142:4eea097334d6 232
Anna Bridge 142:4eea097334d6 233 /** \brief LDR Exclusive (16 bit)
Anna Bridge 142:4eea097334d6 234
Anna Bridge 142:4eea097334d6 235 This function executes a exclusive LDR instruction for 16 bit values.
Anna Bridge 142:4eea097334d6 236
Anna Bridge 142:4eea097334d6 237 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 238 \return value of type uint16_t at (*ptr)
Anna Bridge 142:4eea097334d6 239 */
Anna Bridge 142:4eea097334d6 240 #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
Anna Bridge 142:4eea097334d6 241
Anna Bridge 142:4eea097334d6 242
Anna Bridge 142:4eea097334d6 243 /** \brief LDR Exclusive (32 bit)
Anna Bridge 142:4eea097334d6 244
Anna Bridge 142:4eea097334d6 245 This function executes a exclusive LDR instruction for 32 bit values.
Anna Bridge 142:4eea097334d6 246
Anna Bridge 142:4eea097334d6 247 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 248 \return value of type uint32_t at (*ptr)
Anna Bridge 142:4eea097334d6 249 */
Anna Bridge 142:4eea097334d6 250 #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
Anna Bridge 142:4eea097334d6 251
Anna Bridge 142:4eea097334d6 252
Anna Bridge 142:4eea097334d6 253 /** \brief STR Exclusive (8 bit)
Anna Bridge 142:4eea097334d6 254
Anna Bridge 142:4eea097334d6 255 This function executes a exclusive STR instruction for 8 bit values.
Anna Bridge 142:4eea097334d6 256
Anna Bridge 142:4eea097334d6 257 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 258 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 259 \return 0 Function succeeded
Anna Bridge 142:4eea097334d6 260 \return 1 Function failed
Anna Bridge 142:4eea097334d6 261 */
Anna Bridge 142:4eea097334d6 262 #define __STREXB(value, ptr) __strex(value, ptr)
Anna Bridge 142:4eea097334d6 263
Anna Bridge 142:4eea097334d6 264
Anna Bridge 142:4eea097334d6 265 /** \brief STR Exclusive (16 bit)
Anna Bridge 142:4eea097334d6 266
Anna Bridge 142:4eea097334d6 267 This function executes a exclusive STR instruction for 16 bit values.
Anna Bridge 142:4eea097334d6 268
Anna Bridge 142:4eea097334d6 269 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 270 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 271 \return 0 Function succeeded
Anna Bridge 142:4eea097334d6 272 \return 1 Function failed
Anna Bridge 142:4eea097334d6 273 */
Anna Bridge 142:4eea097334d6 274 #define __STREXH(value, ptr) __strex(value, ptr)
Anna Bridge 142:4eea097334d6 275
Anna Bridge 142:4eea097334d6 276
Anna Bridge 142:4eea097334d6 277 /** \brief STR Exclusive (32 bit)
Anna Bridge 142:4eea097334d6 278
Anna Bridge 142:4eea097334d6 279 This function executes a exclusive STR instruction for 32 bit values.
Anna Bridge 142:4eea097334d6 280
Anna Bridge 142:4eea097334d6 281 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 282 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 283 \return 0 Function succeeded
Anna Bridge 142:4eea097334d6 284 \return 1 Function failed
Anna Bridge 142:4eea097334d6 285 */
Anna Bridge 142:4eea097334d6 286 #define __STREXW(value, ptr) __strex(value, ptr)
Anna Bridge 142:4eea097334d6 287
Anna Bridge 142:4eea097334d6 288
Anna Bridge 142:4eea097334d6 289 /** \brief Remove the exclusive lock
Anna Bridge 142:4eea097334d6 290
Anna Bridge 142:4eea097334d6 291 This function removes the exclusive lock which is created by LDREX.
Anna Bridge 142:4eea097334d6 292
Anna Bridge 142:4eea097334d6 293 */
Anna Bridge 142:4eea097334d6 294 #define __CLREX __clrex
Anna Bridge 142:4eea097334d6 295
Anna Bridge 142:4eea097334d6 296
Anna Bridge 142:4eea097334d6 297 /** \brief Signed Saturate
Anna Bridge 142:4eea097334d6 298
Anna Bridge 142:4eea097334d6 299 This function saturates a signed value.
Anna Bridge 142:4eea097334d6 300
Anna Bridge 142:4eea097334d6 301 \param [in] value Value to be saturated
Anna Bridge 142:4eea097334d6 302 \param [in] sat Bit position to saturate to (1..32)
Anna Bridge 142:4eea097334d6 303 \return Saturated value
Anna Bridge 142:4eea097334d6 304 */
Anna Bridge 142:4eea097334d6 305 #define __SSAT __ssat
Anna Bridge 142:4eea097334d6 306
Anna Bridge 142:4eea097334d6 307
Anna Bridge 142:4eea097334d6 308 /** \brief Unsigned Saturate
Anna Bridge 142:4eea097334d6 309
Anna Bridge 142:4eea097334d6 310 This function saturates an unsigned value.
Anna Bridge 142:4eea097334d6 311
Anna Bridge 142:4eea097334d6 312 \param [in] value Value to be saturated
Anna Bridge 142:4eea097334d6 313 \param [in] sat Bit position to saturate to (0..31)
Anna Bridge 142:4eea097334d6 314 \return Saturated value
Anna Bridge 142:4eea097334d6 315 */
Anna Bridge 142:4eea097334d6 316 #define __USAT __usat
Anna Bridge 142:4eea097334d6 317
Anna Bridge 142:4eea097334d6 318
Anna Bridge 142:4eea097334d6 319 /** \brief Rotate Right with Extend (32 bit)
Anna Bridge 142:4eea097334d6 320
Anna Bridge 142:4eea097334d6 321 This function moves each bit of a bitstring right by one bit.
Anna Bridge 142:4eea097334d6 322 The carry input is shifted in at the left end of the bitstring.
Anna Bridge 142:4eea097334d6 323
Anna Bridge 142:4eea097334d6 324 \param [in] value Value to rotate
Anna Bridge 142:4eea097334d6 325 \return Rotated value
Anna Bridge 142:4eea097334d6 326 */
Anna Bridge 142:4eea097334d6 327 #ifndef __NO_EMBEDDED_ASM
Anna Bridge 142:4eea097334d6 328 __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
Anna Bridge 142:4eea097334d6 329 {
Anna Bridge 142:4eea097334d6 330 rrx r0, r0
Anna Bridge 142:4eea097334d6 331 bx lr
Anna Bridge 142:4eea097334d6 332 }
Anna Bridge 142:4eea097334d6 333 #endif
Anna Bridge 142:4eea097334d6 334
Anna Bridge 142:4eea097334d6 335
Anna Bridge 142:4eea097334d6 336 /** \brief LDRT Unprivileged (8 bit)
Anna Bridge 142:4eea097334d6 337
Anna Bridge 142:4eea097334d6 338 This function executes a Unprivileged LDRT instruction for 8 bit value.
Anna Bridge 142:4eea097334d6 339
Anna Bridge 142:4eea097334d6 340 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 341 \return value of type uint8_t at (*ptr)
Anna Bridge 142:4eea097334d6 342 */
Anna Bridge 142:4eea097334d6 343 #define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr))
Anna Bridge 142:4eea097334d6 344
Anna Bridge 142:4eea097334d6 345
Anna Bridge 142:4eea097334d6 346 /** \brief LDRT Unprivileged (16 bit)
Anna Bridge 142:4eea097334d6 347
Anna Bridge 142:4eea097334d6 348 This function executes a Unprivileged LDRT instruction for 16 bit values.
Anna Bridge 142:4eea097334d6 349
Anna Bridge 142:4eea097334d6 350 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 351 \return value of type uint16_t at (*ptr)
Anna Bridge 142:4eea097334d6 352 */
Anna Bridge 142:4eea097334d6 353 #define __LDRHT(ptr) ((uint16_t) __ldrt(ptr))
Anna Bridge 142:4eea097334d6 354
Anna Bridge 142:4eea097334d6 355
Anna Bridge 142:4eea097334d6 356 /** \brief LDRT Unprivileged (32 bit)
Anna Bridge 142:4eea097334d6 357
Anna Bridge 142:4eea097334d6 358 This function executes a Unprivileged LDRT instruction for 32 bit values.
Anna Bridge 142:4eea097334d6 359
Anna Bridge 142:4eea097334d6 360 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 361 \return value of type uint32_t at (*ptr)
Anna Bridge 142:4eea097334d6 362 */
Anna Bridge 142:4eea097334d6 363 #define __LDRT(ptr) ((uint32_t ) __ldrt(ptr))
Anna Bridge 142:4eea097334d6 364
Anna Bridge 142:4eea097334d6 365
Anna Bridge 142:4eea097334d6 366 /** \brief STRT Unprivileged (8 bit)
Anna Bridge 142:4eea097334d6 367
Anna Bridge 142:4eea097334d6 368 This function executes a Unprivileged STRT instruction for 8 bit values.
Anna Bridge 142:4eea097334d6 369
Anna Bridge 142:4eea097334d6 370 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 371 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 372 */
Anna Bridge 142:4eea097334d6 373 #define __STRBT(value, ptr) __strt(value, ptr)
Anna Bridge 142:4eea097334d6 374
Anna Bridge 142:4eea097334d6 375
Anna Bridge 142:4eea097334d6 376 /** \brief STRT Unprivileged (16 bit)
Anna Bridge 142:4eea097334d6 377
Anna Bridge 142:4eea097334d6 378 This function executes a Unprivileged STRT instruction for 16 bit values.
Anna Bridge 142:4eea097334d6 379
Anna Bridge 142:4eea097334d6 380 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 381 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 382 */
Anna Bridge 142:4eea097334d6 383 #define __STRHT(value, ptr) __strt(value, ptr)
Anna Bridge 142:4eea097334d6 384
Anna Bridge 142:4eea097334d6 385
Anna Bridge 142:4eea097334d6 386 /** \brief STRT Unprivileged (32 bit)
Anna Bridge 142:4eea097334d6 387
Anna Bridge 142:4eea097334d6 388 This function executes a Unprivileged STRT instruction for 32 bit values.
Anna Bridge 142:4eea097334d6 389
Anna Bridge 142:4eea097334d6 390 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 391 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 392 */
Anna Bridge 142:4eea097334d6 393 #define __STRT(value, ptr) __strt(value, ptr)
Anna Bridge 142:4eea097334d6 394
Anna Bridge 142:4eea097334d6 395 #endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
Anna Bridge 142:4eea097334d6 396
Anna Bridge 142:4eea097334d6 397
Anna Bridge 142:4eea097334d6 398 #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
Anna Bridge 142:4eea097334d6 399 /* GNU gcc specific functions */
Anna Bridge 142:4eea097334d6 400
Anna Bridge 142:4eea097334d6 401 /* Define macros for porting to both thumb1 and thumb2.
Anna Bridge 142:4eea097334d6 402 * For thumb1, use low register (r0-r7), specified by constrant "l"
Anna Bridge 142:4eea097334d6 403 * Otherwise, use general registers, specified by constrant "r" */
Anna Bridge 142:4eea097334d6 404 #if defined (__thumb__) && !defined (__thumb2__)
Anna Bridge 142:4eea097334d6 405 #define __CMSIS_GCC_OUT_REG(r) "=l" (r)
Anna Bridge 142:4eea097334d6 406 #define __CMSIS_GCC_USE_REG(r) "l" (r)
Anna Bridge 142:4eea097334d6 407 #else
Anna Bridge 142:4eea097334d6 408 #define __CMSIS_GCC_OUT_REG(r) "=r" (r)
Anna Bridge 142:4eea097334d6 409 #define __CMSIS_GCC_USE_REG(r) "r" (r)
Anna Bridge 142:4eea097334d6 410 #endif
Anna Bridge 142:4eea097334d6 411
Anna Bridge 142:4eea097334d6 412 /** \brief No Operation
Anna Bridge 142:4eea097334d6 413
Anna Bridge 142:4eea097334d6 414 No Operation does nothing. This instruction can be used for code alignment purposes.
Anna Bridge 142:4eea097334d6 415 */
Anna Bridge 142:4eea097334d6 416 __attribute__((always_inline)) __STATIC_INLINE void __NOP(void)
Anna Bridge 142:4eea097334d6 417 {
Anna Bridge 142:4eea097334d6 418 __ASM volatile ("nop");
Anna Bridge 142:4eea097334d6 419 }
Anna Bridge 142:4eea097334d6 420
Anna Bridge 142:4eea097334d6 421
Anna Bridge 142:4eea097334d6 422 /** \brief Wait For Interrupt
Anna Bridge 142:4eea097334d6 423
Anna Bridge 142:4eea097334d6 424 Wait For Interrupt is a hint instruction that suspends execution
Anna Bridge 142:4eea097334d6 425 until one of a number of events occurs.
Anna Bridge 142:4eea097334d6 426 */
Anna Bridge 142:4eea097334d6 427 __attribute__((always_inline)) __STATIC_INLINE void __WFI(void)
Anna Bridge 142:4eea097334d6 428 {
Anna Bridge 142:4eea097334d6 429 __ASM volatile ("wfi");
Anna Bridge 142:4eea097334d6 430 }
Anna Bridge 142:4eea097334d6 431
Anna Bridge 142:4eea097334d6 432
Anna Bridge 142:4eea097334d6 433 /** \brief Wait For Event
Anna Bridge 142:4eea097334d6 434
Anna Bridge 142:4eea097334d6 435 Wait For Event is a hint instruction that permits the processor to enter
Anna Bridge 142:4eea097334d6 436 a low-power state until one of a number of events occurs.
Anna Bridge 142:4eea097334d6 437 */
Anna Bridge 142:4eea097334d6 438 __attribute__((always_inline)) __STATIC_INLINE void __WFE(void)
Anna Bridge 142:4eea097334d6 439 {
Anna Bridge 142:4eea097334d6 440 __ASM volatile ("wfe");
Anna Bridge 142:4eea097334d6 441 }
Anna Bridge 142:4eea097334d6 442
Anna Bridge 142:4eea097334d6 443
Anna Bridge 142:4eea097334d6 444 /** \brief Send Event
Anna Bridge 142:4eea097334d6 445
Anna Bridge 142:4eea097334d6 446 Send Event is a hint instruction. It causes an event to be signaled to the CPU.
Anna Bridge 142:4eea097334d6 447 */
Anna Bridge 142:4eea097334d6 448 __attribute__((always_inline)) __STATIC_INLINE void __SEV(void)
Anna Bridge 142:4eea097334d6 449 {
Anna Bridge 142:4eea097334d6 450 __ASM volatile ("sev");
Anna Bridge 142:4eea097334d6 451 }
Anna Bridge 142:4eea097334d6 452
Anna Bridge 142:4eea097334d6 453
Anna Bridge 142:4eea097334d6 454 /** \brief Instruction Synchronization Barrier
Anna Bridge 142:4eea097334d6 455
Anna Bridge 142:4eea097334d6 456 Instruction Synchronization Barrier flushes the pipeline in the processor,
Anna Bridge 142:4eea097334d6 457 so that all instructions following the ISB are fetched from cache or
Anna Bridge 142:4eea097334d6 458 memory, after the instruction has been completed.
Anna Bridge 142:4eea097334d6 459 */
Anna Bridge 142:4eea097334d6 460 __attribute__((always_inline)) __STATIC_INLINE void __ISB(void)
Anna Bridge 142:4eea097334d6 461 {
Anna Bridge 142:4eea097334d6 462 __ASM volatile ("isb 0xF":::"memory");
Anna Bridge 142:4eea097334d6 463 }
Anna Bridge 142:4eea097334d6 464
Anna Bridge 142:4eea097334d6 465
Anna Bridge 142:4eea097334d6 466 /** \brief Data Synchronization Barrier
Anna Bridge 142:4eea097334d6 467
Anna Bridge 142:4eea097334d6 468 This function acts as a special kind of Data Memory Barrier.
Anna Bridge 142:4eea097334d6 469 It completes when all explicit memory accesses before this instruction complete.
Anna Bridge 142:4eea097334d6 470 */
Anna Bridge 142:4eea097334d6 471 __attribute__((always_inline)) __STATIC_INLINE void __DSB(void)
Anna Bridge 142:4eea097334d6 472 {
Anna Bridge 142:4eea097334d6 473 __ASM volatile ("dsb 0xF":::"memory");
Anna Bridge 142:4eea097334d6 474 }
Anna Bridge 142:4eea097334d6 475
Anna Bridge 142:4eea097334d6 476
Anna Bridge 142:4eea097334d6 477 /** \brief Data Memory Barrier
Anna Bridge 142:4eea097334d6 478
Anna Bridge 142:4eea097334d6 479 This function ensures the apparent order of the explicit memory operations before
Anna Bridge 142:4eea097334d6 480 and after the instruction, without ensuring their completion.
Anna Bridge 142:4eea097334d6 481 */
Anna Bridge 142:4eea097334d6 482 __attribute__((always_inline)) __STATIC_INLINE void __DMB(void)
Anna Bridge 142:4eea097334d6 483 {
Anna Bridge 142:4eea097334d6 484 __ASM volatile ("dmb 0xF":::"memory");
Anna Bridge 142:4eea097334d6 485 }
Anna Bridge 142:4eea097334d6 486
Anna Bridge 142:4eea097334d6 487
Anna Bridge 142:4eea097334d6 488 /** \brief Reverse byte order (32 bit)
Anna Bridge 142:4eea097334d6 489
Anna Bridge 142:4eea097334d6 490 This function reverses the byte order in integer value.
Anna Bridge 142:4eea097334d6 491
Anna Bridge 142:4eea097334d6 492 \param [in] value Value to reverse
Anna Bridge 142:4eea097334d6 493 \return Reversed value
Anna Bridge 142:4eea097334d6 494 */
Anna Bridge 142:4eea097334d6 495 __attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value)
Anna Bridge 142:4eea097334d6 496 {
Anna Bridge 142:4eea097334d6 497 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
Anna Bridge 142:4eea097334d6 498 return __builtin_bswap32(value);
Anna Bridge 142:4eea097334d6 499 #else
Anna Bridge 142:4eea097334d6 500 uint32_t result;
Anna Bridge 142:4eea097334d6 501
Anna Bridge 142:4eea097334d6 502 __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
Anna Bridge 142:4eea097334d6 503 return(result);
Anna Bridge 142:4eea097334d6 504 #endif
Anna Bridge 142:4eea097334d6 505 }
Anna Bridge 142:4eea097334d6 506
Anna Bridge 142:4eea097334d6 507
Anna Bridge 142:4eea097334d6 508 /** \brief Reverse byte order (16 bit)
Anna Bridge 142:4eea097334d6 509
Anna Bridge 142:4eea097334d6 510 This function reverses the byte order in two unsigned short values.
Anna Bridge 142:4eea097334d6 511
Anna Bridge 142:4eea097334d6 512 \param [in] value Value to reverse
Anna Bridge 142:4eea097334d6 513 \return Reversed value
Anna Bridge 142:4eea097334d6 514 */
Anna Bridge 142:4eea097334d6 515 __attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value)
Anna Bridge 142:4eea097334d6 516 {
Anna Bridge 142:4eea097334d6 517 uint32_t result;
Anna Bridge 142:4eea097334d6 518
Anna Bridge 142:4eea097334d6 519 __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
Anna Bridge 142:4eea097334d6 520 return(result);
Anna Bridge 142:4eea097334d6 521 }
Anna Bridge 142:4eea097334d6 522
Anna Bridge 142:4eea097334d6 523
Anna Bridge 142:4eea097334d6 524 /** \brief Reverse byte order in signed short value
Anna Bridge 142:4eea097334d6 525
Anna Bridge 142:4eea097334d6 526 This function reverses the byte order in a signed short value with sign extension to integer.
Anna Bridge 142:4eea097334d6 527
Anna Bridge 142:4eea097334d6 528 \param [in] value Value to reverse
Anna Bridge 142:4eea097334d6 529 \return Reversed value
Anna Bridge 142:4eea097334d6 530 */
Anna Bridge 142:4eea097334d6 531 __attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value)
Anna Bridge 142:4eea097334d6 532 {
Anna Bridge 142:4eea097334d6 533 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
Anna Bridge 142:4eea097334d6 534 return (short)__builtin_bswap16(value);
Anna Bridge 142:4eea097334d6 535 #else
Anna Bridge 142:4eea097334d6 536 uint32_t result;
Anna Bridge 142:4eea097334d6 537
Anna Bridge 142:4eea097334d6 538 __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
Anna Bridge 142:4eea097334d6 539 return(result);
Anna Bridge 142:4eea097334d6 540 #endif
Anna Bridge 142:4eea097334d6 541 }
Anna Bridge 142:4eea097334d6 542
Anna Bridge 142:4eea097334d6 543
Anna Bridge 142:4eea097334d6 544 /** \brief Rotate Right in unsigned value (32 bit)
Anna Bridge 142:4eea097334d6 545
Anna Bridge 142:4eea097334d6 546 This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
Anna Bridge 142:4eea097334d6 547
Anna Bridge 142:4eea097334d6 548 \param [in] value Value to rotate
Anna Bridge 142:4eea097334d6 549 \param [in] value Number of Bits to rotate
Anna Bridge 142:4eea097334d6 550 \return Rotated value
Anna Bridge 142:4eea097334d6 551 */
Anna Bridge 142:4eea097334d6 552 __attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
Anna Bridge 142:4eea097334d6 553 {
Anna Bridge 142:4eea097334d6 554 return (op1 >> op2) | (op1 << (32 - op2));
Anna Bridge 142:4eea097334d6 555 }
Anna Bridge 142:4eea097334d6 556
Anna Bridge 142:4eea097334d6 557
Anna Bridge 142:4eea097334d6 558 /** \brief Breakpoint
Anna Bridge 142:4eea097334d6 559
Anna Bridge 142:4eea097334d6 560 This function causes the processor to enter Debug state.
Anna Bridge 142:4eea097334d6 561 Debug tools can use this to investigate system state when the instruction at a particular address is reached.
Anna Bridge 142:4eea097334d6 562
Anna Bridge 142:4eea097334d6 563 \param [in] value is ignored by the processor.
Anna Bridge 142:4eea097334d6 564 If required, a debugger can use it to store additional information about the breakpoint.
Anna Bridge 142:4eea097334d6 565 */
Anna Bridge 142:4eea097334d6 566 #define __BKPT(value) __ASM volatile ("bkpt "#value)
Anna Bridge 142:4eea097334d6 567
Anna Bridge 142:4eea097334d6 568
Anna Bridge 142:4eea097334d6 569 /** \brief Reverse bit order of value
Anna Bridge 142:4eea097334d6 570
Anna Bridge 142:4eea097334d6 571 This function reverses the bit order of the given value.
Anna Bridge 142:4eea097334d6 572
Anna Bridge 142:4eea097334d6 573 \param [in] value Value to reverse
Anna Bridge 142:4eea097334d6 574 \return Reversed value
Anna Bridge 142:4eea097334d6 575 */
Anna Bridge 142:4eea097334d6 576 __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
Anna Bridge 142:4eea097334d6 577 {
Anna Bridge 142:4eea097334d6 578 uint32_t result;
Anna Bridge 142:4eea097334d6 579
Anna Bridge 142:4eea097334d6 580 #if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
Anna Bridge 142:4eea097334d6 581 __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
Anna Bridge 142:4eea097334d6 582 #else
Anna Bridge 142:4eea097334d6 583 int32_t s = 4 /*sizeof(v)*/ * 8 - 1; // extra shift needed at end
Anna Bridge 142:4eea097334d6 584
Anna Bridge 142:4eea097334d6 585 result = value; // r will be reversed bits of v; first get LSB of v
Anna Bridge 142:4eea097334d6 586 for (value >>= 1; value; value >>= 1)
Anna Bridge 142:4eea097334d6 587 {
Anna Bridge 142:4eea097334d6 588 result <<= 1;
Anna Bridge 142:4eea097334d6 589 result |= value & 1;
Anna Bridge 142:4eea097334d6 590 s--;
Anna Bridge 142:4eea097334d6 591 }
Anna Bridge 142:4eea097334d6 592 result <<= s; // shift when v's highest bits are zero
Anna Bridge 142:4eea097334d6 593 #endif
Anna Bridge 142:4eea097334d6 594 return(result);
Anna Bridge 142:4eea097334d6 595 }
Anna Bridge 142:4eea097334d6 596
Anna Bridge 142:4eea097334d6 597
Anna Bridge 142:4eea097334d6 598 /** \brief Count leading zeros
Anna Bridge 142:4eea097334d6 599
Anna Bridge 142:4eea097334d6 600 This function counts the number of leading zeros of a data value.
Anna Bridge 142:4eea097334d6 601
Anna Bridge 142:4eea097334d6 602 \param [in] value Value to count the leading zeros
Anna Bridge 142:4eea097334d6 603 \return number of leading zeros in value
Anna Bridge 142:4eea097334d6 604 */
Anna Bridge 142:4eea097334d6 605 #define __CLZ __builtin_clz
Anna Bridge 142:4eea097334d6 606
Anna Bridge 142:4eea097334d6 607
Anna Bridge 142:4eea097334d6 608 #if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300)
Anna Bridge 142:4eea097334d6 609
Anna Bridge 142:4eea097334d6 610 /** \brief LDR Exclusive (8 bit)
Anna Bridge 142:4eea097334d6 611
Anna Bridge 142:4eea097334d6 612 This function executes a exclusive LDR instruction for 8 bit value.
Anna Bridge 142:4eea097334d6 613
Anna Bridge 142:4eea097334d6 614 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 615 \return value of type uint8_t at (*ptr)
Anna Bridge 142:4eea097334d6 616 */
Anna Bridge 142:4eea097334d6 617 __attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
Anna Bridge 142:4eea097334d6 618 {
Anna Bridge 142:4eea097334d6 619 uint32_t result;
Anna Bridge 142:4eea097334d6 620
Anna Bridge 142:4eea097334d6 621 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
Anna Bridge 142:4eea097334d6 622 __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
Anna Bridge 142:4eea097334d6 623 #else
Anna Bridge 142:4eea097334d6 624 /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
Anna Bridge 142:4eea097334d6 625 accepted by assembler. So has to use following less efficient pattern.
Anna Bridge 142:4eea097334d6 626 */
Anna Bridge 142:4eea097334d6 627 __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
Anna Bridge 142:4eea097334d6 628 #endif
Anna Bridge 142:4eea097334d6 629 return ((uint8_t) result); /* Add explicit type cast here */
Anna Bridge 142:4eea097334d6 630 }
Anna Bridge 142:4eea097334d6 631
Anna Bridge 142:4eea097334d6 632
Anna Bridge 142:4eea097334d6 633 /** \brief LDR Exclusive (16 bit)
Anna Bridge 142:4eea097334d6 634
Anna Bridge 142:4eea097334d6 635 This function executes a exclusive LDR instruction for 16 bit values.
Anna Bridge 142:4eea097334d6 636
Anna Bridge 142:4eea097334d6 637 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 638 \return value of type uint16_t at (*ptr)
Anna Bridge 142:4eea097334d6 639 */
Anna Bridge 142:4eea097334d6 640 __attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
Anna Bridge 142:4eea097334d6 641 {
Anna Bridge 142:4eea097334d6 642 uint32_t result;
Anna Bridge 142:4eea097334d6 643
Anna Bridge 142:4eea097334d6 644 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
Anna Bridge 142:4eea097334d6 645 __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
Anna Bridge 142:4eea097334d6 646 #else
Anna Bridge 142:4eea097334d6 647 /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
Anna Bridge 142:4eea097334d6 648 accepted by assembler. So has to use following less efficient pattern.
Anna Bridge 142:4eea097334d6 649 */
Anna Bridge 142:4eea097334d6 650 __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
Anna Bridge 142:4eea097334d6 651 #endif
Anna Bridge 142:4eea097334d6 652 return ((uint16_t) result); /* Add explicit type cast here */
Anna Bridge 142:4eea097334d6 653 }
Anna Bridge 142:4eea097334d6 654
Anna Bridge 142:4eea097334d6 655
Anna Bridge 142:4eea097334d6 656 /** \brief LDR Exclusive (32 bit)
Anna Bridge 142:4eea097334d6 657
Anna Bridge 142:4eea097334d6 658 This function executes a exclusive LDR instruction for 32 bit values.
Anna Bridge 142:4eea097334d6 659
Anna Bridge 142:4eea097334d6 660 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 661 \return value of type uint32_t at (*ptr)
Anna Bridge 142:4eea097334d6 662 */
Anna Bridge 142:4eea097334d6 663 __attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
Anna Bridge 142:4eea097334d6 664 {
Anna Bridge 142:4eea097334d6 665 uint32_t result;
Anna Bridge 142:4eea097334d6 666
Anna Bridge 142:4eea097334d6 667 __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
Anna Bridge 142:4eea097334d6 668 return(result);
Anna Bridge 142:4eea097334d6 669 }
Anna Bridge 142:4eea097334d6 670
Anna Bridge 142:4eea097334d6 671
Anna Bridge 142:4eea097334d6 672 /** \brief STR Exclusive (8 bit)
Anna Bridge 142:4eea097334d6 673
Anna Bridge 142:4eea097334d6 674 This function executes a exclusive STR instruction for 8 bit values.
Anna Bridge 142:4eea097334d6 675
Anna Bridge 142:4eea097334d6 676 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 677 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 678 \return 0 Function succeeded
Anna Bridge 142:4eea097334d6 679 \return 1 Function failed
Anna Bridge 142:4eea097334d6 680 */
Anna Bridge 142:4eea097334d6 681 __attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
Anna Bridge 142:4eea097334d6 682 {
Anna Bridge 142:4eea097334d6 683 uint32_t result;
Anna Bridge 142:4eea097334d6 684
Anna Bridge 142:4eea097334d6 685 __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
Anna Bridge 142:4eea097334d6 686 return(result);
Anna Bridge 142:4eea097334d6 687 }
Anna Bridge 142:4eea097334d6 688
Anna Bridge 142:4eea097334d6 689
Anna Bridge 142:4eea097334d6 690 /** \brief STR Exclusive (16 bit)
Anna Bridge 142:4eea097334d6 691
Anna Bridge 142:4eea097334d6 692 This function executes a exclusive STR instruction for 16 bit values.
Anna Bridge 142:4eea097334d6 693
Anna Bridge 142:4eea097334d6 694 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 695 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 696 \return 0 Function succeeded
Anna Bridge 142:4eea097334d6 697 \return 1 Function failed
Anna Bridge 142:4eea097334d6 698 */
Anna Bridge 142:4eea097334d6 699 __attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
Anna Bridge 142:4eea097334d6 700 {
Anna Bridge 142:4eea097334d6 701 uint32_t result;
Anna Bridge 142:4eea097334d6 702
Anna Bridge 142:4eea097334d6 703 __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
Anna Bridge 142:4eea097334d6 704 return(result);
Anna Bridge 142:4eea097334d6 705 }
Anna Bridge 142:4eea097334d6 706
Anna Bridge 142:4eea097334d6 707
Anna Bridge 142:4eea097334d6 708 /** \brief STR Exclusive (32 bit)
Anna Bridge 142:4eea097334d6 709
Anna Bridge 142:4eea097334d6 710 This function executes a exclusive STR instruction for 32 bit values.
Anna Bridge 142:4eea097334d6 711
Anna Bridge 142:4eea097334d6 712 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 713 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 714 \return 0 Function succeeded
Anna Bridge 142:4eea097334d6 715 \return 1 Function failed
Anna Bridge 142:4eea097334d6 716 */
Anna Bridge 142:4eea097334d6 717 __attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
Anna Bridge 142:4eea097334d6 718 {
Anna Bridge 142:4eea097334d6 719 uint32_t result;
Anna Bridge 142:4eea097334d6 720
Anna Bridge 142:4eea097334d6 721 __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
Anna Bridge 142:4eea097334d6 722 return(result);
Anna Bridge 142:4eea097334d6 723 }
Anna Bridge 142:4eea097334d6 724
Anna Bridge 142:4eea097334d6 725
Anna Bridge 142:4eea097334d6 726 /** \brief Remove the exclusive lock
Anna Bridge 142:4eea097334d6 727
Anna Bridge 142:4eea097334d6 728 This function removes the exclusive lock which is created by LDREX.
Anna Bridge 142:4eea097334d6 729
Anna Bridge 142:4eea097334d6 730 */
Anna Bridge 142:4eea097334d6 731 __attribute__((always_inline)) __STATIC_INLINE void __CLREX(void)
Anna Bridge 142:4eea097334d6 732 {
Anna Bridge 142:4eea097334d6 733 __ASM volatile ("clrex" ::: "memory");
Anna Bridge 142:4eea097334d6 734 }
Anna Bridge 142:4eea097334d6 735
Anna Bridge 142:4eea097334d6 736
Anna Bridge 142:4eea097334d6 737 /** \brief Signed Saturate
Anna Bridge 142:4eea097334d6 738
Anna Bridge 142:4eea097334d6 739 This function saturates a signed value.
Anna Bridge 142:4eea097334d6 740
Anna Bridge 142:4eea097334d6 741 \param [in] value Value to be saturated
Anna Bridge 142:4eea097334d6 742 \param [in] sat Bit position to saturate to (1..32)
Anna Bridge 142:4eea097334d6 743 \return Saturated value
Anna Bridge 142:4eea097334d6 744 */
Anna Bridge 142:4eea097334d6 745 #define __SSAT(ARG1,ARG2) \
Anna Bridge 142:4eea097334d6 746 ({ \
Anna Bridge 142:4eea097334d6 747 uint32_t __RES, __ARG1 = (ARG1); \
Anna Bridge 142:4eea097334d6 748 __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
Anna Bridge 142:4eea097334d6 749 __RES; \
Anna Bridge 142:4eea097334d6 750 })
Anna Bridge 142:4eea097334d6 751
Anna Bridge 142:4eea097334d6 752
Anna Bridge 142:4eea097334d6 753 /** \brief Unsigned Saturate
Anna Bridge 142:4eea097334d6 754
Anna Bridge 142:4eea097334d6 755 This function saturates an unsigned value.
Anna Bridge 142:4eea097334d6 756
Anna Bridge 142:4eea097334d6 757 \param [in] value Value to be saturated
Anna Bridge 142:4eea097334d6 758 \param [in] sat Bit position to saturate to (0..31)
Anna Bridge 142:4eea097334d6 759 \return Saturated value
Anna Bridge 142:4eea097334d6 760 */
Anna Bridge 142:4eea097334d6 761 #define __USAT(ARG1,ARG2) \
Anna Bridge 142:4eea097334d6 762 ({ \
Anna Bridge 142:4eea097334d6 763 uint32_t __RES, __ARG1 = (ARG1); \
Anna Bridge 142:4eea097334d6 764 __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
Anna Bridge 142:4eea097334d6 765 __RES; \
Anna Bridge 142:4eea097334d6 766 })
Anna Bridge 142:4eea097334d6 767
Anna Bridge 142:4eea097334d6 768
Anna Bridge 142:4eea097334d6 769 /** \brief Rotate Right with Extend (32 bit)
Anna Bridge 142:4eea097334d6 770
Anna Bridge 142:4eea097334d6 771 This function moves each bit of a bitstring right by one bit.
Anna Bridge 142:4eea097334d6 772 The carry input is shifted in at the left end of the bitstring.
Anna Bridge 142:4eea097334d6 773
Anna Bridge 142:4eea097334d6 774 \param [in] value Value to rotate
Anna Bridge 142:4eea097334d6 775 \return Rotated value
Anna Bridge 142:4eea097334d6 776 */
Anna Bridge 142:4eea097334d6 777 __attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value)
Anna Bridge 142:4eea097334d6 778 {
Anna Bridge 142:4eea097334d6 779 uint32_t result;
Anna Bridge 142:4eea097334d6 780
Anna Bridge 142:4eea097334d6 781 __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
Anna Bridge 142:4eea097334d6 782 return(result);
Anna Bridge 142:4eea097334d6 783 }
Anna Bridge 142:4eea097334d6 784
Anna Bridge 142:4eea097334d6 785
Anna Bridge 142:4eea097334d6 786 /** \brief LDRT Unprivileged (8 bit)
Anna Bridge 142:4eea097334d6 787
Anna Bridge 142:4eea097334d6 788 This function executes a Unprivileged LDRT instruction for 8 bit value.
Anna Bridge 142:4eea097334d6 789
Anna Bridge 142:4eea097334d6 790 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 791 \return value of type uint8_t at (*ptr)
Anna Bridge 142:4eea097334d6 792 */
Anna Bridge 142:4eea097334d6 793 __attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *addr)
Anna Bridge 142:4eea097334d6 794 {
Anna Bridge 142:4eea097334d6 795 uint32_t result;
Anna Bridge 142:4eea097334d6 796
Anna Bridge 142:4eea097334d6 797 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
Anna Bridge 142:4eea097334d6 798 __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*addr) );
Anna Bridge 142:4eea097334d6 799 #else
Anna Bridge 142:4eea097334d6 800 /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
Anna Bridge 142:4eea097334d6 801 accepted by assembler. So has to use following less efficient pattern.
Anna Bridge 142:4eea097334d6 802 */
Anna Bridge 142:4eea097334d6 803 __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
Anna Bridge 142:4eea097334d6 804 #endif
Anna Bridge 142:4eea097334d6 805 return ((uint8_t) result); /* Add explicit type cast here */
Anna Bridge 142:4eea097334d6 806 }
Anna Bridge 142:4eea097334d6 807
Anna Bridge 142:4eea097334d6 808
Anna Bridge 142:4eea097334d6 809 /** \brief LDRT Unprivileged (16 bit)
Anna Bridge 142:4eea097334d6 810
Anna Bridge 142:4eea097334d6 811 This function executes a Unprivileged LDRT instruction for 16 bit values.
Anna Bridge 142:4eea097334d6 812
Anna Bridge 142:4eea097334d6 813 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 814 \return value of type uint16_t at (*ptr)
Anna Bridge 142:4eea097334d6 815 */
Anna Bridge 142:4eea097334d6 816 __attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *addr)
Anna Bridge 142:4eea097334d6 817 {
Anna Bridge 142:4eea097334d6 818 uint32_t result;
Anna Bridge 142:4eea097334d6 819
Anna Bridge 142:4eea097334d6 820 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
Anna Bridge 142:4eea097334d6 821 __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*addr) );
Anna Bridge 142:4eea097334d6 822 #else
Anna Bridge 142:4eea097334d6 823 /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
Anna Bridge 142:4eea097334d6 824 accepted by assembler. So has to use following less efficient pattern.
Anna Bridge 142:4eea097334d6 825 */
Anna Bridge 142:4eea097334d6 826 __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
Anna Bridge 142:4eea097334d6 827 #endif
Anna Bridge 142:4eea097334d6 828 return ((uint16_t) result); /* Add explicit type cast here */
Anna Bridge 142:4eea097334d6 829 }
Anna Bridge 142:4eea097334d6 830
Anna Bridge 142:4eea097334d6 831
Anna Bridge 142:4eea097334d6 832 /** \brief LDRT Unprivileged (32 bit)
Anna Bridge 142:4eea097334d6 833
Anna Bridge 142:4eea097334d6 834 This function executes a Unprivileged LDRT instruction for 32 bit values.
Anna Bridge 142:4eea097334d6 835
Anna Bridge 142:4eea097334d6 836 \param [in] ptr Pointer to data
Anna Bridge 142:4eea097334d6 837 \return value of type uint32_t at (*ptr)
Anna Bridge 142:4eea097334d6 838 */
Anna Bridge 142:4eea097334d6 839 __attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *addr)
Anna Bridge 142:4eea097334d6 840 {
Anna Bridge 142:4eea097334d6 841 uint32_t result;
Anna Bridge 142:4eea097334d6 842
Anna Bridge 142:4eea097334d6 843 __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*addr) );
Anna Bridge 142:4eea097334d6 844 return(result);
Anna Bridge 142:4eea097334d6 845 }
Anna Bridge 142:4eea097334d6 846
Anna Bridge 142:4eea097334d6 847
Anna Bridge 142:4eea097334d6 848 /** \brief STRT Unprivileged (8 bit)
Anna Bridge 142:4eea097334d6 849
Anna Bridge 142:4eea097334d6 850 This function executes a Unprivileged STRT instruction for 8 bit values.
Anna Bridge 142:4eea097334d6 851
Anna Bridge 142:4eea097334d6 852 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 853 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 854 */
Anna Bridge 142:4eea097334d6 855 __attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *addr)
Anna Bridge 142:4eea097334d6 856 {
Anna Bridge 142:4eea097334d6 857 __ASM volatile ("strbt %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) );
Anna Bridge 142:4eea097334d6 858 }
Anna Bridge 142:4eea097334d6 859
Anna Bridge 142:4eea097334d6 860
Anna Bridge 142:4eea097334d6 861 /** \brief STRT Unprivileged (16 bit)
Anna Bridge 142:4eea097334d6 862
Anna Bridge 142:4eea097334d6 863 This function executes a Unprivileged STRT instruction for 16 bit values.
Anna Bridge 142:4eea097334d6 864
Anna Bridge 142:4eea097334d6 865 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 866 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 867 */
Anna Bridge 142:4eea097334d6 868 __attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *addr)
Anna Bridge 142:4eea097334d6 869 {
Anna Bridge 142:4eea097334d6 870 __ASM volatile ("strht %1, %0" : "=Q" (*addr) : "r" ((uint32_t)value) );
Anna Bridge 142:4eea097334d6 871 }
Anna Bridge 142:4eea097334d6 872
Anna Bridge 142:4eea097334d6 873
Anna Bridge 142:4eea097334d6 874 /** \brief STRT Unprivileged (32 bit)
Anna Bridge 142:4eea097334d6 875
Anna Bridge 142:4eea097334d6 876 This function executes a Unprivileged STRT instruction for 32 bit values.
Anna Bridge 142:4eea097334d6 877
Anna Bridge 142:4eea097334d6 878 \param [in] value Value to store
Anna Bridge 142:4eea097334d6 879 \param [in] ptr Pointer to location
Anna Bridge 142:4eea097334d6 880 */
Anna Bridge 142:4eea097334d6 881 __attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *addr)
Anna Bridge 142:4eea097334d6 882 {
Anna Bridge 142:4eea097334d6 883 __ASM volatile ("strt %1, %0" : "=Q" (*addr) : "r" (value) );
Anna Bridge 142:4eea097334d6 884 }
Anna Bridge 142:4eea097334d6 885
Anna Bridge 142:4eea097334d6 886 #endif /* (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) */
Anna Bridge 142:4eea097334d6 887
Anna Bridge 142:4eea097334d6 888
Anna Bridge 142:4eea097334d6 889 #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
Anna Bridge 142:4eea097334d6 890 /* IAR iccarm specific functions */
Anna Bridge 142:4eea097334d6 891 #include <cmsis_iar.h>
Anna Bridge 142:4eea097334d6 892
Anna Bridge 142:4eea097334d6 893
Anna Bridge 142:4eea097334d6 894 #elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
Anna Bridge 142:4eea097334d6 895 /* TI CCS specific functions */
Anna Bridge 142:4eea097334d6 896 #include <cmsis_ccs.h>
Anna Bridge 142:4eea097334d6 897
Anna Bridge 142:4eea097334d6 898
Anna Bridge 142:4eea097334d6 899 #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
Anna Bridge 142:4eea097334d6 900 /* TASKING carm specific functions */
Anna Bridge 142:4eea097334d6 901 /*
Anna Bridge 142:4eea097334d6 902 * The CMSIS functions have been implemented as intrinsics in the compiler.
Anna Bridge 142:4eea097334d6 903 * Please use "carm -?i" to get an up to date list of all intrinsics,
Anna Bridge 142:4eea097334d6 904 * Including the CMSIS ones.
Anna Bridge 142:4eea097334d6 905 */
Anna Bridge 142:4eea097334d6 906
Anna Bridge 142:4eea097334d6 907
Anna Bridge 142:4eea097334d6 908 #elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/
Anna Bridge 142:4eea097334d6 909 /* Cosmic specific functions */
Anna Bridge 142:4eea097334d6 910 #include <cmsis_csm.h>
Anna Bridge 142:4eea097334d6 911
Anna Bridge 142:4eea097334d6 912 #endif
Anna Bridge 142:4eea097334d6 913
Anna Bridge 142:4eea097334d6 914 /*@}*/ /* end of group CMSIS_Core_InstructionInterface */
Anna Bridge 142:4eea097334d6 915
Anna Bridge 142:4eea097334d6 916 #endif /* __CORE_CMINSTR_H */