本帖最后由 lxyppc 于 2010-1-6 16:48 编辑
这个是我经常用的方式,对两个索引的改变分别需要一个自增(++)的操作,当RING_SIZE为2^n时,取余会被编译成一个&运算,mCount可以由两个索引的关系得到
缓冲满了之后就不能再向里面写数据,新来数据会丢失掉。也可以继续写,但是要同时更新pOut的位置
typedef unsigned char Ele_t;
typedef unsigned int size_t;
typedef enum
{
OK = 1,
Empty = !OK,
Full = !OK,
Fail = !OK,
}Result_t;
#define RING_SIZE 19
Ele_t ringBuffer[RING_SIZE] = {0};
struct
{
Ele_t* pBuffer;
size_t pIn;
size_t pOut;
}Ring = {
.pIn = 0,
.pOut = 0,
.pBuffer = ringBuffer,
};
Result_t PushRing(Ele_t ele)
{
if( (Ring.pIn%RING_SIZE) == (Ring.pOut%RING_SIZE) ){
if(Ring.pIn != Ring.pOut){
return Full;
}
}
Ring.pBuffer[Ring.pIn%RING_SIZE] = ele;
Ring.pIn++;
return OK;
}
Result_t PopRing(Ele_t* ele)
{
if( (Ring.pIn%RING_SIZE) == (Ring.pOut%RING_SIZE) ){
if(Ring.pIn == Ring.pOut){
return Empty;
}
}
*ele = Ring.pBuffer[Ring.pOut%RING_SIZE];
Ring.pOut++;
return OK;
}
size_t GetRingCount()
{
size_t size = (Ring.pIn - Ring.pOut) % RING_SIZE;
if( (size == 0) && (Ring.pIn != Ring.pOut) ){
size = RING_SIZE;
}
return size;
}
void PurgeRing()
{
Ring.pIn = Ring.pOut = 0;
}
|