使用在Verilog及MCU上用的。
在verilog中Buffer管理以2的指數為大小比較好管理。因為運算上方便,只需要用AND取得餘數。
在MCU上則是用在中斷及主程式之間的管理。
程式如下:
#define BUF_SIZE 0x8
#define SIZE_MASK (BUF_SIZE-1)
int buffer[BUF_SIZE];
unsigned char fifo_wr_count, fifo_rd_count;
int fifo_reset(void)
{
fifo_wr_count = 0;
fifo_rd_count = 0;
return -1;
}
int fifo_write(int data)
{
unsigned int dist;
dist = (unsigned char)(fifo_wr_count - fifo_rd_count);
if ( dist >= BUF_SIZE)
{
return 0;
}
else
{
buffer[(fifo_wr_count&SIZE_MASK)] = data;
fifo_wr_count++;
return -1;
}
}
int fifo_read(int *data)
{
if ( fifo_rd_count == fifo_wr_count )
{
return 0;
}
else
{
*data = buffer[(fifo_rd_count&SIZE_MASK)];
fifo_rd_count++;
return -1;
}
}
沒有留言:
張貼留言