Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
堆_heap_动态内存管理
ringbuffer_环形缓冲区
rt_ringbuffer_peak疑问
发布于 2022-05-26 16:03:37 浏览:920
订阅该版
```c rt_size_t rt_ringbuffer_peak(struct rt_ringbuffer *rb, rt_uint8_t **ptr) { RT_ASSERT(rb != RT_NULL); *ptr = RT_NULL; /* whether has enough data */ rt_size_t size = rt_ringbuffer_data_len(rb); /* no data */ if (size == 0) return 0; *ptr = &rb->buffer_ptr[rb->read_index]; if((rt_size_t)(rb->buffer_size - rb->read_index) > size) { rb->read_index += size; return size; } size = rb->buffer_size - rb->read_index; /* we are going into the other side of the mirror */ rb->read_mirror = ~rb->read_mirror; rb->read_index = 0; return size; } ``` 请教一下ringbuffer.c,里面的一段代码,谢谢!rt_ringbuffer_peak里的最后的`rb->read_index = 0;`有点不理解,不应该是`rb->read_index += size;`才对吗?
查看更多
lchnu
2022-05-26
Witness, Understand, Skill
peak函数只读取rb,但不取数据,所以read_index不动。 这个函数使用场合很少,`用于返回rb中第一个有效(可读)数据的地址,所以第二个形参是一个二级指针。` **慎用**。除非你的需求是: rb中有n个有效数据时,仅仅取出第一个可读数据的场合。`并且建议单字节访问`,因为rb本质上是用一段连续地址空间做循环,用这个接口,返回地址,一个不小心就越界了。 **编辑帖子,补充说明,我的上述回复是错误的。** 我深入看了一下代码,对peak函数的说明也有疑惑。 https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device-ipc/ringbuffer/ringbuffer?id=ringbuffer-%e6%8e%a5%e5%8f%a3%e4%bb%8b%e7%bb%8d 官方文档提到: > 从 ringbuffer 里读取数据的接口分为两类,一类是读数据并取出数据,另一类是读数据但并不取出数据(peak 操作)。 从代码中看,对read_index进行了写操作。毫无疑问,对于ringbuffer的内部逻辑而言,使用peak之后,数据是取出了的。 **我的结论:官方文档中,对于这个peak函数的说明是错的。** `由于其他楼层放图不方便,2022-05-27 根据lz的新问题,继续更新:` > 不好意思我没表达清楚,我是想问为什么上面有rb->read_index += size;下面就rb->read_index = 0;了 ![5b0cd05eafa51f3099bec37f4bdfef4d.png.webp](https://oss-club.rt-thread.org/uploads/20220527/5b0cd05eafa51f3099bec37f4bdfef4d.png.webp) 我的观点是: 1. 官方代码中,当bufsize - readindex >= size时,表示,从readindex到数组末尾有数据。**只取出从readindex到数组末尾的数据,如图所示。** 2. 你认为应该将readindex = 0 修改为 readindex = writeindex。那就是取出所有数据,**这个观点我也认同。** 3. **我一直在强调,这个函数的作用与官方文档描述不符合**,既然是错的,纠结readindex是到0,还是到writeindex,有什么意义呢?怎么处理readindex都无所谓了,只是表示程序员在当时的想法而已。 4. 进一步回溯代码思路。该函数通过二级指针返回readindex所表示的数组地址,由于环形缓冲区本质上是一个线性数组,因此,当出现当bufsize - readindex >= size的情况时,将readindex指向的数组地址通过二级指针返回,且返回从readindex到数组终点处的size,至少,通过这两个信息来操作指针,降低了越界的风险。这一段是我对coder的想法猜测。
3
个回答
默认排序
按发布时间排序
zw
2022-05-26
这家伙很懒,什么也没写!
不好意思我没表达清楚,我是想问为什么上面有rb->read_index += size;下面就rb->read_index = 0;了![4fe05392306180b4e45ebbe264f4305.png](https://oss-club.rt-thread.org/uploads/20220526/8263edf4fce9c3bf85a270681de63ced.png)
我真的不会取名
2024-08-08
这家伙很懒,什么也没写!
peek函数本身就有问题,估计当时的程序员没想好怎么写,不过网上已经有更好的ringbuff了,建议直接替换ringbuff
撰写答案
登录
注册新账号
关注者
0
被浏览
920
关于作者
zw
这家伙很懒,什么也没写!
提问
2
回答
3
被采纳
0
关注TA
发私信
相关问题
1
大量接收数据 如何处理能减少丢包率
2
有没有一种实现类似 ringbuffer, 但返回数据长度 和传入时候一样
3
使用ringbuffer时,自检到thread的type不匹配
4
对ringbuffer中rt_ringbuffer_put_force函数的疑问
5
RINGBUFF里镜像索引取反是为什么?
6
系统提供环形FIFO写入重载时可能存在数据错乱问题
7
串口DMA接收回调函数不起作用
8
串口 DMA ringbuffer 接收有可能覆盖数据
9
rt_ringbuffer_init在buffer_size赋值是否有问题?
10
rtthread 中的ringbuff是线程安全的吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部