環(huán)形存儲(chǔ)原理:(用一個(gè)類來(lái)說(shuō)明)環(huán)形buff是先進(jìn)先出,有兩個(gè)指針,一個(gè)指示在尾部放數(shù)據(jù),一個(gè)指示在首部取出數(shù)據(jù),
最開(kāi)始都在0的位置,比如用在串口接受一個(gè)數(shù)據(jù)時(shí),并不馬上處理,用的時(shí)候再取出。
class RingBuffer
{
private:
uint8_t* Buffer; //類似一個(gè)數(shù)組的指針
uint16_t Size; //數(shù)據(jù)大小
uint16_t BeginPos; //頭部指針,實(shí)際并不是指針類型,算是一個(gè)標(biāo)記
uint16_t EndPos; //尾部指針,實(shí)際并不是指針類型,算是一個(gè)標(biāo)記
uint8_t m_IsFull; //buffer是否滿了
public:
void putchar(char ch) //存一個(gè)數(shù)據(jù)
{
Buffer[EndPos] = ch; //存
EndPos++; //指針加一
if(EndPos>Size) //存的指針超過(guò)數(shù)組size,則返回0位置
{EndPos=0;}
}
uint8_t getchar(void) //取一個(gè)數(shù)據(jù)
{
uint8_t ch;
ch = Buffer[BeginPos]; //取
BeginPos++; //指針加一
return ch;
}
void Ringisfull() //判斷環(huán)形buffer是否滿了
{
if (BeginPos == EndPos) //在最初始化狀態(tài)時(shí),BeginPos =0,EndPos=0,
//比如:當(dāng)Endpos跑滿一圈回到0,而B(niǎo)eginPos一直沒(méi)人來(lái)取數(shù)據(jù),那么兩者重合,buffer滿
//只有等BenginPos處被取走數(shù)據(jù),那么才能接著存。否則數(shù)據(jù)滿了還沒(méi)處理,是不能覆蓋的
m_IsFull = 1;
}
};
|