Đây là gợi ý về 1 FIFO vòng, tức không cần reset các index, rdCount và wrCount sẽ tự động quay vòng giá trị trên Buffer nếu FIFO chưa đầy.
Code:
#define BUFFER_SIZE (unsigned int)1024
#define BUFFER_SIZE_MASK (unsigned int)(BUFFER_SIZE-1) //1023 = 0x3FF
#ifndef BYTE
typedef unsigned char BYTE;
#endif
unsigned int wrCount=0;
unsigned int rdCount=0;
BYTE fifo_buff[BUFFER_SIZE];
void FIFO_Init()
{
rdCount=wrCount; //With any value -> FIFO Empty
}
BYTE FIFO_Full()
{
return (((wrCount+1)&BUFFER_SIZE_MASK)==rdCount);
}
BYTE FIFO_Empty()
{
return (rdCount==wrCount);
}
unsigned int FIFO_Size()
{
return ((wrCount-rdCount)&BUFFER_SIZE_MASK);
}
void FIFO_Push(BYTE data)
{
fifo_buff[wrCount]=data;
wrCount++;
wrCount&=BUFFER_SIZE_MASK;
}
BYTE FIFO_Pop()
{
BYTE ret;
ret=fifo_buff[rdCount];
rdCount++;
rdCount&=BUFFER_SIZE_MASK;
return (ret);
}
FIFO_Init();
...
if(!FIFO_Full()) FIFO_Push('A');
...
if(!FIFO_Empty()) FIFO_Pop();
...
printf("Current Data Size in FIFO=%d",FIFO_Size());
...