循环缓冲区取放原则

循环缓冲区结构体格式

#define RX_BUF_SIZE 128
typedef struct
{

	u8 count;		 //缓冲区buf 变量中放进数据之后当前可以取出来的个数,
	u8 head; 		//缓冲区buf此时下一个要放进去的索引index 下标,
	u8 tail;		//缓冲区buf 中获取数据的索引index下标
	u8 buf[RX_BUF_SIZE];	 //换缓冲区

}RXQUE_USART;
RXQUE_USART RxQue_Usart1;

 
  
 
  
 
  
 
 


缓冲区可以跨越多个区域放置一个数据,也可以跨越多个区域取出一个数据,方式就是防止越界。如果越界如何定位准确的buf 索引index 的下标,要防止buff 越界需要遵循以下逻辑算数规则。


放置一个字节原则算法:此处是一个一个的放置;(有待改进)

		RxQue_Usart1.buf[RxQue_Usart1.head] = (u8)USART1->DR;
		RxQue_Usart1.head++;
		if(RxQue_Usart1.head >= RX_BUF_SIZE)
		{
			RxQue_Usart1.head = 0;
		}
		RxQue_Usart1.count++;

取出一个字节原则算法:此处是一个一个的取出;(有待改进)

*pbuf = RxQue_Usart1.buf[RxQue_Usart1.tail++];
RxQue_Usart1.tail = (RxQue_Usart1.tail >= RX_BUF_SIZE)?0:RxQue_Usart1.tail;
RxQue_Usart1.count--;

跨越取一个字节的原则算法:(防止越界)<例如跨越3个byte>

RxQue_Usart1.buf[ ((RxQue_Usart1.tail+3)%(RX_BUF_SIZE-1))-((RxQue_Usart1.tail+3)/(RX_BUF_SIZE-1)) ]

猜你喜欢

转载自blog.csdn.net/rebirthme/article/details/78138488
今日推荐