Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread发布
ringbuffer.c组件疑问
发布于 2016-06-28 10:04:34 浏览:3731
订阅该版
``` rt_size_t rt_ringbuffer_put_force(struct rt_ringbuffer *rb, const rt_uint8_t *ptr, rt_uint16_t length) { rt_uint16_t space_length; RT_ASSERT(rb != RT_NULL); space_length = rt_ringbuffer_space_len(rb); if (length > space_length) length = rb->buffer_size; if (rb->buffer_size - rb->write_index > length) { /* read_index - write_index = empty space */ memcpy(&rb->buffer_ptr[rb->write_index], ptr, length); /* this should not cause overflow because there is enough space for * length of data in current mirror */ rb->write_index += length; if (length > space_length) rb->read_index = rb->write_index; return length; } memcpy(&rb->buffer_ptr[rb->write_index], &ptr[0], rb->buffer_size - rb->write_index); memcpy(&rb->buffer_ptr[0], &ptr[rb->buffer_size - rb->write_index], length - (rb->buffer_size - rb->write_index)); /* we are going into the other side of the mirror */ rb->write_mirror = ~rb->write_mirror; rb->write_index = length - (rb->buffer_size - rb->write_index); if (length > space_length) { rb->read_mirror = ~rb->read_mirror; rb->read_index = rb->write_index; } return length; } ``` if (rb->buffer_size - rb->write_index > length)这个判断条件中的这个条件是不是无法进入,这段代码是不是冗余的 if (length > space_length) rb->read_index = rb->write_index; 因为前面有了if (length > space_length) length = rb->buffer_size;的判断,如果length>space_length成立的话,length就被赋值到缓冲区大小,那下面的 if (rb->buffer_size - rb->write_index > length)的这个条件是进不去的。
查看更多
7
个回答
默认排序
按发布时间排序
bernard
2016-06-28
这家伙很懒,什么也没写!
为什么会进不去?length如果比较小呢。
viperauter
2016-06-28
这家伙很懒,什么也没写!
>为什么会进不去?length如果比较小呢。 --- 你好,我的理解是最开始的这个条件: if (length > space_length) length = rb->buffer_size; 就限制住了,能进入if (rb->buffer_size - rb->write_index > length)的前提就是length必须是小于或者等于space_length,因为如果length>space_length,length就变成buffer_size, buffer_size-write_index不可能大于length,既然length<=space_length才能进入,那在这个条件里面判断length>sapce_length是不是多余的。
bernard
2016-06-28
这家伙很懒,什么也没写!
假设ringbuffer有64字节,space length还有32字节。这个时候length传递进来的大小是4字节。write_index 在31的位置上。
viperauter
2016-06-28
这家伙很懒,什么也没写!
>假设ringbuffer有64字节,space length还有32字节。这个时候length传递进来的大小是4字节。write_index 在31的位置上。 --- space length = 32 buffersize = 64 write_index=31 那read_index=63这样write_index到62标号可以写32个字节进去,length传递4个字节,这个对 if(length>sapce_length)没有影响啊,这种情况下缓冲区完全足够的。这样没办法进入length>sapce_length中的操作。 我认为这个函数主要解决的问题就是sapce lengh
buffer_size - rb->write_index > length)这个就是看write_index之后的数据到数组的末尾的空间是否够length的长度写进去,这种情况下可能发生覆盖的可能就是read_index在write_index的后面,能进入这个条件的应该也不会发生覆盖了,所以if (length > space_length)还是没有机会进入。 可能我太纠结这个判断语句,因为我找不到能进入这个判断语句的条件。
bernard
2016-06-28
这家伙很懒,什么也没写!
-_- 捉急的,你不要把这两个条件联系在一起好不。并不能够因为两个条件都不可能满足时,而把另外一个条件去掉。另外一个条件在其他情况下是必须的
grissiom
2016-06-29
这家伙很懒,什么也没写!
这块貌似确实有问题,设想当 space_length = 0,而 length < buffer_size 的时候,写入的数据就会比 ptr 所指向的数据多。这块应该直接使用 buffer_size 来判断,而不是 space_length。 而且,进入 ``` if (rb->buffer_size - rb->write_index > length) ``` 之后,read_index 没有被更新~
撰写答案
登录
注册新账号
关注者
0
被浏览
3.7k
关于作者
viperauter
这家伙很懒,什么也没写!
提问
2
回答
2
被采纳
0
关注TA
发私信
相关问题
1
RT-Thread单内核v0.2.2正式版
2
[发布] RT-Thread RTOS v0.2.3版本
3
RT-Thread 0.3.0 beta
4
RT-Thread/STM32 0.3.0 RC1发布
5
RT-Thread/LM3S 0.3.0 RC1版发布
6
建议弄个MIPS版本的。龙芯上用。
7
开源实时操作系统RT-Thread 0.3.0正式版发布
8
关于RT-THREAD的UDP讨论
9
这里是BUG回报板块!
10
rt-thread stm32 0.3.0 rc1 网络问题
推荐文章
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
在RT-Thread Studio中构建前执行python命令
2
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
3
CherryUSB开发笔记(一):FSDEV USB IP核的 HID Remote WakeUp (USB HID 远程唤醒) 2025-01-18 V1.1
4
RT-thread 缩写字典
5
RT Thread 源码分析笔记 :线程和调度器
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
Bootloader
AT
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
聚散无由
2
篇文章
14
次点赞
catcatbing
2
篇文章
4
次点赞
Wade
2
篇文章
2
次点赞
Ghost_Girls
1
篇文章
5
次点赞
xiaorui
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部