ACwing FC firmware
STM32WB55: attitude IEKF, altitude Kalman filter, flight core, protocol v2
Loading...
Searching...
No Matches
spsc.h
Go to the documentation of this file.
1
9#ifndef SPSC_H
10#define SPSC_H
11
12#include <stdint.h>
13#include <string.h>
14
15#if defined(__arm__)
16#define SPSC_BARRIER() __asm volatile ("dmb" ::: "memory")
17#else
18#define SPSC_BARRIER() __sync_synchronize()
19#endif
20
21typedef struct {
22 volatile uint32_t head;
23 volatile uint32_t tail;
24 uint32_t mask;
25 uint32_t item;
26 uint8_t *buf;
27} spsc_t;
28
29#define SPSC_DEFINE(name, type, n) \
30 static uint8_t name##_buf[(n) * sizeof(type)]; \
31 static spsc_t name = { 0u, 0u, (n) - 1u, sizeof(type), name##_buf }
32
33static inline void spsc_reset(spsc_t *q) { q->head = q->tail = 0u; }
34
35static inline int spsc_push(spsc_t *q, const void *it)
36{
37 const uint32_t h = q->head;
38 if (h - q->tail > q->mask) return -1;
39 memcpy(&q->buf[(h & q->mask) * q->item], it, q->item);
41 q->head = h + 1u;
42 return 0;
43}
44
45static inline int spsc_pop(spsc_t *q, void *it)
46{
47 const uint32_t t = q->tail;
48 if (q->head == t) return 0;
50 memcpy(it, &q->buf[(t & q->mask) * q->item], q->item);
52 q->tail = t + 1u;
53 return 1;
54}
55
56static inline uint32_t spsc_count(const spsc_t *q) { return q->head - q->tail; }
57
58#endif /* SPSC_H */
#define SPSC_BARRIER()
Definition spsc.h:18
static int spsc_push(spsc_t *q, const void *it)
Definition spsc.h:35
static void spsc_reset(spsc_t *q)
Definition spsc.h:33
static uint32_t spsc_count(const spsc_t *q)
Definition spsc.h:56
static int spsc_pop(spsc_t *q, void *it)
Definition spsc.h:45
Definition spsc.h:21
volatile uint32_t tail
written by the consumer only
Definition spsc.h:23
uint32_t mask
N - 1.
Definition spsc.h:24
uint32_t item
sizeof item
Definition spsc.h:25
volatile uint32_t head
written by the producer only
Definition spsc.h:22
uint8_t * buf
Definition spsc.h:26