环形队列与读写指针管理
struct:
typedef struct __Buffer_Info
{
u16 read;
u16 write;
u16 length;
u8 * Charbuffer;
}Buffer_Info;
API:
void Buff_Init(Buffer_Info *buf, u8 * buffaddr, u16 len)
{
buf->read = 0;
buf->write = 0;
buf->length = len;
buf->Charbuffer = buffaddr;
}
```/*读写指针在同一个位置队列空*/
```c
bool Buff_IsEmpty(Buffer_Info *buf)
{
return (Bread(buf) == Bwrite(buf));
}
```/***为了与空的状态区分,环形队列满的状态下实际还有一个空位(可写)***/
```c
bool Buff_IsFull(Buffer_Info *buf)
{
return (Bwrite(buff) + 1 == Bread(buff));
}
void Buff_push(Buffer_Info *buf, u8 *ch)
{
if(!Buff_IsFull(buf))
return;
Buffwrite(buf) = *ch;
Bwrite(buf)++;
if(Bwrite(buf) >= Blength(buf))
Bwrite(buf)%=Blength(buf);
}
void Buff_pop(Buffer_Info *buf, u8 *ch)
{
if(!Buff_IsEmpty(buf))
return;
*ch = Buffread(buf);
Bread(buf)++;
if(Bread(buf) >= Blength(buf))
Bread(buf)%=Blength(buf);
}
/* 可写*/
u16 Buff_GetRoomLeft(Buffer_Info *buf)
{
u16 roomleft;
if(Bread(buf) <= Bwrite(buf))
roomleft = Blength(buf) - Bwrite(buf) + Bread(buf) -1;
else
roomleft = Bread(buf) - Bwrite(buf) -1;
return roomleft;
}
/*可读*/
u16 Buff_GetRoomAvail(Buffer_Info *buf)
{
u16 roomavail;
if(Bread(buf) <= Bwrite(buf))
roomavail= Bwrite(buf) - Bread(buf);
else
roomavail= Blength(buf) - Bread(buf) + Bwrite(buf);
return roomavail;
}