706|1

189

帖子

5

TA的资源

一粒金砂(中级)

楼主
 

ring buffer原理举例 [复制链接]

假设我们有一个环形缓冲区,其大小(RING_BUFFER_SIZE)为8字节。初始情况下,缓冲区是空的:

索引: 0 1 2 3 4 5 6 7

数据: [ ][ ][ ][ ][ ][ ][ ][ ]

头:    ^

尾:    ^

在这个例子中,头(head)和尾(tail)索引都是0,表示下一个数据应写入数组的第0位,下一个读取也应该是第0位。

当我们写入3个字节的数据(例如A,B,C)后,环形缓冲区看起来将是:

索引: 0 1 2 3 4 5 6 7

数据: ['A']['B']['C'][ ][ ][ ][ ][ ]

头:                      ^

尾:    ^

现在,头索引指向位置3,表示下一个字节将被写入此处。尾索引仍然指向位置0,表示下一个字节将从此处读取。

假设我们继续写入5个字节的数据(D, E, F, G, H),环形缓冲区将变为:

索引: 0 1 2 3 4 5 6 7

数据: ['A']['B']['C']['D']['E']['F']['G']['H']

头:    ^

尾:    ^

此时头和尾的索引都回到了0。头索引回到了0是因为('H'后,head = (7 + 1) % 8),就等于0。如果我们现在尝试写入更多数据,RingBuffer_Write将返回false,因为缓冲区已满。

如果我们接着读取4个字节,每次读取都会让尾索引增加,然后环形缓冲区会是这样的:

索引: 0 1 2 3 4 5 6 7

数据: ['A']['B']['C']['D']['E']['F']['G']['H']

头:    ^

尾:                            ^

在这个状态下,尾索引指向4,表示下一个字节将从这里读取。由于缓冲区不再是满的,我们现在可以再次写入数据。

如果我们现在写入三个字节的数据(I, J, K),环形缓冲区的状态将更新如下:

索引: 0 1 2 3 4 5 6 7

数据: ['I']['J']['K']['D']['E']['F']['G']['H']

头:              ^

尾:                          ^

头索引移动到位置3,并覆盖了那里旧的数据。因为我们已经读取了那些数据,所以这是安全的。这个行为使得环形缓冲区非常适合处理连续的数据流,而不需要大量的内存分配和复制操作。

 

以上来之GPT4.

 

 

 

 

 

 

此帖出自汽车电子论坛

最新回复

感谢分享ring buffer原理举例,望楼主再详细解释一下更好   详情 回复 发表于 2024-3-2 09:56
点赞 关注

回复
举报

6807

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

感谢分享ring buffer原理举例,望楼主再详细解释一下更好

此帖出自汽车电子论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表