C语言之队列,环形数组-比链表容易多了

xiaoxiao2021-02-28  23

环形队列实现

 

①定义一个结构体:

typedef struct {    u16 Head;              u16 Tail;    u16 Lenght;    u8 Ring_Buff[RINGBUFF_LEN]; }RingBuff_t; RingBuff_t ringBuff;//创建一个ringBuff的缓冲区

②初始化结构体相关信息:使得我们的环形缓冲区是头尾相连的,并且里面没有数据,也就是空的队列。

void RingBuff_Init(void) {   //初始化相关信息   ringBuff.Head = 0;   ringBuff.Tail = 0;   ringBuff.Lenght = 0; }

初始化效果如下:

写入环形缓冲区的代码实现:

u8 Write_RingBuff(u8 data) {   if(ringBuff.Lenght >= RINGBUFF_LEN) //判断缓冲区是否已满    {      return FLASE;    }    ringBuff.Ring_Buff[ringBuff.Tail]=data; //    ringBuff.Tail++;    ringBuff.Tail = (ringBuff.Tail+1)%RINGBUFF_LEN;//防止越界非法访问    ringBuff.Lenght++;    return TRUE; }

 

ringBuff.Tail++; 

ringBuff.Tail = (ringBuff.Tail+1)%RINGBUFF_LEN;

注意 区别!

读取缓冲区的数据的代码实现:

u8 Read_RingBuff(u8 *rData) {   if(ringBuff.Lenght == 0)//判断非空    {       return FLASE;    }   *rData = ringBuff.Ring_Buff[ringBuff.Head];//先进先出FIFO,从缓冲区头出 //   ringBuff.Head++;   ringBuff.Head = (ringBuff.Head+1)%RINGBUFF_LEN;//防止越界非法访问   ringBuff.Lenght--;   return TRUE; }

对于读写操作需要注意的地方有两个:

1:判断队列是否为空或者满,如果空的话,是不允许读取数据的,返回FLASE。如果是满的话,也是不允许写入数据的,避免将已有数据覆盖掉。那么如果处理的速度赶不上接收的速度,可以适当增大缓冲区的大小,用空间换取时间。

2:防止指针越界非法访问,程序有说明,需要使用者对整个缓冲区的大小进行把握。

那么在串口接收函数中:

void USART1_IRQHandler(void)   {   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断           {           USART_ClearITPendingBit(USART1,USART_IT_RXNE);       //清楚标志位           Write_RingBuff(USART_ReceiveData(USART1));      //读取接收到的数据       } }

    当然,我们完全可以用空闲中断与DMA传输,效率更高

参考:杰杰https://blog.csdn.net/jiejiemcu/article/details/80563422

转载请注明原文地址: https://www.6miu.com/read-2800280.html

最新回复(0)