#include "queue.h" /// front ... rear 数据方向 -> /* 队列的顺序存储结构(循环队列) */ can_queue_tag can_tx_queue; can_queue_tag can_rx_queue; /**************************************************** * 函 数 名:init_queue * 函数功能:初始化队列 * 入口参数:无 * 说 明: ****************************************************/ void queue_init(p_can_queue_tag p_queue) { /* 构造一个空队列Q */ p_queue->head = p_queue->tail = 0; /*空队列*/ p_queue->count = 0; } /**************************************************** * 函 数 名:is_queue_empty * 函数功能:查询队列是否为空 * 入口参数:Q 队列 * 说 明:空队列,返回SUCCESS;否则返回ERROR ****************************************************/ uint8_t queue_empty(p_can_queue_tag p_queue) { /* 若*/ return p_queue->count == 0; } uint8_t queue_full(p_can_queue_tag p_queue) { /* 若*/ return p_queue->count == MAX_QSIZE; } /**************************************************** * 函 数 名:queue_length * 函数功能:初始化长度 * 入口参数:Q 队列 * 说 明: ****************************************************/ uint16_t queue_length(can_queue_tag p_queue) { /* 返回Q的元素个数,即队列的长度 */ return (p_queue.tail - p_queue.head + MAX_QSIZE) % MAX_QSIZE; } /**************************************************** * 函 数 名:get_head * 函数功能:获取对头数据 * 入口参数:Q 队列 * 说 明: ****************************************************/ uint8_t get_head( can_queue_tag *p_queue, pdu_tag *e) { /* 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR*/ if (p_queue->head == p_queue->tail) /* 队列空 */ return Q_ERR; *e = p_queue->can_message[p_queue->head]; p_queue->head = (p_queue->head + 1) % MAX_QSIZE; return Q_OK; } /**************************************************** * 函 数 名:insert_queue * 函数功能:队列插入数据 * 入口参数:Q 待插入队列 e 待插入数据 * 说 明: ****************************************************/ QUEUE_STATUS en_queue(p_can_queue_tag p_queue, pdu_tag data) { if (queue_full(p_queue)) return Q_FULL; p_queue->count++; p_queue->can_message[p_queue->head] = data; p_queue->head = (p_queue->head + 1) % MAX_QSIZE; return Q_OK; /* 插入元素e为Q的新的队尾元素 */ // if ((p_queue->tail + 1) % MAX_QSIZE == p_queue->head) /* 队列满 */ // return ERROR; // p_queue->can_message[p_queue->tail] = e; // p_queue->tail = (p_queue->tail + 1) % MAX_QSIZE; // return SUCCESS; } QUEUE_STATUS de_queue(p_can_queue_tag p_queue, pdu_tag data) { /* 插入元素e为Q的新的队尾元素 */ // if ((p_queue->tail + 1) % MAX_QSIZE == p_queue->head) /* 队列满 */ // return ERROR; // p_queue->can_message[p_queue->tail] = e; // p_queue->tail = (p_queue->tail + 1) % MAX_QSIZE; // return SUCCESS; if (queue_empty(p_queue)) return Q_EMPTY; data = p_queue->can_message[p_queue->tail]; p_queue->tail = (p_queue->tail + 1) % MAX_QSIZE; p_queue->count--; return Q_OK; }