30天自制操作系统开发笔记——FIFO缓冲区制作
为了能够更好的响应中断,要制作缓冲区存储外部设备传送过来的数据,为了能让缓冲区更具有灵活性并且能够充分利用缓冲区,首先要制作成一般样式的缓冲区,可以自由指定大小和起始位置,要能实现循环的读和写,所以需要利用指针来指定缓冲区的起始位置:
struct FIFO8 {
unsigned char *buf;
int p,q,size,free,flags;/*分别表示下一个数据写入位置,下一个数据读取位置,缓冲区大小,以及空闲缓冲区的数量*/
};
buf指定的是缓冲区的起始地址
缓冲区的初始化:
void fifo8_init(struct FIFO8 *fifo,int size,unsigned char *buf)
{
fifo->buf=buf;
fifo->size=size;
fifo->free=size;
fifo->flags=0;
fifo->p=0;
fifo->q=0;
};
从缓冲区中读取数据:
int fifo8_get(struct FIFO8 *fifo)
{
int data;
if(fifo->free==fifo->size)
return -1;
data=fifo->buf[fifo->q];
fifo->q++;
if(fifo->q==fifo->size)
fifo->q=0;
fifo->free++;
return data;
}
往缓冲区中添加数据:
int fifo8_put(struct FIFO8 *fifo,unsigned char data)
{
if(fifo->free==0)
{
fifo->flags|=FLAG_OVERRUN;
return -1;
}
fifo->buf[fifo->p]=data;
fifo->p++;
if(fifo->p==fifo->size)
fifo->p=0;
fifo->free--;
return 0;
}
查看缓冲区的状态:
int fifo8_status(struct FIFO8 *fifo)
{
return fifo->size-fifo->free;
}