运用场景:接收或发送数据缓存
具体程序实现如下:
#define CIRQUEUE_LEN 200
typedef unsigned char u8;
typedef struct{
u8 buf[CIRQUEUE_LEN];
volatile u8 writeFull:1;
volatile u8 writeOverFlow:1;
volatile u8 readOverFlow:1;
u8 res:5;
u8 waitReadLen;
u8 *pRead;
u8 *pWrite;
}CIRQUEUE;
static CIRQUEUE cirQueue;
void cqInit(void)
{
cirQueue.pRead = cirQueue.buf;
cirQueue.pWrite = cirQueue.buf;
cirQueue.waitReadLen = 0;
cirQueue.readOverFlow = 0;
cirQueue.writeOverFlow = 0;
cirQueue.writeFull = 0;
}
void checkFull(void)
{
if((cirQueue.pWrite == cirQueue.pRead) && cirQueue.writeOverFlow)
{
cirQueue.writeFull = 1;
}
else
{
cirQueue.writeFull = 0;
}
}
void checkLen(void)
{
if(cirQueue.writeFull)
{
cirQueue.waitReadLen = CIRQUEUE_LEN;
return;
}
cirQueue.waitReadLen = (cirQueue.pRead <= cirQueue.pWrite) ? (u8)(cirQueue.pWrite - cirQueue.pRead) : (u8)(cirQueue.pRead - cirQueue.pWrite + CIRQUEUE_LEN);
}
int cqRead(u8 *rByte)
{
checkLen();
if(!cirQueue.waitReadLen)
{
return 0;
}
*rByte = *cirQueue.pRead++;
cirQueue.writeFull = 0;
if(cirQueue.pRead > (cirQueue.buf + CIRQUEUE_LEN - 1))
{
cirQueue.pRead = cirQueue.buf;
cirQueue.writeOverFlow = 0;
}
return 1;
}
int cqWrite(u8 *wByte)
{
checkFull();
if(cirQueue.writeFull)
{
return 0;
}
*cirQueue.pWrite++ = *wByte;
if(cirQueue.pWrite > (cirQueue.buf + CIRQUEUE_LEN - 1))
{
cirQueue.pWrite = cirQueue.buf;
cirQueue.writeOverFlow = 1;
}
return 1;
}