Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
发现 "rt-thread\components\drivers\src\waitqueue.c" 中的一个bug
发布于 2018-08-16 13:02:24 浏览:2507
订阅该版
本帖最后由 lugang_2920213 于 2018-8-16 20:54 编辑 我在板子上面跑了一个TCP服务,一个UDP服务。(启用了SAL模块) 板子可以正常发送udp数据给调试工具,但是调试工具给板子UDP服务发送数据时,板子会进入硬件错误。 出错时lwip调试信息(调试工具发送的数据为"rtthread\r\n") ``` udp_input: received datagram of length 18 UDP header: +-------------------------------+ | 2150 | 2150 | (src port, dest port) +-------------------------------+ | 18 | 0xa533 | (len, chksum) +-------------------------------+ udp (192.168.0.100, 2150) <-- (192.168.0.101, 2150) pcb (0.0.0.0, 2150) --- (0.0.0.0, 0) pcb (0.0.0.0, 68) --- (0.0.0.0, 67) pcb (0.0.0.0, 49153) --- (0.0.0.0, 0) udp_input: calculating checksum ``` 执行“rt-thread\components\drivers\src\waitqueue.c”文件中的65行(下面代码21行)时,出现硬件错误。 ``` void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key) { rt_base_t level; register int need_schedule = 0; rt_list_t *queue_list; struct rt_list_node *node; struct rt_wqueue_node *entry; queue_list = &(queue->waiting_list); level = rt_hw_interrupt_disable(); /* set wakeup flag in the queue */ queue->flag = RT_WQ_FLAG_WAKEUP; if (!(rt_list_isempty(queue_list))) { for (node = queue_list->next; node != queue_list; node = node->next) { entry = rt_list_entry(node, struct rt_wqueue_node, list); if (entry->wakeup(entry, key) == 0) { rt_thread_resume(entry->polling_thread); need_schedule = 1; rt_wqueue_remove(entry); break; } } } rt_hw_interrupt_enable(level); if (need_schedule) rt_schedule(); } ``` 硬件错误前的状态为: ![](http://www.ihomeonline.net/status.png) 出错的原因是传入了一个空的链表。我没有研究过rtt的内核,不知道是否在其它地方有对参数有效性的判断。所以简单的在这里进行了判断,现在程序能正常运行。 我修改后的代码 我添加了(11-14行) ``` void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key) { rt_base_t level; register int need_schedule = 0; rt_list_t *queue_list; struct rt_list_node *node; struct rt_wqueue_node *entry; queue_list = &(queue->waiting_list); if ((queue_list->next == NULL) && (queue_list->prev == NULL)) { return; } level = rt_hw_interrupt_disable(); /* set wakeup flag in the queue */ queue->flag = RT_WQ_FLAG_WAKEUP; if (!(rt_list_isempty(queue_list))) { for (node = queue_list->next; node != queue_list; node = node->next) { entry = rt_list_entry(node, struct rt_wqueue_node, list); if (entry->wakeup(entry, key) == 0) { rt_thread_resume(entry->polling_thread); need_schedule = 1; rt_wqueue_remove(entry); break; } } } rt_hw_interrupt_enable(level); if (need_schedule) rt_schedule(); } ``` 我的运行环境: 1. 硬件信息 ``` CPU: STM32F103VC 网卡: enc28j60 ``` 2. rtt版本 ``` \ | / - RT - Thread Operating System / | \ 3.1.0 build Aug 16 2018 2006 - 2018 Copyright by rt-thread team ``` 3. rtconfig.h ``` #ifndef RT_CONFIG_H__ #define RT_CONFIG_H__ /* Automatically generated file; DO NOT EDIT. */ /* RT-Thread Project Configuration */ #define SOC_STM32F1 /* RT-Thread Kernel */ #define RT_NAME_MAX 8 #define RT_ALIGN_SIZE 4 #define RT_THREAD_PRIORITY_32 #define RT_THREAD_PRIORITY_MAX 32 #define RT_TICK_PER_SECOND 100 #define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK #define RT_IDEL_HOOK_LIST_SIZE 4 #define IDLE_THREAD_STACK_SIZE 256 #define RT_DEBUG /* Inter-Thread communication */ #define RT_USING_SEMAPHORE #define RT_USING_MUTEX #define RT_USING_EVENT #define RT_USING_MAILBOX #define RT_USING_MESSAGEQUEUE /* Memory Management */ #define RT_USING_MEMPOOL #define RT_USING_SMALL_MEM #define RT_USING_HEAP /* Kernel Device Object */ #define RT_USING_DEVICE #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M3 /* RT-Thread Components */ #define RT_USING_COMPONENTS_INIT /* C++ features */ /* Command shell */ #define RT_USING_FINSH #define FINSH_THREAD_NAME "tshell" #define FINSH_USING_HISTORY #define FINSH_HISTORY_LINES 5 #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION #define FINSH_THREAD_PRIORITY 20 #define FINSH_THREAD_STACK_SIZE 2048 #define FINSH_CMD_SIZE 80 #define FINSH_USING_MSH #define FINSH_USING_MSH_DEFAULT #define FINSH_USING_MSH_ONLY #define FINSH_ARG_MAX 6 /* Device virtual file system */ #define RT_USING_DFS #define DFS_USING_WORKDIR #define DFS_FILESYSTEMS_MAX 2 #define DFS_FILESYSTEM_TYPES_MAX 2 #define DFS_FD_MAX 32 #define RT_USING_DFS_ELMFAT /* elm-chan's FatFs, Generic FAT Filesystem Module */ #define RT_DFS_ELM_CODE_PAGE 437 #define RT_DFS_ELM_WORD_ACCESS #define RT_DFS_ELM_USE_LFN_0 #define RT_DFS_ELM_USE_LFN 0 #define RT_DFS_ELM_MAX_LFN 255 #define RT_DFS_ELM_DRIVES 2 #define RT_DFS_ELM_MAX_SECTOR_SIZE 4096 #define RT_DFS_ELM_USE_ERASE #define RT_DFS_ELM_REENTRANT #define RT_USING_DFS_DEVFS /* Device Drivers */ #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL /* Using USB */ /* POSIX layer and C standard library */ #define RT_USING_LIBC #define RT_USING_PTHREADS #define RT_USING_POSIX /* Network */ /* Socket abstraction layer */ #define RT_USING_SAL /* protocol stack implement */ #define SAL_USING_LWIP #define SAL_USING_POSIX #define SAL_PROTO_FAMILIES_NUM 4 /* light weight TCP/IP stack */ #define RT_USING_LWIP #define RT_USING_LWIP141 #define RT_LWIP_IGMP #define RT_LWIP_ICMP #define RT_LWIP_DNS #define RT_LWIP_DHCP #define IP_SOF_BROADCAST 1 #define IP_SOF_BROADCAST_RECV 1 /* Static IPv4 Address */ #define RT_LWIP_IPADDR "192.168.1.30" #define RT_LWIP_GWADDR "192.168.1.1" #define RT_LWIP_MSKADDR "255.255.255.0" #define RT_LWIP_UDP #define RT_LWIP_TCP #define RT_MEMP_NUM_NETCONN 8 #define RT_LWIP_PBUF_NUM 16 #define RT_LWIP_RAW_PCB_NUM 4 #define RT_LWIP_UDP_PCB_NUM 6 #define RT_LWIP_TCP_PCB_NUM 4 #define RT_LWIP_TCP_SEG_NUM 40 #define RT_LWIP_TCP_SND_BUF 8196 #define RT_LWIP_TCP_WND 8196 #define RT_LWIP_TCPTHREAD_PRIORITY 10 #define RT_LWIP_TCPTHREAD_MBOX_SIZE 8 #define RT_LWIP_TCPTHREAD_STACKSIZE 1024 #define RT_LWIP_ETHTHREAD_PRIORITY 12 #define RT_LWIP_ETHTHREAD_STACKSIZE 1024 #define RT_LWIP_ETHTHREAD_MBOX_SIZE 8 #define LWIP_NETIF_STATUS_CALLBACK 1 #define SO_REUSE 1 #define LWIP_SO_RCVTIMEO 1 #define LWIP_SO_SNDTIMEO 1 #define LWIP_SO_RCVBUF 1 #define LWIP_NETIF_LOOPBACK 0 #define RT_LWIP_DEBUG #define RT_LWIP_UDP_DEBUG #define RT_LWIP_TCP_DEBUG /* Modbus master and slave stack */ /* AT commands */ /* VBUS(Virtual Software BUS) */ /* Utilities */ /* ARM CMSIS */ #define RT_USING_RTT_CMSIS /* Configure Uart */ #define RT_USING_UART1 #define RT_USING_UART2 #define RT_USING_UART3 /* STM32 Librarys Configuration */ #endif ```
查看更多
2
个回答
默认排序
按发布时间排序
lugang_2920213
2018-08-20
这家伙很懒,什么也没写!
当关闭 // #define SAL_USING_LWIP 直接使用lwip_xxxx接口时,不会出现这个bug。
armink
2018-08-20
这家伙很懒,什么也没写!
试试使用下 lwIP 2.0.2 吧
撰写答案
登录
注册新账号
关注者
0
被浏览
2.5k
关于作者
lugang_2920213
这家伙很懒,什么也没写!
提问
2
回答
3
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
《原子操作:程序世界里的“最小魔法单位”解析》
2
《C++设计模式:重塑游戏角色系统类结构的秘籍》
3
rt-thread官方usb驱动之虚拟串口
4
RTduino物联网应用零基础入门
5
TinyUSB Demo运行教程
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
freemodbus
PWM
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
6
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部