C Microkernel Realtime eXecutive
Realtime Operating System for Cortex-M based microcontrollers
 
Loading...
Searching...
No Matches
queue.h
1#pragma once
2
23#include <stdbool.h>
24#include <stdint.h>
25
26#define QUEUE_LENGTH 256
27
36struct Queue {
37 volatile uint16_t write_cursor;
38 volatile uint16_t read_cursor;
39 volatile bool empty;
40 uint8_t depth;
41 uint8_t item_size;
42 unsigned char content[];
43};
44
45#pragma GCC diagnostic push
46/* Ignore warning about incorrect VLA use.
47 * The code is not portable outside GCC but works as designed */
48#pragma GCC diagnostic ignored "-Wpedantic"
52struct BasicQueue {
53 union {
54 struct Queue q;
55 unsigned char buffer[sizeof(struct Queue) + QUEUE_LENGTH];
56 };
57};
58
66#define STATIC_QUEUE_T(name, size) \
67typedef struct {\
68 union {\
69 struct Queue q;\
70 unsigned char buffer[sizeof(struct Queue) + size];\
71 };\
72} name
73#pragma GCC diagnostic pop
74
75//#define unpack_queue(__q) _Generic((__q), struct Queue * : (__q), default: ((__q)->q))
76
88bool queue_init(struct Queue * queue, uint8_t depth, uint8_t item_size);
89
102bool queue_send(struct Queue * queue, const void * data);
103
119bool queue_send_silent(struct Queue * queue, const void * data);
120
121
137bool queue_receive_timeout(struct Queue * queue, void * data, uint32_t timeout_us);
138
150static inline bool queue_receive(struct Queue * queue, void * data)
151{
152 return queue_receive_timeout(queue, data, 0);
153}
154
160bool queue_empty(struct Queue * queue);
161
167bool queue_full(struct Queue * queue);
168
#define QUEUE_LENGTH
Definition queue.h:26
bool queue_send_silent(struct Queue *queue, const void *data)
Fills queue without notifying receivers.
Definition queue.c:7
bool queue_empty(struct Queue *queue)
Returns queue status.
Definition queue.c:72
static bool queue_receive(struct Queue *queue, void *data)
Receive data from queue.
Definition queue.h:150
bool queue_receive_timeout(struct Queue *queue, void *data, uint32_t timeout_us)
Receive data from queue with timeout.
Definition queue.c:38
bool queue_init(struct Queue *queue, uint8_t depth, uint8_t item_size)
Initialize queue structure.
Definition queue.c:83
bool queue_send(struct Queue *queue, const void *data)
Send data via the queue.
Definition queue.c:28
bool queue_full(struct Queue *queue)
Tell if queue is already full.
Definition queue.c:77
Queue with 256 bytes of storage preallocated.
Definition queue.h:52
unsigned char buffer[sizeof(struct Queue)+QUEUE_LENGTH]
Definition queue.h:55
struct Queue q
Definition queue.h:54
Generic queue structure.
Definition queue.h:36
volatile bool empty
Definition queue.h:39
uint8_t depth
Definition queue.h:40
unsigned char content[]
Definition queue.h:42
volatile uint16_t read_cursor
Definition queue.h:38
volatile uint16_t write_cursor
Definition queue.h:37
uint8_t item_size
Definition queue.h:41