4 #define RINGBUFFER(name, size) uint8_t name[(size)+4] = { size, 0, 0, 0 }
6 static inline uint8_t ringbuffer_fill(const uint8_t *buffer)
11 static inline uint8_t ringbuffer_space(const uint8_t *buffer)
13 return buffer[0]-buffer[1];
16 static inline void ringbuffer_push(uint8_t *buffer, uint8_t value)
18 const uint8_t size = buffer[0];
19 uint8_t head = buffer[2];
20 buffer[4+head++] = value;
27 static inline void ringbuffer_blocking_push(uint8_t *buffer, uint8_t value)
29 const volatile uint8_t *fill = buffer+1;
30 while(*fill>=buffer[0]) ;
31 ringbuffer_push(buffer, value);
34 static inline uint8_t ringbuffer_pop(uint8_t *buffer)
36 const uint8_t size = buffer[0];
37 uint8_t tail = buffer[3];
38 uint8_t value = buffer[4+tail++];
46 static inline uint8_t rinbuffer_blocking_pop(uint8_t *buffer)
48 const volatile uint8_t *fill = buffer+1;
50 return ringbuffer_pop(buffer);