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:
<>
Date:
Mon Jan 16 12:05:23 2017 +0000
Revision:
134:ad3be0349dc5
Parent:
125:2e9cc70d1897
Release 134 of the mbed library

Ports for Upcoming Targets


Fixes and Changes

3488: Dev stm i2c v2 unitary functions https://github.com/ARMmbed/mbed-os/pull/3488
3492: Fix #3463 CAN read() return value https://github.com/ARMmbed/mbed-os/pull/3492
3503: [LPC15xx] Ensure that PWM=1 is resolved correctly https://github.com/ARMmbed/mbed-os/pull/3503
3504: [LPC15xx] CAN implementation improvements https://github.com/ARMmbed/mbed-os/pull/3504
3539: NUCLEO_F412ZG - Add support of TRNG peripheral https://github.com/ARMmbed/mbed-os/pull/3539
3540: STM: SPI: Initialize Rx in spi_master_write https://github.com/ARMmbed/mbed-os/pull/3540
3438: K64F: Add support for SERIAL ASYNCH API https://github.com/ARMmbed/mbed-os/pull/3438
3519: MCUXpresso: Fix ENET driver to enable interrupts after interrupt handler is set https://github.com/ARMmbed/mbed-os/pull/3519
3544: STM32L4 deepsleep improvement https://github.com/ARMmbed/mbed-os/pull/3544
3546: NUCLEO-F412ZG - Add CAN peripheral https://github.com/ARMmbed/mbed-os/pull/3546
3551: Fix I2C driver for RZ/A1H https://github.com/ARMmbed/mbed-os/pull/3551
3558: K64F UART Asynch API: Fix synchronization issue https://github.com/ARMmbed/mbed-os/pull/3558
3563: LPC4088 - Fix vector checksum https://github.com/ARMmbed/mbed-os/pull/3563
3567: Dev stm32 F0 v1.7.0 https://github.com/ARMmbed/mbed-os/pull/3567
3577: Fixes linking errors when building with debug profile https://github.com/ARMmbed/mbed-os/pull/3577

Who changed what in which revision?

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