picofuse

atomic.h
Go to the documentation of this file.
1 
13 #pragma once
14 #include <stdbool.h>
15 #include <stdint.h>
16 
17 // Some embedded targets (e.g., ARMv6-M / RP2040) have no lock-free atomics.
18 // Clang then warns that builtins may not be lock-free (-Watomic-alignment).
19 // We accept the fallback and suppress the warning locally.
20 #if defined(__clang__)
21 #pragma clang diagnostic push
22 #pragma clang diagnostic ignored "-Watomic-alignment"
23 #endif
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
30 
39 typedef struct sys_atomic_t {
40  uint32_t value;
41 } sys_atomic_t __attribute__((aligned(4)));
42 
54 static inline void sys_atomic_init(sys_atomic_t *a, uint32_t initial) {
55  __atomic_store_n(&a->value, initial, __ATOMIC_RELAXED);
56 }
57 
69 static inline uint32_t sys_atomic_get(const sys_atomic_t *a) {
70  return __atomic_load_n(&a->value, __ATOMIC_RELAXED);
71 }
72 
83 static inline void sys_atomic_set(sys_atomic_t *a, uint32_t v) {
84  __atomic_store_n(&a->value, v, __ATOMIC_RELAXED);
85 }
86 
96 static inline uint32_t sys_atomic_inc(sys_atomic_t *a) {
97  return __atomic_add_fetch(&a->value, 1, __ATOMIC_RELAXED);
98 }
99 
109 static inline uint32_t sys_atomic_dec(sys_atomic_t *a) {
110  return __atomic_sub_fetch(&a->value, 1, __ATOMIC_RELAXED);
111 }
112 
122 static inline void sys_atomic_set_bits(sys_atomic_t *a, uint32_t mask) {
123  (void)__atomic_fetch_or(&a->value, mask, __ATOMIC_RELAXED);
124 }
125 
136 static inline void sys_atomic_clear_bits(sys_atomic_t *a, uint32_t mask) {
137  (void)__atomic_fetch_and(&a->value, ~mask, __ATOMIC_RELAXED);
138 }
139 
141 
142 #if defined(__clang__)
143 #pragma clang diagnostic pop
144 #endif
145 
146 #ifdef __cplusplus
147 }
148 #endif
static void sys_atomic_init(sys_atomic_t *a, uint32_t initial)
Initialize an atomic with an initial value.
Definition: atomic.h:54
uint32_t value
Raw atomic storage; use sys_atomic_* APIs instead.
Definition: atomic.h:40
static uint32_t sys_atomic_inc(sys_atomic_t *a)
Atomically increment and return the new value.
Definition: atomic.h:96
static uint32_t sys_atomic_get(const sys_atomic_t *a)
Load the current value atomically.
Definition: atomic.h:69
static void sys_atomic_clear_bits(sys_atomic_t *a, uint32_t mask)
Atomically clear bits (AND with ~mask).
Definition: atomic.h:136
static uint32_t sys_atomic_dec(sys_atomic_t *a)
Atomically decrement and return the new value.
Definition: atomic.h:109
static void sys_atomic_set(sys_atomic_t *a, uint32_t v)
Store a new value atomically.
Definition: atomic.h:83
Underlying atomic uint32_t value.
Definition: atomic.h:39
static void sys_atomic_set_bits(sys_atomic_t *a, uint32_t mask)
Atomically set bits (OR with mask).
Definition: atomic.h:122