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) || (__CORTEX_SC >= 300) 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 299 #ifndef __NO_EMBEDDED_ASM 300 __attribute__((section(
".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
315 #define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) 325 #define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) 335 #define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) 345 #define __STRBT(value, ptr) __strt(value, ptr) 355 #define __STRHT(value, ptr) __strt(value, ptr) 365 #define __STRT(value, ptr) __strt(value, ptr) 370 #elif defined ( __GNUC__ ) 376 #if defined (__thumb__) && !defined (__thumb2__) 377 #define __CMSIS_GCC_OUT_REG(r) "=l" (r) 378 #define __CMSIS_GCC_USE_REG(r) "l" (r) 380 #define __CMSIS_GCC_OUT_REG(r) "=r" (r) 381 #define __CMSIS_GCC_USE_REG(r) "r" (r) 388 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __NOP(
void)
390 __ASM
volatile (
"nop");
399 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __WFI(
void)
401 __ASM
volatile (
"wfi");
410 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __WFE(
void)
412 __ASM
volatile (
"wfe");
420 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __SEV(
void)
422 __ASM
volatile (
"sev");
432 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __ISB(
void)
434 __ASM
volatile (
"isb");
443 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __DSB(
void)
445 __ASM
volatile (
"dsb");
454 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __DMB(
void)
456 __ASM
volatile (
"dmb");
467 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value)
469 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) 470 return __builtin_bswap32(value);
474 __ASM
volatile (
"rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
487 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value)
491 __ASM
volatile (
"rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
503 __attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value)
505 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) 506 return (
short)__builtin_bswap16(value);
510 __ASM
volatile (
"revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
524 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
526 return (op1 >> op2) | (op1 << (32 - op2));
538 #define __BKPT(value) __ASM volatile ("bkpt "#value) 541 #if (__CORTEX_M >= 0x03) || (__CORTEX_SC >= 300) 550 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
554 __ASM
volatile (
"rbit %0, %1" :
"=r" (result) :
"r" (value) );
566 __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *
addr)
570 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) 571 __ASM
volatile (
"ldrexb %0, %1" :
"=r" (result) :
"Q" (*addr) );
576 __ASM
volatile (
"ldrexb %0, [%1]" :
"=r" (result) :
"r" (addr) :
"memory" );
578 return ((uint8_t) result);
589 __attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
593 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) 594 __ASM
volatile (
"ldrexh %0, %1" :
"=r" (result) :
"Q" (*addr) );
599 __ASM
volatile (
"ldrexh %0, [%1]" :
"=r" (result) :
"r" (addr) :
"memory" );
601 return ((uint16_t) result);
612 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
616 __ASM
volatile (
"ldrex %0, %1" :
"=r" (result) :
"Q" (*addr) );
630 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
634 __ASM
volatile (
"strexb %0, %2, %1" :
"=&r" (result),
"=Q" (*addr) :
"r" ((uint32_t)value) );
648 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
652 __ASM
volatile (
"strexh %0, %2, %1" :
"=&r" (result),
"=Q" (*addr) :
"r" ((uint32_t)value) );
666 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
670 __ASM
volatile (
"strex %0, %2, %1" :
"=&r" (result),
"=Q" (*addr) :
"r" (value) );
680 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __CLREX(
void)
682 __ASM
volatile (
"clrex" :::
"memory");
694 #define __SSAT(ARG1,ARG2) \ 696 uint32_t __RES, __ARG1 = (ARG1); \ 697 __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ 710 #define __USAT(ARG1,ARG2) \ 712 uint32_t __RES, __ARG1 = (ARG1); \ 713 __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ 725 __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
729 __ASM
volatile (
"clz %0, %1" :
"=r" (result) :
"r" (value) );
730 return ((uint8_t) result);
741 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RRX(uint32_t value)
745 __ASM
volatile (
"rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
757 __attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *addr)
761 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) 762 __ASM
volatile (
"ldrbt %0, %1" :
"=r" (result) :
"Q" (*addr) );
767 __ASM
volatile (
"ldrbt %0, [%1]" :
"=r" (result) :
"r" (addr) :
"memory" );
769 return ((uint8_t) result);
780 __attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *addr)
784 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) 785 __ASM
volatile (
"ldrht %0, %1" :
"=r" (result) :
"Q" (*addr) );
790 __ASM
volatile (
"ldrht %0, [%1]" :
"=r" (result) :
"r" (addr) :
"memory" );
792 return ((uint16_t) result);
803 __attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *addr)
807 __ASM
volatile (
"ldrt %0, %1" :
"=r" (result) :
"Q" (*addr) );
819 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __STRBT(uint8_t value, volatile uint8_t *addr)
821 __ASM
volatile (
"strbt %1, %0" :
"=Q" (*addr) :
"r" ((uint32_t)value) );
832 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __STRHT(uint16_t value, volatile uint16_t *addr)
834 __ASM
volatile (
"strht %1, %0" :
"=Q" (*addr) :
"r" ((uint32_t)value) );
845 __attribute__( ( always_inline ) ) __STATIC_INLINE
void __STRT(uint32_t value, volatile uint32_t *addr)
847 __ASM
volatile (
"strt %1, %0" :
"=Q" (*addr) :
"r" (value) );
853 #elif defined ( __ICCARM__ ) 855 #include <cmsis_iar.h> 858 #elif defined ( __TMS470__ ) 860 #include <cmsis_ccs.h> 863 #elif defined ( __TASKING__ ) 872 #elif defined ( __CSMC__ ) 874 #include <cmsis_csm.h> static volatile uint8_t addr
struct __attribute__((packed))