循环队列-队列的顺序表示和实现2

/******************************************************************************/
// 循环队列-队列的顺序表示和实现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;
}

你可能感兴趣的:(C语言,循环队列,FIFO,环形队列)