本帖最后由 luobeihai 于 2024-12-4 22:09 编辑
#申请原创# @21小跑堂
1. ringbuffer介绍
首先,什么是环形缓冲区(ringbuffer)?环形缓冲区是具有固定的有限大小的缓冲区。它是一种队列数据结构,只不过它不是线性队列,而是环形队列。
环形缓冲区的环形,不是指物理内存上是连成一个环的,而是它在逻辑上是一个环形,它有两个索引值: 写入数据时,写指针递增;读出数据时,读指针递增。读指针索引不应该跳过写指针索引, 两个索引在到达缓冲区末端时都应该被赋值为0,这样就可以允许海量的数据流过缓冲区。
但是当写指针的下一个位置等于读指针时,说明缓冲区的数据已经满了,这时再继续往缓冲区写入数据则会覆盖还未来得及处理的数据。
对于环形缓冲区的详细介绍,网上也有很多相关的资源。
这里不过多介绍环形缓冲区的原理,本文着重介绍环形缓冲区在APM32F407串口快速接收大量数据时,如何处理数据做到不丢包。
2. ringbuffer的代码实现
实现环形缓冲区的形式有使用数组的,也可以使用链表。我这里为了实现简单,就用数组作为 ringbuffer 的内存来实现。
在实现 ringbuffer 时,要有两个指针,读指针和写指针。每当向 ringbuffer 中写入一个数据时,写指针加1;同理从 ringbuffer 中读取一个数据时,读指针加1。
对于 ringbuffer 的读写操作,我们有几个重点问题需要考虑:
|