9 #include <util/atomic.h>
17 #ifndef _CORTEX_M3_ATOMIC_H_
18 #define _CORTEX_M3_ATOMIC_H_
20 static __inline__ uint32_t __get_primask(
void) \
21 { uint32_t primask = 0; \
22 __asm__
volatile (
"MRS %[result], PRIMASK\n\t":[result]
"=r"(primask)::); \
25 static __inline__
void __set_primask(uint32_t setval) \
26 { __asm__
volatile (
"MSR PRIMASK, %[value]\n\t""dmb\n\t""dsb\n\t""isb\n\t"::[value]
"r"(setval):); \
27 __asm__
volatile (
"" :::
"memory");}
29 static __inline__ uint32_t __iSeiRetVal(
void) \
30 { __asm__
volatile (
"CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
31 __asm__
volatile (
"" :::
"memory");
return 1; }
33 static __inline__ uint32_t __iCliRetVal(
void) \
34 { __asm__
volatile (
"CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
35 __asm__
volatile (
"" :::
"memory");
return 1; }
37 static __inline__
void __iSeiParam(
const uint32_t *__s) \
38 { __asm__
volatile (
"CPSIE i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
39 __asm__
volatile (
"" :::
"memory"); (void)__s; }
41 static __inline__
void __iCliParam(
const uint32_t *__s) \
42 { __asm__
volatile (
"CPSID i\n\t""dmb\n\t""dsb\n\t""isb\n\t"); \
43 __asm__
volatile (
"" :::
"memory"); (void)__s; }
45 static __inline__
void __iRestore(
const uint32_t *__s) \
46 { __set_primask(*__s); __asm__
volatile (
"dmb\n\t""dsb\n\t""isb\n\t"); \
47 __asm__
volatile (
"" :::
"memory"); }
50 #define ATOMIC_BLOCK(type) \
51 for ( type, __ToDo = __iCliRetVal(); __ToDo ; __ToDo = 0 )
53 #define ATOMIC_RESTORESTATE \
54 uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask()
56 #define ATOMIC_FORCEON \
57 uint32_t primask_save __attribute__((__cleanup__(__iSeiParam))) = 0
59 #define NONATOMIC_BLOCK(type) \
60 for ( type, __ToDo = __iSeiRetVal(); __ToDo ; __ToDo = 0 )
62 #define NONATOMIC_RESTORESTATE \
63 uint32_t primask_save __attribute__((__cleanup__(__iRestore))) = __get_primask()
65 #define NONATOMIC_FORCEOFF \
66 uint32_t primask_save __attribute__((__cleanup__(__iCliParam))) = 0
75 #define ATOMIC_BLOCK(type)