/******************************************************************************/
// 循环队列-队列的顺序表示和实现2
// linux内核循环队列kfifo思想改编,性能超级高,FIFO性能优化的关键点:
// 1.队列大小为2的幂是为了使x % M == x & (M-1) 为真,位与运算的效率要比求余数
// 高很多
// 2.队头head和队尾tail必须是无符号的整数,这样可以使tail - head永远是队列的
// 长度,不管它们是否溢出
/******************************************************************************/
#define Queue_SIZE ((uint32_t)0x00000080) // 队列的大小必须是2的幂
#define Queue_SUCCESS ((uint32_t)0x00000000)
#define Queue_OVERFLOW ((uint32_t)0x00000001)
#define Queue_EMPTY ((uint32_t)0x00000002)
typedef struct
{
uint32_t *buf; //队列的起始地址
uint32_t head; //读出数据的位置
uint32_t tail; //写下一个数据的位置
uint32_t size; //队列的大小必须是2的幂
} Queue_TypeDef;
static uint32_t gQueue_Buf[Queue_SIZE];
void Queue_Init(Queue_TypeDef *Queue)
{
Queue->buf = gQueue_Buf;
Queue->tail = 0;
Queue->head = 0;
Queue->size = Queue_SIZE;
}
uint32_t Queue_Put(Queue_TypeDef *Queue, uint32_t data)
{
if (Queue->tail - Queue->head == Queue_SIZE)
{
return Queue_OVERFLOW;
}
Queue->buf[Queue->tail & (Queue->size - 1)] = data;
Queue->tail++;
return Queue_SUCCESS;
}
uint32_t Queue_Get(Queue_TypeDef *Queue)
{
uint32_t data;
if (Queue->tail == Queue->head)
{
return Queue_EMPTY;
}
data = Queue->buf[Queue->head & (Queue->size - 1)];
Queue->head++;
return data;
}
void Queue_Empty(Queue_TypeDef *Queue)
{
Queue->tail = 0;
Queue->head = 0;
}
// 循环队列-队列的顺序表示和实现2
// linux内核循环队列kfifo思想改编,性能超级高,FIFO性能优化的关键点:
// 1.队列大小为2的幂是为了使x % M == x & (M-1) 为真,位与运算的效率要比求余数
// 高很多
// 2.队头head和队尾tail必须是无符号的整数,这样可以使tail - head永远是队列的
// 长度,不管它们是否溢出
/******************************************************************************/
#define Queue_SIZE ((uint32_t)0x00000080) // 队列的大小必须是2的幂
#define Queue_SUCCESS ((uint32_t)0x00000000)
#define Queue_OVERFLOW ((uint32_t)0x00000001)
#define Queue_EMPTY ((uint32_t)0x00000002)
typedef struct
{
uint32_t *buf; //队列的起始地址
uint32_t head; //读出数据的位置
uint32_t tail; //写下一个数据的位置
uint32_t size; //队列的大小必须是2的幂
} Queue_TypeDef;
static uint32_t gQueue_Buf[Queue_SIZE];
void Queue_Init(Queue_TypeDef *Queue)
{
Queue->buf = gQueue_Buf;
Queue->tail = 0;
Queue->head = 0;
Queue->size = Queue_SIZE;
}
uint32_t Queue_Put(Queue_TypeDef *Queue, uint32_t data)
{
if (Queue->tail - Queue->head == Queue_SIZE)
{
return Queue_OVERFLOW;
}
Queue->buf[Queue->tail & (Queue->size - 1)] = data;
Queue->tail++;
return Queue_SUCCESS;
}
uint32_t Queue_Get(Queue_TypeDef *Queue)
{
uint32_t data;
if (Queue->tail == Queue->head)
{
return Queue_EMPTY;
}
data = Queue->buf[Queue->head & (Queue->size - 1)];
Queue->head++;
return data;
}
void Queue_Empty(Queue_TypeDef *Queue)
{
Queue->tail = 0;
Queue->head = 0;
}