参考内容
队列数据类型结构体
typedef struct
{
u16 Front, Rear;
u16 Size;
u8 * pData;
}xSuper_RingQueue_TypeDef;
一、队列初始化

void vRingQueue_Init(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 size)
{
pQueue->Front = pQueue->Rear = 0;
pQueue->Size = size;
pQueue->pData = pData;
}
二、判断队列是否为空

u8 xRingQueue_IsEmpty(xSuper_RingQueue_TypeDef * pQueue)
{
if (pQueue->Front == pQueue->Rear) return 1;
else return 0;
}
三、判断队列是否已满

u8 xRingQueue_IsFull(xSuper_RingQueue_TypeDef * pQueue)
{
if (((pQueue->Rear + 1) % pQueue->Size) == pQueue->Front) return 1;
else return 0;
}
四、数据入队过程

u16 xRingQueue_GetCount(xSuper_RingQueue_TypeDef * pQueue)
{
return ((pQueue->Rear - pQueue->Front + pQueue->Size) % pQueue->Size);
}
static void vSuper_RingQueue_EnterByte(xSuper_RingQueue_TypeDef * pQueue, u8 data)
{
pQueue->pData[pQueue->Rear] = data;
pQueue->Rear = (pQueue->Rear + 1) % pQueue->Size;
}
u8 xRingQueue_EnterByte(xSuper_RingQueue_TypeDef * pQueue, u8 data)
{
if (xRingQueue_IsFull(pQueue)) return 1;
vSuper_RingQueue_EnterByte(pQueue, data);
return 0;
}
static u16 xSuper_RingQueue_RearBeforIndex(xSuper_RingQueue_TypeDef * pQueue)
{
return ((pQueue->Rear - 1 + pQueue->Size) % pQueue->Size);
}
void vRingQueue_EnterByte_Force(xSuper_RingQueue_TypeDef * pQueue, u8 data)
{
u16 i = 0;
if (xRingQueue_IsFull(pQueue))
{
i = xSuper_RingQueue_RearBeforIndex(pQueue);
pQueue->pData[i] = data;
}
else
{
vSuper_RingQueue_EnterByte(pQueue, data);
}
}
u16 xRingQueue_EnterData(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 len)
{
u16 i = 0, num = 0, count = 0;
count = pQueue->Size - xRingQueue_GetCount(pQueue) - 1;
num = (len > count) ? count : len;
for (i = 0; i < num; i++)
{
vSuper_RingQueue_EnterByte(pQueue, pData[i]);
}
return num;
}
五、数据出队过程

static u8 xSuper_RingQueue_OutputByte(xSuper_RingQueue_TypeDef * pQueue)
{
u8 dat = 0;
dat = pQueue->pData[pQueue->Front];
pQueue->Front = (pQueue->Front + 1) % pQueue->Size;
return dat;
}
u8 xRingQueue_OutputByte(xSuper_RingQueue_TypeDef * pQueue)
{
if (xRingQueue_IsEmpty(pQueue)) return 0;
return xSuper_RingQueue_OutputByte(pQueue);
}
u16 xRingQueue_OutputData(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 len)
{
u16 i = 0, num = 0, count = 0;
count = xRingQueue_GetCount(pQueue);
num = (len > count) ? count : len;
for (i = 0; i < num; i++)
{
pData[i] = xSuper_RingQueue_OutputByte(pQueue);
}
return num;
}
六、其他函数
void vRingQueue_Clear(xSuper_RingQueue_TypeDef * pQueue)
{
pQueue->Front = pQueue->Rear = 0;
}
void vRingQueue_ShowInfo(xSuper_RingQueue_TypeDef * pQueue)
{
u16 i = 0, num = 0, front = 0;
u8 dat = 0;
num = xRingQueue_GetCount(pQueue);
front = pQueue->Front;
printf("-------------------------------------------------------------\r\n");
printf("Front:%-3u Rear:%-3u Size:%-3u Count:%u\r\n", pQueue->Front, pQueue->Rear, pQueue->Size, num);
printf("-------------------------Ring Queue Info---------------------\r\n");
dprintf(" 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F \r\n");
printf("--------------------------------------------------------------\r\n");
for (i = 0; i < num; i++)
{
if (i && ((i % 16) == 0)) printf("\r\n");
if ((i % 16) == 0) printf("0x%08X ", i);
dat = pQueue->pData[front];
front = (front + 1) % pQueue->Size;
printf("%02X ", dat);
}
printf("\r\n");
printf("--------------------------------------------------------------\r\n");
printf("\r\n\r\n\r\n");
}
七、函数汇总
void vRingQueue_Init(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 size);
void vRingQueue_EnterByte_Force(xSuper_RingQueue_TypeDef * pQueue, u8 data);
void vRingQueue_ShowInfo(xSuper_RingQueue_TypeDef * pQueue);
void vRingQueue_Clear(xSuper_RingQueue_TypeDef * pQueue);
u8 xRingQueue_EnterByte(xSuper_RingQueue_TypeDef * pQueue, u8 data);
u8 xRingQueue_OutputByte(xSuper_RingQueue_TypeDef * pQueue);
u8 xRingQueue_IsEmpty(xSuper_RingQueue_TypeDef * pQueue);
u8 xRingQueue_IsFull(xSuper_RingQueue_TypeDef * pQueue);
u16 xRingQueue_OutputData(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 len);
u16 xRingQueue_EnterData(xSuper_RingQueue_TypeDef * pQueue, u8 * pData, u16 len);
u16 xRingQueue_GetCount(xSuper_RingQueue_TypeDef * pQueue);