12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #ifndef __QUEUE_H
- #define __QUEUE_H
- #include "stdio.h"
- typedef struct
- {
- struct
- {
- uint8_t ide;
- uint8_t rtr;
- uint8_t dlc;
- } reg;
- union
- {
- uint32_t r;
- struct
- {
- uint8_t sa : 8;
- uint8_t ps : 8;
- uint8_t pf : 8;
- uint8_t dp : 1;
- uint8_t r : 1;
- uint8_t p : 3;
- } b;
- } id;
- union
- {
- uint8_t u8_buf[8];
- uint16_t u16_buf[4];
- uint32_t u32_buf[2];
- uint64_t u64_buf;
- } data;
- } pdu_tag, *p_pdu_tag;
- typedef enum
- {
- Q_OK,
- Q_ERR,
- Q_FULL,
- Q_EMPTY,
- } QUEUE_STATUS;
- #define queue_entry(type, size) \
- struct \
- { \
- uint8_t head; \
- uint8_t tail; \
- uint8_t count; \
- type message[size]; \
- }
- #define queue_init(name) \
- { \
- (name)->head = (name)->tail = 0; \
- (name)->count = 0; \
- }
- /* List functions. */
- #define queue_empty(name) ((name)->count == 0)
- #define queue_max(name) ((sizeof((name)->message)) / (sizeof((name)->message[0])))
- #define queue_full(name) ((name)->count == ((sizeof((name)->message)) / (sizeof((name)->message[0]))))
- #define en_queue(name, field, ret) \
- do \
- { \
- if (queue_full(name)) \
- { \
- ret = Q_FULL; \
- } \
- else \
- { \
- (name)->count++; \
- (name)->message[(name)->head] = field; \
- (name)->head = ((name)->head + 1) % queue_max(name); \
- ret = Q_OK; \
- } \
- } while (0)
- #define de_queue(name, field, ret) \
- do \
- { \
- if (queue_empty(name)) \
- { \
- ret = Q_EMPTY; \
- } \
- else \
- { \
- field = (name)->message[(name)->tail]; \
- (name)->tail = ((name)->tail + 1) % queue_max(name); \
- (name)->count--; \
- ret = Q_OK; \
- } \
- } while (0)
- #endif
|