一种简单FIFO队列实现方式及事例

在写程序中,经常会遇到缓存队列问题,需将数据缓存到队列中,且队列中的数据不能被覆盖,然后另一个任务会从队列中依次读出所有数据(按照先进先出的原则FIFO)并进行处理。本章将实现一种数据大小固定的FIFO数据缓存队列,其本质思想是用2个空指针管理队列头和队列尾,还有一个队列计数用于统计队列数目。其程序代码如下所示:

头文件为 simpleQueue.h,其内容如下所示:

#ifndef __SIMPLE_QUEUE_H
#define __SIMPLE_QUEUE_H

typedef struct _simple_queue
{
    int queueWaiting;
    int queueItemSize;
    int queueSize;
    
    void *pHead;
    void *pTail;
    
    void *pData;
    
}SimpleQueue;

int simpleQueueInit(SimpleQueue *pSimpleQueue,int queueItemSize,int queueSize,void *pData);
int simpleQueueWaiting(SimpleQueue *pSimpleQueue,int *pQueueWaiting);
int simpleQueueItemPut(SimpleQueue *pSimpleQueue,void *pItem);
int simpleQueueItemGet(SimpleQueue *pSimpleQueue,void *pItem);

#endif
 

其simpleQueue.c代码如下所示:


#include "simpleQueue.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int simpleQueueInit(SimpleQueue *pSimpleQueue,int queueItemSize,int queueSize,void *pData)
{
    
    pSimpleQueue->queueWaiting = 0;
    pSimpleQueue->queueItemSize = queueItemSize;
    pSimpleQueue->queueSize = queueSize;
    pSimpleQueue->pData = pData;
    
    pSimpleQueue->pHead = pData;
    pSimpleQueue->pTail = pData;
    return 0;
}

int simpleQueueWaiting(SimpleQueue *pSimpleQueue,int *pQueueWaiting)
{
    *pQueueWaiting = pSimpleQueue->queueWaiting;    
    return 0;    
}

int simpleQueueItemPut(SimpleQueue *pSimpleQueue,void *pItem)
{
    if(pSimpleQueue->queueWaiting >= pSimpleQueue->queueSize)
        return -1;
    
    pSimpleQueue->queueWaiting ++;
    
    memcpy(pSimpleQueue->pTail,pItem,pSimpleQueue->queueItemSize); //put data
    if((uint32_t)pSimpleQueue->pTail >= (uint32_t)((uint32_t)pSimpleQueue->pData + pSimpleQueue->queueItemSize * (pSimpleQueue->queueSize - 1)))
    {
        pSimpleQueue->pTail = pSimpleQueue->pData;    
    }
    else
    {
        pSimpleQueue->pTail = (void *)((uint32_t)pSimpleQueue->pTail + pSimpleQueue->queueItemSize);
    }
    
    return 0;
}

int simpleQueueItemGet(SimpleQueue *pSimpleQueue,void *pItem)
{
    if(pSimpleQueue->queueWaiting == 0)
        return -1;
    
    pSimpleQueue->queueWaiting--;
    memcpy(pItem,pSimpleQueue->pHead,pSimpleQueue->queueItemSize); //get data
    
    if((uint32_t)pSimpleQueue->pHead  >= ((uint32_t)pSimpleQueue->pData + pSimpleQueue->queueItemSize * (pSimpleQueue->queueSize - 1)))
    {
        pSimpleQueue->pHead = pSimpleQueue->pData;    
    }
    else
    {
        pSimpleQueue->pHead = (void *)((uint32_t)pSimpleQueue->pHead + pSimpleQueue->queueItemSize);    
    }
      
    return 0;
}
 

        在使用本章编写的简单队列时,要先调用simpleQueueInit将队列和数据进行绑定,然后就可以调用simpleQueueItemPut和simpleQueueItemGet函数将数据往队列中存和读,可以调用simpleQueueWaiting来获取队列中队列子数目,其事例代码如下所示:

 

SimpleQueue iso15765_rxQueue;

char iso15765_rxData[30][32];

char data[32];

int queueDeepth = 0;

 

//初始化队列

simpleQueueInit(&iso15765_rxQueue,32,30,iso15765_rxData);

 

//往队列中存数据

simpleQueueItemPut(&iso15765_rxQueue,data);

 

simpleQueueWaiting(&iso15765_rxQueue,& queueDeepth);

//往队列中取数据

If(queueDeepth > 0)

{

simpleQueueItemGet(&iso15765_rxQueue,data);

}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值