same stuff from mbed trunk (LPC17xx.h, etc.) but nothing else

Dependents:   registers-example test test Tweeting_Machine_HelloWorld_WIZwiki-W750

same as the mbed trunk dated december 20th, 2012

(latest version is here: http://mbed.org/projects/libraries/svn/mbed/trunk/LPC1768/ARM)

Committer:
elevatorguy
Date:
Fri Dec 21 01:54:37 2012 +0000
Revision:
0:f86e6135dcbc
standard library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elevatorguy 0:f86e6135dcbc 1 /**************************************************************************//**
elevatorguy 0:f86e6135dcbc 2 * @file core_cmInstr.h
elevatorguy 0:f86e6135dcbc 3 * @brief CMSIS Cortex-M Core Instruction Access Header File
elevatorguy 0:f86e6135dcbc 4 * @version V3.00
elevatorguy 0:f86e6135dcbc 5 * @date 09. December 2011
elevatorguy 0:f86e6135dcbc 6 *
elevatorguy 0:f86e6135dcbc 7 * @note
elevatorguy 0:f86e6135dcbc 8 * Copyright (C) 2009-2011 ARM Limited. All rights reserved.
elevatorguy 0:f86e6135dcbc 9 *
elevatorguy 0:f86e6135dcbc 10 * @par
elevatorguy 0:f86e6135dcbc 11 * ARM Limited (ARM) is supplying this software for use with Cortex-M
elevatorguy 0:f86e6135dcbc 12 * processor based microcontrollers. This file can be freely distributed
elevatorguy 0:f86e6135dcbc 13 * within development tools that are supporting such ARM based processors.
elevatorguy 0:f86e6135dcbc 14 *
elevatorguy 0:f86e6135dcbc 15 * @par
elevatorguy 0:f86e6135dcbc 16 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
elevatorguy 0:f86e6135dcbc 17 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
elevatorguy 0:f86e6135dcbc 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
elevatorguy 0:f86e6135dcbc 19 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
elevatorguy 0:f86e6135dcbc 20 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
elevatorguy 0:f86e6135dcbc 21 *
elevatorguy 0:f86e6135dcbc 22 ******************************************************************************/
elevatorguy 0:f86e6135dcbc 23
elevatorguy 0:f86e6135dcbc 24 #ifndef __CORE_CMINSTR_H
elevatorguy 0:f86e6135dcbc 25 #define __CORE_CMINSTR_H
elevatorguy 0:f86e6135dcbc 26
elevatorguy 0:f86e6135dcbc 27
elevatorguy 0:f86e6135dcbc 28 /* ########################## Core Instruction Access ######################### */
elevatorguy 0:f86e6135dcbc 29 /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
elevatorguy 0:f86e6135dcbc 30 Access to dedicated instructions
elevatorguy 0:f86e6135dcbc 31 @{
elevatorguy 0:f86e6135dcbc 32 */
elevatorguy 0:f86e6135dcbc 33
elevatorguy 0:f86e6135dcbc 34 #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
elevatorguy 0:f86e6135dcbc 35 /* ARM armcc specific functions */
elevatorguy 0:f86e6135dcbc 36
elevatorguy 0:f86e6135dcbc 37 #if (__ARMCC_VERSION < 400677)
elevatorguy 0:f86e6135dcbc 38 #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
elevatorguy 0:f86e6135dcbc 39 #endif
elevatorguy 0:f86e6135dcbc 40
elevatorguy 0:f86e6135dcbc 41
elevatorguy 0:f86e6135dcbc 42 /** \brief No Operation
elevatorguy 0:f86e6135dcbc 43
elevatorguy 0:f86e6135dcbc 44 No Operation does nothing. This instruction can be used for code alignment purposes.
elevatorguy 0:f86e6135dcbc 45 */
elevatorguy 0:f86e6135dcbc 46 #define __NOP __nop
elevatorguy 0:f86e6135dcbc 47
elevatorguy 0:f86e6135dcbc 48
elevatorguy 0:f86e6135dcbc 49 /** \brief Wait For Interrupt
elevatorguy 0:f86e6135dcbc 50
elevatorguy 0:f86e6135dcbc 51 Wait For Interrupt is a hint instruction that suspends execution
elevatorguy 0:f86e6135dcbc 52 until one of a number of events occurs.
elevatorguy 0:f86e6135dcbc 53 */
elevatorguy 0:f86e6135dcbc 54 #define __WFI __wfi
elevatorguy 0:f86e6135dcbc 55
elevatorguy 0:f86e6135dcbc 56
elevatorguy 0:f86e6135dcbc 57 /** \brief Wait For Event
elevatorguy 0:f86e6135dcbc 58
elevatorguy 0:f86e6135dcbc 59 Wait For Event is a hint instruction that permits the processor to enter
elevatorguy 0:f86e6135dcbc 60 a low-power state until one of a number of events occurs.
elevatorguy 0:f86e6135dcbc 61 */
elevatorguy 0:f86e6135dcbc 62 #define __WFE __wfe
elevatorguy 0:f86e6135dcbc 63
elevatorguy 0:f86e6135dcbc 64
elevatorguy 0:f86e6135dcbc 65 /** \brief Send Event
elevatorguy 0:f86e6135dcbc 66
elevatorguy 0:f86e6135dcbc 67 Send Event is a hint instruction. It causes an event to be signaled to the CPU.
elevatorguy 0:f86e6135dcbc 68 */
elevatorguy 0:f86e6135dcbc 69 #define __SEV __sev
elevatorguy 0:f86e6135dcbc 70
elevatorguy 0:f86e6135dcbc 71
elevatorguy 0:f86e6135dcbc 72 /** \brief Instruction Synchronization Barrier
elevatorguy 0:f86e6135dcbc 73
elevatorguy 0:f86e6135dcbc 74 Instruction Synchronization Barrier flushes the pipeline in the processor,
elevatorguy 0:f86e6135dcbc 75 so that all instructions following the ISB are fetched from cache or
elevatorguy 0:f86e6135dcbc 76 memory, after the instruction has been completed.
elevatorguy 0:f86e6135dcbc 77 */
elevatorguy 0:f86e6135dcbc 78 #define __ISB() __isb(0xF)
elevatorguy 0:f86e6135dcbc 79
elevatorguy 0:f86e6135dcbc 80
elevatorguy 0:f86e6135dcbc 81 /** \brief Data Synchronization Barrier
elevatorguy 0:f86e6135dcbc 82
elevatorguy 0:f86e6135dcbc 83 This function acts as a special kind of Data Memory Barrier.
elevatorguy 0:f86e6135dcbc 84 It completes when all explicit memory accesses before this instruction complete.
elevatorguy 0:f86e6135dcbc 85 */
elevatorguy 0:f86e6135dcbc 86 #define __DSB() __dsb(0xF)
elevatorguy 0:f86e6135dcbc 87
elevatorguy 0:f86e6135dcbc 88
elevatorguy 0:f86e6135dcbc 89 /** \brief Data Memory Barrier
elevatorguy 0:f86e6135dcbc 90
elevatorguy 0:f86e6135dcbc 91 This function ensures the apparent order of the explicit memory operations before
elevatorguy 0:f86e6135dcbc 92 and after the instruction, without ensuring their completion.
elevatorguy 0:f86e6135dcbc 93 */
elevatorguy 0:f86e6135dcbc 94 #define __DMB() __dmb(0xF)
elevatorguy 0:f86e6135dcbc 95
elevatorguy 0:f86e6135dcbc 96
elevatorguy 0:f86e6135dcbc 97 /** \brief Reverse byte order (32 bit)
elevatorguy 0:f86e6135dcbc 98
elevatorguy 0:f86e6135dcbc 99 This function reverses the byte order in integer value.
elevatorguy 0:f86e6135dcbc 100
elevatorguy 0:f86e6135dcbc 101 \param [in] value Value to reverse
elevatorguy 0:f86e6135dcbc 102 \return Reversed value
elevatorguy 0:f86e6135dcbc 103 */
elevatorguy 0:f86e6135dcbc 104 #define __REV __rev
elevatorguy 0:f86e6135dcbc 105
elevatorguy 0:f86e6135dcbc 106
elevatorguy 0:f86e6135dcbc 107 /** \brief Reverse byte order (16 bit)
elevatorguy 0:f86e6135dcbc 108
elevatorguy 0:f86e6135dcbc 109 This function reverses the byte order in two unsigned short values.
elevatorguy 0:f86e6135dcbc 110
elevatorguy 0:f86e6135dcbc 111 \param [in] value Value to reverse
elevatorguy 0:f86e6135dcbc 112 \return Reversed value
elevatorguy 0:f86e6135dcbc 113 */
elevatorguy 0:f86e6135dcbc 114 static __attribute__((section(".rev16_text"))) __INLINE __ASM uint32_t __REV16(uint32_t value)
elevatorguy 0:f86e6135dcbc 115 {
elevatorguy 0:f86e6135dcbc 116 rev16 r0, r0
elevatorguy 0:f86e6135dcbc 117 bx lr
elevatorguy 0:f86e6135dcbc 118 }
elevatorguy 0:f86e6135dcbc 119
elevatorguy 0:f86e6135dcbc 120
elevatorguy 0:f86e6135dcbc 121 /** \brief Reverse byte order in signed short value
elevatorguy 0:f86e6135dcbc 122
elevatorguy 0:f86e6135dcbc 123 This function reverses the byte order in a signed short value with sign extension to integer.
elevatorguy 0:f86e6135dcbc 124
elevatorguy 0:f86e6135dcbc 125 \param [in] value Value to reverse
elevatorguy 0:f86e6135dcbc 126 \return Reversed value
elevatorguy 0:f86e6135dcbc 127 */
elevatorguy 0:f86e6135dcbc 128 static __attribute__((section(".revsh_text"))) __INLINE __ASM int32_t __REVSH(int32_t value)
elevatorguy 0:f86e6135dcbc 129 {
elevatorguy 0:f86e6135dcbc 130 revsh r0, r0
elevatorguy 0:f86e6135dcbc 131 bx lr
elevatorguy 0:f86e6135dcbc 132 }
elevatorguy 0:f86e6135dcbc 133
elevatorguy 0:f86e6135dcbc 134
elevatorguy 0:f86e6135dcbc 135 #if (__CORTEX_M >= 0x03)
elevatorguy 0:f86e6135dcbc 136
elevatorguy 0:f86e6135dcbc 137 /** \brief Reverse bit order of value
elevatorguy 0:f86e6135dcbc 138
elevatorguy 0:f86e6135dcbc 139 This function reverses the bit order of the given value.
elevatorguy 0:f86e6135dcbc 140
elevatorguy 0:f86e6135dcbc 141 \param [in] value Value to reverse
elevatorguy 0:f86e6135dcbc 142 \return Reversed value
elevatorguy 0:f86e6135dcbc 143 */
elevatorguy 0:f86e6135dcbc 144 #define __RBIT __rbit
elevatorguy 0:f86e6135dcbc 145
elevatorguy 0:f86e6135dcbc 146
elevatorguy 0:f86e6135dcbc 147 /** \brief LDR Exclusive (8 bit)
elevatorguy 0:f86e6135dcbc 148
elevatorguy 0:f86e6135dcbc 149 This function performs a exclusive LDR command for 8 bit value.
elevatorguy 0:f86e6135dcbc 150
elevatorguy 0:f86e6135dcbc 151 \param [in] ptr Pointer to data
elevatorguy 0:f86e6135dcbc 152 \return value of type uint8_t at (*ptr)
elevatorguy 0:f86e6135dcbc 153 */
elevatorguy 0:f86e6135dcbc 154 #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
elevatorguy 0:f86e6135dcbc 155
elevatorguy 0:f86e6135dcbc 156
elevatorguy 0:f86e6135dcbc 157 /** \brief LDR Exclusive (16 bit)
elevatorguy 0:f86e6135dcbc 158
elevatorguy 0:f86e6135dcbc 159 This function performs a exclusive LDR command for 16 bit values.
elevatorguy 0:f86e6135dcbc 160
elevatorguy 0:f86e6135dcbc 161 \param [in] ptr Pointer to data
elevatorguy 0:f86e6135dcbc 162 \return value of type uint16_t at (*ptr)
elevatorguy 0:f86e6135dcbc 163 */
elevatorguy 0:f86e6135dcbc 164 #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
elevatorguy 0:f86e6135dcbc 165
elevatorguy 0:f86e6135dcbc 166
elevatorguy 0:f86e6135dcbc 167 /** \brief LDR Exclusive (32 bit)
elevatorguy 0:f86e6135dcbc 168
elevatorguy 0:f86e6135dcbc 169 This function performs a exclusive LDR command for 32 bit values.
elevatorguy 0:f86e6135dcbc 170
elevatorguy 0:f86e6135dcbc 171 \param [in] ptr Pointer to data
elevatorguy 0:f86e6135dcbc 172 \return value of type uint32_t at (*ptr)
elevatorguy 0:f86e6135dcbc 173 */
elevatorguy 0:f86e6135dcbc 174 #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
elevatorguy 0:f86e6135dcbc 175
elevatorguy 0:f86e6135dcbc 176
elevatorguy 0:f86e6135dcbc 177 /** \brief STR Exclusive (8 bit)
elevatorguy 0:f86e6135dcbc 178
elevatorguy 0:f86e6135dcbc 179 This function performs a exclusive STR command for 8 bit values.
elevatorguy 0:f86e6135dcbc 180
elevatorguy 0:f86e6135dcbc 181 \param [in] value Value to store
elevatorguy 0:f86e6135dcbc 182 \param [in] ptr Pointer to location
elevatorguy 0:f86e6135dcbc 183 \return 0 Function succeeded
elevatorguy 0:f86e6135dcbc 184 \return 1 Function failed
elevatorguy 0:f86e6135dcbc 185 */
elevatorguy 0:f86e6135dcbc 186 #define __STREXB(value, ptr) __strex(value, ptr)
elevatorguy 0:f86e6135dcbc 187
elevatorguy 0:f86e6135dcbc 188
elevatorguy 0:f86e6135dcbc 189 /** \brief STR Exclusive (16 bit)
elevatorguy 0:f86e6135dcbc 190
elevatorguy 0:f86e6135dcbc 191 This function performs a exclusive STR command for 16 bit values.
elevatorguy 0:f86e6135dcbc 192
elevatorguy 0:f86e6135dcbc 193 \param [in] value Value to store
elevatorguy 0:f86e6135dcbc 194 \param [in] ptr Pointer to location
elevatorguy 0:f86e6135dcbc 195 \return 0 Function succeeded
elevatorguy 0:f86e6135dcbc 196 \return 1 Function failed
elevatorguy 0:f86e6135dcbc 197 */
elevatorguy 0:f86e6135dcbc 198 #define __STREXH(value, ptr) __strex(value, ptr)
elevatorguy 0:f86e6135dcbc 199
elevatorguy 0:f86e6135dcbc 200
elevatorguy 0:f86e6135dcbc 201 /** \brief STR Exclusive (32 bit)
elevatorguy 0:f86e6135dcbc 202
elevatorguy 0:f86e6135dcbc 203 This function performs a exclusive STR command for 32 bit values.
elevatorguy 0:f86e6135dcbc 204
elevatorguy 0:f86e6135dcbc 205 \param [in] value Value to store
elevatorguy 0:f86e6135dcbc 206 \param [in] ptr Pointer to location
elevatorguy 0:f86e6135dcbc 207 \return 0 Function succeeded
elevatorguy 0:f86e6135dcbc 208 \return 1 Function failed
elevatorguy 0:f86e6135dcbc 209 */
elevatorguy 0:f86e6135dcbc 210 #define __STREXW(value, ptr) __strex(value, ptr)
elevatorguy 0:f86e6135dcbc 211
elevatorguy 0:f86e6135dcbc 212
elevatorguy 0:f86e6135dcbc 213 /** \brief Remove the exclusive lock
elevatorguy 0:f86e6135dcbc 214
elevatorguy 0:f86e6135dcbc 215 This function removes the exclusive lock which is created by LDREX.
elevatorguy 0:f86e6135dcbc 216
elevatorguy 0:f86e6135dcbc 217 */
elevatorguy 0:f86e6135dcbc 218 #define __CLREX __clrex
elevatorguy 0:f86e6135dcbc 219
elevatorguy 0:f86e6135dcbc 220
elevatorguy 0:f86e6135dcbc 221 /** \brief Signed Saturate
elevatorguy 0:f86e6135dcbc 222
elevatorguy 0:f86e6135dcbc 223 This function saturates a signed value.
elevatorguy 0:f86e6135dcbc 224
elevatorguy 0:f86e6135dcbc 225 \param [in] value Value to be saturated
elevatorguy 0:f86e6135dcbc 226 \param [in] sat Bit position to saturate to (1..32)
elevatorguy 0:f86e6135dcbc 227 \return Saturated value
elevatorguy 0:f86e6135dcbc 228 */
elevatorguy 0:f86e6135dcbc 229 #define __SSAT __ssat
elevatorguy 0:f86e6135dcbc 230
elevatorguy 0:f86e6135dcbc 231
elevatorguy 0:f86e6135dcbc 232 /** \brief Unsigned Saturate
elevatorguy 0:f86e6135dcbc 233
elevatorguy 0:f86e6135dcbc 234 This function saturates an unsigned value.
elevatorguy 0:f86e6135dcbc 235
elevatorguy 0:f86e6135dcbc 236 \param [in] value Value to be saturated
elevatorguy 0:f86e6135dcbc 237 \param [in] sat Bit position to saturate to (0..31)
elevatorguy 0:f86e6135dcbc 238 \return Saturated value
elevatorguy 0:f86e6135dcbc 239 */
elevatorguy 0:f86e6135dcbc 240 #define __USAT __usat
elevatorguy 0:f86e6135dcbc 241
elevatorguy 0:f86e6135dcbc 242
elevatorguy 0:f86e6135dcbc 243 /** \brief Count leading zeros
elevatorguy 0:f86e6135dcbc 244
elevatorguy 0:f86e6135dcbc 245 This function counts the number of leading zeros of a data value.
elevatorguy 0:f86e6135dcbc 246
elevatorguy 0:f86e6135dcbc 247 \param [in] value Value to count the leading zeros
elevatorguy 0:f86e6135dcbc 248 \return number of leading zeros in value
elevatorguy 0:f86e6135dcbc 249 */
elevatorguy 0:f86e6135dcbc 250 #define __CLZ __clz
elevatorguy 0:f86e6135dcbc 251
elevatorguy 0:f86e6135dcbc 252 #endif /* (__CORTEX_M >= 0x03) */
elevatorguy 0:f86e6135dcbc 253
elevatorguy 0:f86e6135dcbc 254
elevatorguy 0:f86e6135dcbc 255
elevatorguy 0:f86e6135dcbc 256 #elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
elevatorguy 0:f86e6135dcbc 257 /* IAR iccarm specific functions */
elevatorguy 0:f86e6135dcbc 258
elevatorguy 0:f86e6135dcbc 259 #include <cmsis_iar.h>
elevatorguy 0:f86e6135dcbc 260
elevatorguy 0:f86e6135dcbc 261
elevatorguy 0:f86e6135dcbc 262 #elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
elevatorguy 0:f86e6135dcbc 263 /* GNU gcc specific functions */
elevatorguy 0:f86e6135dcbc 264
elevatorguy 0:f86e6135dcbc 265 /** \brief No Operation
elevatorguy 0:f86e6135dcbc 266
elevatorguy 0:f86e6135dcbc 267 No Operation does nothing. This instruction can be used for code alignment purposes.
elevatorguy 0:f86e6135dcbc 268 */
elevatorguy 0:f86e6135dcbc 269 __attribute__( ( always_inline ) ) static __INLINE void __NOP(void)
elevatorguy 0:f86e6135dcbc 270 {
elevatorguy 0:f86e6135dcbc 271 __ASM volatile ("nop");
elevatorguy 0:f86e6135dcbc 272 }
elevatorguy 0:f86e6135dcbc 273
elevatorguy 0:f86e6135dcbc 274
elevatorguy 0:f86e6135dcbc 275 /** \brief Wait For Interrupt
elevatorguy 0:f86e6135dcbc 276
elevatorguy 0:f86e6135dcbc 277 Wait For Interrupt is a hint instruction that suspends execution
elevatorguy 0:f86e6135dcbc 278 until one of a number of events occurs.
elevatorguy 0:f86e6135dcbc 279 */
elevatorguy 0:f86e6135dcbc 280 __attribute__( ( always_inline ) ) static __INLINE void __WFI(void)
elevatorguy 0:f86e6135dcbc 281 {
elevatorguy 0:f86e6135dcbc 282 __ASM volatile ("wfi");
elevatorguy 0:f86e6135dcbc 283 }
elevatorguy 0:f86e6135dcbc 284
elevatorguy 0:f86e6135dcbc 285
elevatorguy 0:f86e6135dcbc 286 /** \brief Wait For Event
elevatorguy 0:f86e6135dcbc 287
elevatorguy 0:f86e6135dcbc 288 Wait For Event is a hint instruction that permits the processor to enter
elevatorguy 0:f86e6135dcbc 289 a low-power state until one of a number of events occurs.
elevatorguy 0:f86e6135dcbc 290 */
elevatorguy 0:f86e6135dcbc 291 __attribute__( ( always_inline ) ) static __INLINE void __WFE(void)
elevatorguy 0:f86e6135dcbc 292 {
elevatorguy 0:f86e6135dcbc 293 __ASM volatile ("wfe");
elevatorguy 0:f86e6135dcbc 294 }
elevatorguy 0:f86e6135dcbc 295
elevatorguy 0:f86e6135dcbc 296
elevatorguy 0:f86e6135dcbc 297 /** \brief Send Event
elevatorguy 0:f86e6135dcbc 298
elevatorguy 0:f86e6135dcbc 299 Send Event is a hint instruction. It causes an event to be signaled to the CPU.
elevatorguy 0:f86e6135dcbc 300 */
elevatorguy 0:f86e6135dcbc 301 __attribute__( ( always_inline ) ) static __INLINE void __SEV(void)
elevatorguy 0:f86e6135dcbc 302 {
elevatorguy 0:f86e6135dcbc 303 __ASM volatile ("sev");
elevatorguy 0:f86e6135dcbc 304 }
elevatorguy 0:f86e6135dcbc 305
elevatorguy 0:f86e6135dcbc 306
elevatorguy 0:f86e6135dcbc 307 /** \brief Instruction Synchronization Barrier
elevatorguy 0:f86e6135dcbc 308
elevatorguy 0:f86e6135dcbc 309 Instruction Synchronization Barrier flushes the pipeline in the processor,
elevatorguy 0:f86e6135dcbc 310 so that all instructions following the ISB are fetched from cache or
elevatorguy 0:f86e6135dcbc 311 memory, after the instruction has been completed.
elevatorguy 0:f86e6135dcbc 312 */
elevatorguy 0:f86e6135dcbc 313 __attribute__( ( always_inline ) ) static __INLINE void __ISB(void)
elevatorguy 0:f86e6135dcbc 314 {
elevatorguy 0:f86e6135dcbc 315 __ASM volatile ("isb");
elevatorguy 0:f86e6135dcbc 316 }
elevatorguy 0:f86e6135dcbc 317
elevatorguy 0:f86e6135dcbc 318
elevatorguy 0:f86e6135dcbc 319 /** \brief Data Synchronization Barrier
elevatorguy 0:f86e6135dcbc 320
elevatorguy 0:f86e6135dcbc 321 This function acts as a special kind of Data Memory Barrier.
elevatorguy 0:f86e6135dcbc 322 It completes when all explicit memory accesses before this instruction complete.
elevatorguy 0:f86e6135dcbc 323 */
elevatorguy 0:f86e6135dcbc 324 __attribute__( ( always_inline ) ) static __INLINE void __DSB(void)
elevatorguy 0:f86e6135dcbc 325 {
elevatorguy 0:f86e6135dcbc 326 __ASM volatile ("dsb");
elevatorguy 0:f86e6135dcbc 327 }
elevatorguy 0:f86e6135dcbc 328
elevatorguy 0:f86e6135dcbc 329
elevatorguy 0:f86e6135dcbc 330 /** \brief Data Memory Barrier
elevatorguy 0:f86e6135dcbc 331
elevatorguy 0:f86e6135dcbc 332 This function ensures the apparent order of the explicit memory operations before
elevatorguy 0:f86e6135dcbc 333 and after the instruction, without ensuring their completion.
elevatorguy 0:f86e6135dcbc 334 */
elevatorguy 0:f86e6135dcbc 335 __attribute__( ( always_inline ) ) static __INLINE void __DMB(void)
elevatorguy 0:f86e6135dcbc 336 {
elevatorguy 0:f86e6135dcbc 337 __ASM volatile ("dmb");
elevatorguy 0:f86e6135dcbc 338 }
elevatorguy 0:f86e6135dcbc 339
elevatorguy 0:f86e6135dcbc 340
elevatorguy 0:f86e6135dcbc 341 /** \brief Reverse byte order (32 bit)
elevatorguy 0:f86e6135dcbc 342
elevatorguy 0:f86e6135dcbc 343 This function reverses the byte order in integer value.
elevatorguy 0:f86e6135dcbc 344
elevatorguy 0:f86e6135dcbc 345 \param [in] value Value to reverse
elevatorguy 0:f86e6135dcbc 346 \return Reversed value
elevatorguy 0:f86e6135dcbc 347 */
elevatorguy 0:f86e6135dcbc 348 __attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value)
elevatorguy 0:f86e6135dcbc 349 {
elevatorguy 0:f86e6135dcbc 350 uint32_t result;
elevatorguy 0:f86e6135dcbc 351
elevatorguy 0:f86e6135dcbc 352 __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );
elevatorguy 0:f86e6135dcbc 353 return(result);
elevatorguy 0:f86e6135dcbc 354 }
elevatorguy 0:f86e6135dcbc 355
elevatorguy 0:f86e6135dcbc 356
elevatorguy 0:f86e6135dcbc 357 /** \brief Reverse byte order (16 bit)
elevatorguy 0:f86e6135dcbc 358
elevatorguy 0:f86e6135dcbc 359 This function reverses the byte order in two unsigned short values.
elevatorguy 0:f86e6135dcbc 360
elevatorguy 0:f86e6135dcbc 361 \param [in] value Value to reverse
elevatorguy 0:f86e6135dcbc 362 \return Reversed value
elevatorguy 0:f86e6135dcbc 363 */
elevatorguy 0:f86e6135dcbc 364 __attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value)
elevatorguy 0:f86e6135dcbc 365 {
elevatorguy 0:f86e6135dcbc 366 uint32_t result;
elevatorguy 0:f86e6135dcbc 367
elevatorguy 0:f86e6135dcbc 368 __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );
elevatorguy 0:f86e6135dcbc 369 return(result);
elevatorguy 0:f86e6135dcbc 370 }
elevatorguy 0:f86e6135dcbc 371
elevatorguy 0:f86e6135dcbc 372
elevatorguy 0:f86e6135dcbc 373 /** \brief Reverse byte order in signed short value
elevatorguy 0:f86e6135dcbc 374
elevatorguy 0:f86e6135dcbc 375 This function reverses the byte order in a signed short value with sign extension to integer.
elevatorguy 0:f86e6135dcbc 376
elevatorguy 0:f86e6135dcbc 377 \param [in] value Value to reverse
elevatorguy 0:f86e6135dcbc 378 \return Reversed value
elevatorguy 0:f86e6135dcbc 379 */
elevatorguy 0:f86e6135dcbc 380 __attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value)
elevatorguy 0:f86e6135dcbc 381 {
elevatorguy 0:f86e6135dcbc 382 uint32_t result;
elevatorguy 0:f86e6135dcbc 383
elevatorguy 0:f86e6135dcbc 384 __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );
elevatorguy 0:f86e6135dcbc 385 return(result);
elevatorguy 0:f86e6135dcbc 386 }
elevatorguy 0:f86e6135dcbc 387
elevatorguy 0:f86e6135dcbc 388
elevatorguy 0:f86e6135dcbc 389 #if (__CORTEX_M >= 0x03)
elevatorguy 0:f86e6135dcbc 390
elevatorguy 0:f86e6135dcbc 391 /** \brief Reverse bit order of value
elevatorguy 0:f86e6135dcbc 392
elevatorguy 0:f86e6135dcbc 393 This function reverses the bit order of the given value.
elevatorguy 0:f86e6135dcbc 394
elevatorguy 0:f86e6135dcbc 395 \param [in] value Value to reverse
elevatorguy 0:f86e6135dcbc 396 \return Reversed value
elevatorguy 0:f86e6135dcbc 397 */
elevatorguy 0:f86e6135dcbc 398 __attribute__( ( always_inline ) ) static __INLINE uint32_t __RBIT(uint32_t value)
elevatorguy 0:f86e6135dcbc 399 {
elevatorguy 0:f86e6135dcbc 400 uint32_t result;
elevatorguy 0:f86e6135dcbc 401
elevatorguy 0:f86e6135dcbc 402 __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
elevatorguy 0:f86e6135dcbc 403 return(result);
elevatorguy 0:f86e6135dcbc 404 }
elevatorguy 0:f86e6135dcbc 405
elevatorguy 0:f86e6135dcbc 406
elevatorguy 0:f86e6135dcbc 407 /** \brief LDR Exclusive (8 bit)
elevatorguy 0:f86e6135dcbc 408
elevatorguy 0:f86e6135dcbc 409 This function performs a exclusive LDR command for 8 bit value.
elevatorguy 0:f86e6135dcbc 410
elevatorguy 0:f86e6135dcbc 411 \param [in] ptr Pointer to data
elevatorguy 0:f86e6135dcbc 412 \return value of type uint8_t at (*ptr)
elevatorguy 0:f86e6135dcbc 413 */
elevatorguy 0:f86e6135dcbc 414 __attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr)
elevatorguy 0:f86e6135dcbc 415 {
elevatorguy 0:f86e6135dcbc 416 uint8_t result;
elevatorguy 0:f86e6135dcbc 417
elevatorguy 0:f86e6135dcbc 418 __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );
elevatorguy 0:f86e6135dcbc 419 return(result);
elevatorguy 0:f86e6135dcbc 420 }
elevatorguy 0:f86e6135dcbc 421
elevatorguy 0:f86e6135dcbc 422
elevatorguy 0:f86e6135dcbc 423 /** \brief LDR Exclusive (16 bit)
elevatorguy 0:f86e6135dcbc 424
elevatorguy 0:f86e6135dcbc 425 This function performs a exclusive LDR command for 16 bit values.
elevatorguy 0:f86e6135dcbc 426
elevatorguy 0:f86e6135dcbc 427 \param [in] ptr Pointer to data
elevatorguy 0:f86e6135dcbc 428 \return value of type uint16_t at (*ptr)
elevatorguy 0:f86e6135dcbc 429 */
elevatorguy 0:f86e6135dcbc 430 __attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr)
elevatorguy 0:f86e6135dcbc 431 {
elevatorguy 0:f86e6135dcbc 432 uint16_t result;
elevatorguy 0:f86e6135dcbc 433
elevatorguy 0:f86e6135dcbc 434 __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );
elevatorguy 0:f86e6135dcbc 435 return(result);
elevatorguy 0:f86e6135dcbc 436 }
elevatorguy 0:f86e6135dcbc 437
elevatorguy 0:f86e6135dcbc 438
elevatorguy 0:f86e6135dcbc 439 /** \brief LDR Exclusive (32 bit)
elevatorguy 0:f86e6135dcbc 440
elevatorguy 0:f86e6135dcbc 441 This function performs a exclusive LDR command for 32 bit values.
elevatorguy 0:f86e6135dcbc 442
elevatorguy 0:f86e6135dcbc 443 \param [in] ptr Pointer to data
elevatorguy 0:f86e6135dcbc 444 \return value of type uint32_t at (*ptr)
elevatorguy 0:f86e6135dcbc 445 */
elevatorguy 0:f86e6135dcbc 446 __attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr)
elevatorguy 0:f86e6135dcbc 447 {
elevatorguy 0:f86e6135dcbc 448 uint32_t result;
elevatorguy 0:f86e6135dcbc 449
elevatorguy 0:f86e6135dcbc 450 __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );
elevatorguy 0:f86e6135dcbc 451 return(result);
elevatorguy 0:f86e6135dcbc 452 }
elevatorguy 0:f86e6135dcbc 453
elevatorguy 0:f86e6135dcbc 454
elevatorguy 0:f86e6135dcbc 455 /** \brief STR Exclusive (8 bit)
elevatorguy 0:f86e6135dcbc 456
elevatorguy 0:f86e6135dcbc 457 This function performs a exclusive STR command for 8 bit values.
elevatorguy 0:f86e6135dcbc 458
elevatorguy 0:f86e6135dcbc 459 \param [in] value Value to store
elevatorguy 0:f86e6135dcbc 460 \param [in] ptr Pointer to location
elevatorguy 0:f86e6135dcbc 461 \return 0 Function succeeded
elevatorguy 0:f86e6135dcbc 462 \return 1 Function failed
elevatorguy 0:f86e6135dcbc 463 */
elevatorguy 0:f86e6135dcbc 464 __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
elevatorguy 0:f86e6135dcbc 465 {
elevatorguy 0:f86e6135dcbc 466 uint32_t result;
elevatorguy 0:f86e6135dcbc 467
elevatorguy 0:f86e6135dcbc 468 __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
elevatorguy 0:f86e6135dcbc 469 return(result);
elevatorguy 0:f86e6135dcbc 470 }
elevatorguy 0:f86e6135dcbc 471
elevatorguy 0:f86e6135dcbc 472
elevatorguy 0:f86e6135dcbc 473 /** \brief STR Exclusive (16 bit)
elevatorguy 0:f86e6135dcbc 474
elevatorguy 0:f86e6135dcbc 475 This function performs a exclusive STR command for 16 bit values.
elevatorguy 0:f86e6135dcbc 476
elevatorguy 0:f86e6135dcbc 477 \param [in] value Value to store
elevatorguy 0:f86e6135dcbc 478 \param [in] ptr Pointer to location
elevatorguy 0:f86e6135dcbc 479 \return 0 Function succeeded
elevatorguy 0:f86e6135dcbc 480 \return 1 Function failed
elevatorguy 0:f86e6135dcbc 481 */
elevatorguy 0:f86e6135dcbc 482 __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
elevatorguy 0:f86e6135dcbc 483 {
elevatorguy 0:f86e6135dcbc 484 uint32_t result;
elevatorguy 0:f86e6135dcbc 485
elevatorguy 0:f86e6135dcbc 486 __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
elevatorguy 0:f86e6135dcbc 487 return(result);
elevatorguy 0:f86e6135dcbc 488 }
elevatorguy 0:f86e6135dcbc 489
elevatorguy 0:f86e6135dcbc 490
elevatorguy 0:f86e6135dcbc 491 /** \brief STR Exclusive (32 bit)
elevatorguy 0:f86e6135dcbc 492
elevatorguy 0:f86e6135dcbc 493 This function performs a exclusive STR command for 32 bit values.
elevatorguy 0:f86e6135dcbc 494
elevatorguy 0:f86e6135dcbc 495 \param [in] value Value to store
elevatorguy 0:f86e6135dcbc 496 \param [in] ptr Pointer to location
elevatorguy 0:f86e6135dcbc 497 \return 0 Function succeeded
elevatorguy 0:f86e6135dcbc 498 \return 1 Function failed
elevatorguy 0:f86e6135dcbc 499 */
elevatorguy 0:f86e6135dcbc 500 __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
elevatorguy 0:f86e6135dcbc 501 {
elevatorguy 0:f86e6135dcbc 502 uint32_t result;
elevatorguy 0:f86e6135dcbc 503
elevatorguy 0:f86e6135dcbc 504 __ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
elevatorguy 0:f86e6135dcbc 505 return(result);
elevatorguy 0:f86e6135dcbc 506 }
elevatorguy 0:f86e6135dcbc 507
elevatorguy 0:f86e6135dcbc 508
elevatorguy 0:f86e6135dcbc 509 /** \brief Remove the exclusive lock
elevatorguy 0:f86e6135dcbc 510
elevatorguy 0:f86e6135dcbc 511 This function removes the exclusive lock which is created by LDREX.
elevatorguy 0:f86e6135dcbc 512
elevatorguy 0:f86e6135dcbc 513 */
elevatorguy 0:f86e6135dcbc 514 __attribute__( ( always_inline ) ) static __INLINE void __CLREX(void)
elevatorguy 0:f86e6135dcbc 515 {
elevatorguy 0:f86e6135dcbc 516 __ASM volatile ("clrex");
elevatorguy 0:f86e6135dcbc 517 }
elevatorguy 0:f86e6135dcbc 518
elevatorguy 0:f86e6135dcbc 519
elevatorguy 0:f86e6135dcbc 520 /** \brief Signed Saturate
elevatorguy 0:f86e6135dcbc 521
elevatorguy 0:f86e6135dcbc 522 This function saturates a signed value.
elevatorguy 0:f86e6135dcbc 523
elevatorguy 0:f86e6135dcbc 524 \param [in] value Value to be saturated
elevatorguy 0:f86e6135dcbc 525 \param [in] sat Bit position to saturate to (1..32)
elevatorguy 0:f86e6135dcbc 526 \return Saturated value
elevatorguy 0:f86e6135dcbc 527 */
elevatorguy 0:f86e6135dcbc 528 #define __SSAT(ARG1,ARG2) \
elevatorguy 0:f86e6135dcbc 529 ({ \
elevatorguy 0:f86e6135dcbc 530 uint32_t __RES, __ARG1 = (ARG1); \
elevatorguy 0:f86e6135dcbc 531 __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
elevatorguy 0:f86e6135dcbc 532 __RES; \
elevatorguy 0:f86e6135dcbc 533 })
elevatorguy 0:f86e6135dcbc 534
elevatorguy 0:f86e6135dcbc 535
elevatorguy 0:f86e6135dcbc 536 /** \brief Unsigned Saturate
elevatorguy 0:f86e6135dcbc 537
elevatorguy 0:f86e6135dcbc 538 This function saturates an unsigned value.
elevatorguy 0:f86e6135dcbc 539
elevatorguy 0:f86e6135dcbc 540 \param [in] value Value to be saturated
elevatorguy 0:f86e6135dcbc 541 \param [in] sat Bit position to saturate to (0..31)
elevatorguy 0:f86e6135dcbc 542 \return Saturated value
elevatorguy 0:f86e6135dcbc 543 */
elevatorguy 0:f86e6135dcbc 544 #define __USAT(ARG1,ARG2) \
elevatorguy 0:f86e6135dcbc 545 ({ \
elevatorguy 0:f86e6135dcbc 546 uint32_t __RES, __ARG1 = (ARG1); \
elevatorguy 0:f86e6135dcbc 547 __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
elevatorguy 0:f86e6135dcbc 548 __RES; \
elevatorguy 0:f86e6135dcbc 549 })
elevatorguy 0:f86e6135dcbc 550
elevatorguy 0:f86e6135dcbc 551
elevatorguy 0:f86e6135dcbc 552 /** \brief Count leading zeros
elevatorguy 0:f86e6135dcbc 553
elevatorguy 0:f86e6135dcbc 554 This function counts the number of leading zeros of a data value.
elevatorguy 0:f86e6135dcbc 555
elevatorguy 0:f86e6135dcbc 556 \param [in] value Value to count the leading zeros
elevatorguy 0:f86e6135dcbc 557 \return number of leading zeros in value
elevatorguy 0:f86e6135dcbc 558 */
elevatorguy 0:f86e6135dcbc 559 __attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value)
elevatorguy 0:f86e6135dcbc 560 {
elevatorguy 0:f86e6135dcbc 561 uint8_t result;
elevatorguy 0:f86e6135dcbc 562
elevatorguy 0:f86e6135dcbc 563 __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
elevatorguy 0:f86e6135dcbc 564 return(result);
elevatorguy 0:f86e6135dcbc 565 }
elevatorguy 0:f86e6135dcbc 566
elevatorguy 0:f86e6135dcbc 567 #endif /* (__CORTEX_M >= 0x03) */
elevatorguy 0:f86e6135dcbc 568
elevatorguy 0:f86e6135dcbc 569
elevatorguy 0:f86e6135dcbc 570
elevatorguy 0:f86e6135dcbc 571
elevatorguy 0:f86e6135dcbc 572 #elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
elevatorguy 0:f86e6135dcbc 573 /* TASKING carm specific functions */
elevatorguy 0:f86e6135dcbc 574
elevatorguy 0:f86e6135dcbc 575 /*
elevatorguy 0:f86e6135dcbc 576 * The CMSIS functions have been implemented as intrinsics in the compiler.
elevatorguy 0:f86e6135dcbc 577 * Please use "carm -?i" to get an up to date list of all intrinsics,
elevatorguy 0:f86e6135dcbc 578 * Including the CMSIS ones.
elevatorguy 0:f86e6135dcbc 579 */
elevatorguy 0:f86e6135dcbc 580
elevatorguy 0:f86e6135dcbc 581 #endif
elevatorguy 0:f86e6135dcbc 582
elevatorguy 0:f86e6135dcbc 583 /*@}*/ /* end of group CMSIS_Core_InstructionInterface */
elevatorguy 0:f86e6135dcbc 584
elevatorguy 0:f86e6135dcbc 585 #endif /* __CORE_CMINSTR_H */