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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值