View Single Post
Old 20-11-2009, 09:08 AM   #7
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
Đâ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());
...
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn