/*
 * ring_queue.h
 *
 *  Created on: 2024年6月21日
 *      Author: psx
 */

#ifndef DRIVERS_RINGQUEUE_RING_QUEUE2_H_
#define DRIVERS_RINGQUEUE_RING_QUEUE2_H_


//#define RING_QUEUE_DEBUG //定义本宏会打印RingQueue的调试信息

//typedef unsigned char RQ_ElementType2;//元素类型
typedef uint16_t RQ_ElementType2;//元素类型


typedef struct _ring_queue2
{
    RQ_ElementType2 *elems;
    int size;
    volatile int front, rear;
}RingQueue2;

//初始化队列,需传入保存队列状态的结构q，队列使用的buffer和buffer大小
int InitRingQueue2(RingQueue2 *q, RQ_ElementType2 *buff, int size);

#define RingQueueFull2(q) (((q)->rear+1) % (q)->size == (q)->front)
#define RingQueueEmpty2(q) ((q)->front == (q)->rear)

//遍历队列,
//消费者使用，故对生产者可能修改的rear先读取缓存
int ShowRingQueue2(RingQueue2 *q);

//向队尾插入元素e
int InRingQueue2(RingQueue2 *q,RQ_ElementType2 e);

//从队首删除元素
int OutRingQueue2(RingQueue2 *q, RQ_ElementType2 *e);

//队列中的元素个数
int RingQueueLength2(RingQueue2 *q);


#endif /* DRIVERS_RINGQUEUE_RING_QUEUE_H_ */
