38 #ifndef __CORE_CMINSTR_H
39 #define __CORE_CMINSTR_H
48 #if defined ( __CC_ARM )
51 #if (__ARMCC_VERSION < 400677)
52 #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
92 #define __ISB() __isb(0xF)
100 #define __DSB() __dsb(0xF)
108 #define __DMB() __dmb(0xF)
128 #ifndef __NO_EMBEDDED_ASM
129 __attribute__((section(
".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
143 #ifndef __NO_EMBEDDED_ASM
144 __attribute__((section(
".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
171 #define __BKPT(value) __breakpoint(value)
174 #if (__CORTEX_M >= 0x03)
183 #define __RBIT __rbit
193 #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
203 #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
213 #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
225 #define __STREXB(value, ptr) __strex(value, ptr)
237 #define __STREXH(value, ptr) __strex(value, ptr)
249 #define __STREXW(value, ptr) __strex(value, ptr)
257 #define __CLREX __clrex
268 #define __SSAT __ssat
279 #define __USAT __usat
294 #elif defined ( __GNUC__ )
300 #if defined (__thumb__) && !defined (__thumb2__)
301 #define __CMSIS_GCC_OUT_REG(r) "=l" (r)
302 #define __CMSIS_GCC_USE_REG(r) "l" (r)
304 #define __CMSIS_GCC_OUT_REG(r) "=r" (r)
305 #define __CMSIS_GCC_USE_REG(r) "r" (r)
312 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __NOP(
void)
314 __ASM
volatile (
"nop");
323 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __WFI(
void)
325 __ASM
volatile (
"wfi");
334 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __WFE(
void)
336 __ASM
volatile (
"wfe");
344 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __SEV(
void)
346 __ASM
volatile (
"sev");
356 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __ISB(
void)
358 __ASM
volatile (
"isb");
367 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __DSB(
void)
369 __ASM
volatile (
"dsb");
378 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __DMB(
void)
380 __ASM
volatile (
"dmb");
391 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value)
393 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
394 return __builtin_bswap32(value);
398 __ASM
volatile (
"rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
411 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value)
415 __ASM
volatile (
"rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
427 __attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value)
429 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
430 return (
short)__builtin_bswap16(value);
434 __ASM
volatile (
"revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
448 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
450 return (op1 >> op2) | (op1 << (32 - op2));
462 #define __BKPT(value) __ASM volatile ("bkpt "#value)
465 #if (__CORTEX_M >= 0x03)
474 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
478 __ASM
volatile (
"rbit %0, %1" :
"=r" (result) :
"r" (value) );
490 __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
494 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
495 __ASM
volatile (
"ldrexb %0, %1" :
"=r" (result) :
"Q" (*addr) );
500 __ASM
volatile (
"ldrexb %0, [%1]" :
"=r" (result) :
"r" (addr) :
"memory" );
502 return ((uint8_t) result);
513 __attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
517 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
518 __ASM
volatile (
"ldrexh %0, %1" :
"=r" (result) :
"Q" (*addr) );
523 __ASM
volatile (
"ldrexh %0, [%1]" :
"=r" (result) :
"r" (addr) :
"memory" );
525 return ((uint16_t) result);
536 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
540 __ASM
volatile (
"ldrex %0, %1" :
"=r" (result) :
"Q" (*addr) );
554 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
558 __ASM
volatile (
"strexb %0, %2, %1" :
"=&r" (result),
"=Q" (*addr) :
"r" ((uint32_t)value) );
572 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
576 __ASM
volatile (
"strexh %0, %2, %1" :
"=&r" (result),
"=Q" (*addr) :
"r" ((uint32_t)value) );
590 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
594 __ASM
volatile (
"strex %0, %2, %1" :
"=&r" (result),
"=Q" (*addr) :
"r" (value) );
604 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __CLREX(
void)
606 __ASM
volatile (
"clrex" :::
"memory");
618 #define __SSAT(ARG1,ARG2) \
620 uint32_t __RES, __ARG1 = (ARG1); \
621 __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
634 #define __USAT(ARG1,ARG2) \
636 uint32_t __RES, __ARG1 = (ARG1); \
637 __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
649 __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
653 __ASM
volatile (
"clz %0, %1" :
"=r" (result) :
"r" (value) );
654 return ((uint8_t) result);
660 #elif defined ( __ICCARM__ )
662 #include <cmsis_iar.h>
665 #elif defined ( __TMS470__ )
667 #include <cmsis_ccs.h>
670 #elif defined ( __TASKING__ )
679 #elif defined ( __CSMC__ )
681 #include <cmsis_csm.h>
void __attribute__((interrupt))
This ISR handles most of the business interacting with the 1-wire bus.