123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #ifndef __QUEUE_H
- #define __QUEUE_H
- #include "stdio.h"
- #define MAX_QSIZE (60u) /* 最大队列长度 */
- typedef unsigned long long u64;
- 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];
- u64 u64_buf;
- } data;
- } pdu_tag, *p_pdu_tag;
- typedef struct
- {
- uint8_t buf[8];
- uint32_t can_id;
- } CanData_TypeDef;
- typedef struct
- {
- uint16_t head;
- uint16_t tail;
- uint16_t count;
- pdu_tag can_message[MAX_QSIZE];
- } can_queue_tag, *p_can_queue_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)
- void queue_init(p_can_queue_tag); // 初始化队列
- uint8_t queue_empty(p_can_queue_tag); // 查询队列是否为空
- uint8_t queue_full(p_can_queue_tag);
- uint8_t get_head(can_queue_tag *p_queue, pdu_tag *data); // 获取对头数据
- QUEUE_STATUS en_queue(p_can_queue_tag, pdu_tag); // 队列插入数据
- QUEUE_STATUS de_queue(p_can_queue_tag, pdu_tag);
- #endif
|