Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
内存分配
ringbuffer
rt_ringbuffer_peak疑问
发布于 2022-05-26 16:03:37 浏览:297
订阅该版
```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;了  我的观点是: 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的想法猜测。
2
个回答
默认排序
按发布时间排序
zw
2022-05-26
这家伙很懒,什么也没写!
不好意思我没表达清楚,我是想问为什么上面有rb->read_index += size;下面就rb->read_index = 0;了
撰写答案
登录
注册新账号
关注者
0
被浏览
297
关于作者
zw
这家伙很懒,什么也没写!
提问
1
回答
2
被采纳
0
关注TA
发私信
相关问题
1
大量接收数据 如何处理能减少丢包率
2
有没有一种实现类似 ringbuffer, 但返回数据长度 和传入时候一样
3
使用ringbuffer时,自检到thread的type不匹配
4
对ringbuffer中rt_ringbuffer_put_force函数的疑问
5
RINGBUFF里镜像索引取反是为什么?
6
系统提供环形FIFO写入重载时可能存在数据错乱问题
7
串口 DMA ringbuffer 接收有可能覆盖数据
8
RT-Thread内存和字符串相关函数与C语言自带的内存和字符串相关函数冲突问题
9
rt_malloc函数调用时在参数检查时出现断言
10
外部内存分配SDRAM
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
五分钟玩转RT-Thread新社区
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
6
国产MCU移植系列教程汇总,欢迎查看!
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用 D1s (RDC2022 纪念版) 连接 thingspeak
2
RTduino 初体验
3
stm32wle5 双SRAM使用
4
开工大吉 | 借RT-Thread的论坛宝地,给各位嵌入式开发者送106块开发板!
5
随笔、FinSH原理浅析
热门标签
RT-Thread Studio
串口
LWIP
SPI
Env
AT
FinSH
ART-Pi
Bootloader
CAN总线
Hardfault
文件系统
USB
DMA
RT-Thread
线程
stm32
RT-Thread Nano
SCons
MQTT
ESP8266
ota
packages_软件包
UART
rtthread
RTC
freemodbus
I2C
flash
cubemx
W5500
rt-smart
定时器
FAL
rtt
PWM
ADC
BSP
SDIO
msh
AB32VG1
Debug
C++_cpp
socket
SFUD
中断
编译报错
MicroPython
keil
LVGL
本月问答贡献
出出啊
1424
个答案
315
次被采纳
小小李sunny
1326
个答案
262
次被采纳
crystal266
486
个答案
144
次被采纳
whj467467222
1210
个答案
141
次被采纳
张世争
581
个答案
131
次被采纳
本月文章贡献
出出啊
4
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
crystal266
1
篇文章
1
次点赞
whj467467222
2
篇文章
2
次点赞
张世争
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部