Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
dataqueue数据队列
数据队列rt_data_queue_push似乎有bug?
发布于 2019-09-21 10:33:04 浏览:1913
订阅该版
```c struct rt_data_queue { rt_uint16_t size; rt_uint16_t lwm; rt_bool_t waiting_lwm; rt_uint16_t get_index; rt_uint16_t put_index; struct rt_data_item *queue; rt_list_t suspended_push_list; rt_list_t suspended_pop_list; /* event notify */ void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event); }; rt_err_t rt_data_queue_push(struct rt_data_queue *queue, const void *data_ptr, rt_size_t data_size, rt_int32_t timeout) { rt_ubase_t level; rt_thread_t thread; rt_err_t result; RT_ASSERT(queue != RT_NULL); result = RT_EOK; thread = rt_thread_self(); level = rt_hw_interrupt_disable(); while (queue->put_index - queue->get_index == queue->size) { /* queue is full */ if (timeout == 0) { result = -RT_ETIMEOUT; goto __exit; } 省略下面部分代码 .... } ``` 在dataqueue.c文件中,put_index 和get_index 只作+1运算,运算超过0xFFFF次后,会出现`put_index < get_index` 的情况。 put_index 和get_index 都是16位的,而当CPU是32位时,直接相减可能会溢出。 比如当`put_index = 1,get_index = 0xFFFF,size = 2`的情况下, `queue->put_index - queue->get_index = 0xFFFF0002` 不等于 `size ` 因此,上述红色标示的代码应当修改为 `while (((rt_uint16_t )(queue->put_index - queue->get_index) )== queue->size)` 类似的情况还有rt_data_queue_pop函数中的 `if ((queue->put_index - queue->get_index) <= queue->lwm)` 建议修改在dataqueue.h文件中的 ```c #define RT_DATAQUEUE_SIZE(dq) ((dq)->put_index - (dq)->get_index) ``` 为 ```c #define RT_DATAQUEUE_SIZE(dq) ((rt_uint16_t ) ((dq)->put_index - (dq)->get_index)) ``` 然后.c中统一使用上述宏 以上分析,个人观点,仅供参考,希望指正
查看更多
5
个回答
默认排序
按发布时间排序
wuhanstudio
2019-09-21
这家伙很懒,什么也没写!
帮顶
还没想好
2019-09-23
这家伙很懒,什么也没写!
确实有这样子的问题,楼主可以提 Pr 修复这个问题。 https://www.rt-thread.org/document/site/development-guide/github/github/ 如何提 Pr
漫漫慢~
2019-12-19
这家伙很懒,什么也没写!
get_index,put_index,size都是uint16_t类型的,谈何溢出
漫漫慢~
2019-12-19
这家伙很懒,什么也没写!
这个的确没有bug
LeeTS
2020-08-29
这家伙很懒,什么也没写!
put_index如果溢出,由0xFFFF变成0x0000后,再次push后,感觉队列写入位置会错误,就是下面的代码: ```c queue->queue[queue->put_index % queue->size].data_ptr = data_ptr; queue->queue[queue->put_index % queue->size].data_size = data_size; queue->put_index += 1; ```
撰写答案
登录
注册新账号
关注者
0
被浏览
1.9k
关于作者
whyac
这家伙很懒,什么也没写!
提问
1
回答
2
被采纳
0
关注TA
发私信
相关问题
1
数据队列push函数内put_index溢出不会存在问题吗?
2
使用dataqueue.c rtdevice.h找不到
3
dataqueue内存泄漏
4
dataqueue中对挂起的线程恢复问题
推荐文章
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中的time溢出问题,时间戳溢出,解决方法
2
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
3
SystemView线程名字不显示
4
只用网页也能跑RT-Smart 无门槛腾讯Cloud studio + smart-build快速构建
5
免费申请 | FRDM-MCXA156评测活动发布!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
8
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
chenyaxing
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
3
次点赞
YZRD
1
篇文章
2
次点赞
Days
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部