在写程序中,经常会遇到缓存队列问题,需将数据缓存到队列中,且队列中的数据不能被覆盖,然后另一个任务会从队列中依次读出所有数据(按照先进先出的原则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);
}