Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Network
lwip 2.0.2 官方例程 tcp服务器 死机问题 求助
发布于 2019-01-29 14:31:22 浏览:5992
订阅该版
使用Stm32F407配合官方tcp_sample.c的例子,每次正常连接一会后,tcp都会进入死机状态,已经打开lwip调试,看不到任何错误信息不知道应该咋解决这个问题呢?  抓包发现都是一堆tcp重发包 死机后,ping也ping不通了,但空闲线程仍会一直打印cpu使用率
查看更多
21
个回答
默认排序
按发布时间排序
sync
2019-01-29
这家伙很懒,什么也没写!
[i=s] 本帖最后由 sync 于 2019-1-29 17:05 编辑 [/i] lwip版本更换成2.1后也是一样的现象。。。。。 使用的程序就是这个例子[https://www.rt-thread.org/document/site/tutorial/qemu-network/tcpserver/tcpserver/](https://www.rt-thread.org/docume ... cpserver/tcpserver/) 我把tcp客户端数据的发送间隔调整为500ms。运行了快一个小时,又死了。。。 程序中就开一个5000端口,为啥会这样呢,数据量又不大。。。 基本每次都是连续工作半小时左右就死机了。。 这次打开NETIF_DEBUG后 能看到一个ethernetif_input: Input error 错误 ``` lwip_recvfrom: netconn_recv err=0, netbuf=20009ccc lwip_recvfrom: buflen=174 len=1024 off=0 sock->lastoffset=0 lwip_recvfrom(1): addr=192.168.1.141 port=49401 len=174 lwip_recvfrom: deleting netbuf=20009ccc rlen = 1689192 ,16496 lwip_send(1, data=08020a5c, size=34, flags=0x0) lwip_send(1) err=0 written=34 lwip_recvfrom(1, 20010d24, 1024, 0x0, ..) lwip_recvfrom: top while sock->lastdata=00000000 tcpip_thread: PACKET 20002808 tcpip_thread: PACKET 20002808 lwip_recvfrom: netconn_recv err=0, netbuf=20009ccc lwip_recvfrom: buflen=174 len=1024 off=0 sock->lastoffset=0 lwip_recvfrom(1): addr=192.168.1.141 port=49401 len=174 lwip_recvfrom: deleting netbuf=20009ccc rlen = 1689366 ,16497 lwip_send(1, data=08020a5c, size=34, flags=0x0) lwip_send(1) err=0 written=34 lwip_recvfrom(1, 20010d24, 1024, 0x0, ..) lwip_recvfrom: top while sock->lastdata=00000000 tcpip_thread: PACKET 20002808 tcpip_thread: PACKET 20002808 lwip_recvfrom: netconn_recv err=0, netbuf=20009ccc lwip_recvfrom: buflen=174 len=1024 off=0 sock->lastoffset=0 lwip_recvfrom(1): addr=192.168.1.141 port=49401 len=174 lwip_recvfrom: deleting netbuf=20009ccc rlen = 1689540 ,16499 lwip_send(1, data=08020a5c, size=34, flags=0x0) lwip_send(1) err=0 written=34 lwip_recvfrom(1, 20010d24, 1024, 0x0, ..) lwip_recvfrom: top while sock->lastdata=00000000 tcpip_thread: PACKET 20002808 CPU : 0.0 CPU : 0.0 CPU : 0.60 CPU : 0.0 CPU : 0.0 CPU : 0.6 CPU : 0.0 CPU : 0.0 ethernetif_input: Input error CPU : 0.6 CPU : 0.0 ethernetif_input: Input error ethernetif_input: Input error CPU : 0.0 ethernetif_input: Input error CPU : 5.29 CPU : 0.6 CPU : 0.0 ``` rtt版本 和bsp都是前几天刚下载的。 ``` \ | / - RT - Thread Operating System / | \ 4.0.0 build Jan 29 2019 2006 - 2018 Copyright by rt-thread team lwIP-2.0.2 initialized! ``` 开机线程如下: ``` thread pri status sp stack size max used left tick error -------- --- ------- ---------- ---------- ------ ---------- --- tshell 20 running 0x00000084 0x00001000 12% 0x00000003 000 phy 30 suspend 0x00000094 0x00000400 19% 0x00000002 000 tcpip 10 suspend 0x000000c4 0x00000400 59% 0x0000000c 000 etx 12 suspend 0x00000094 0x00000400 14% 0x0000000f 000 erx 12 suspend 0x00000094 0x00000400 55% 0x0000000c 000 tidle0 31 ready 0x00000054 0x00000100 32% 0x00000012 000 main 10 suspend 0x00000094 0x00000800 34% 0x0000000e 000 ``` 这问题应该是底层驱动问题吧?最终错误发生在 erx接收线程中。 死机后,拔下网线仍能出现link down ,插上网线就又出现错误ethernetif_input: Input error ``` ethernetif_input: Input error CPU : 0.0 CPU : 0.6 CPU : 0.0 CPU : 0.0 CPU : 0.0 [I/drv.emac] link down CPU : 0.0 CPU : 0.6 CPU : 0.0 CPU : 0.6 CPU : 0.0 ethernetif_input: Input error CPU : 0.0 CPU : 0.0 CPU : 0.0 CPU : 0.0 CPU : 0.0 ethernetif_input: Input error ethernetif_input: Input error CPU : 0.0 ethernetif_input: Input error ethernetif_input: Input error CPU : 0.0 [I/drv.emac] link down CPU : 0.0 CPU : 0.0 CPU : 0.6 CPU : 0.0 CPU : 0.6 CPU : 0.0 CPU : 0.6 CPU : 0.0 ethernetif_input: Input error ethernetif_input: Input error ethernetif_input: Input error ```
zhifou
2019-01-30
这家伙很懒,什么也没写!
帮顶
sync
2019-01-30
这家伙很懒,什么也没写!
[i=s] 本帖最后由 sync 于 2019-1-30 10:00 编辑 [/i] 这次只开机,只有默认线程, ``` thread pri status sp stack size max used left tick error -------- --- ------- ---------- ---------- ------ ---------- --- tshell 20 running 0x00000084 0x00001000 12% 0x00000008 000 phy 30 suspend 0x00000094 0x00000400 21% 0x00000001 000 tcpip 10 suspend 0x000000c4 0x00000400 59% 0x00000001 000 etx 12 suspend 0x00000098 0x00000400 23% 0x0000000c 000 erx 12 suspend 0x00000098 0x00000400 56% 0x00000005 000 tidle0 31 ready 0x00000058 0x00000100 34% 0x00000012 000 main 10 suspend 0x00000094 0x00000800 34% 0x00000011 000 ``` 的情况下就会出现错误:receive frame faild 使用的是8720接口芯片 ``` \ | / - RT - Thread Operating System / | \ 4.0.0 build Jan 29 2019 2006 - 2018 Copyright by rt-thread team lwIP-2.0.2 initialized! [D/drv.emac] initialize tx wait semaphore netif: IP address of interface e0 set to 0.0.0.0 netif: netmask of interface e0 set to 0.0.0.0 netif: GW address of interface e0 set to 0.0.0.0 [D/drv.emac] eth hardware init success [D/drv.emac] emac hardware start netif: setting default interface e0 [D/drv.emac] transmit frame lenth :350 netif: added interface e0 IP addr 0.0.0.0 netmask 0.0.0.0 gw 0.0.0.0 [D/drv.emac] emac device init success msh >[D/drv.emac] found a phy, address:0x00 [D/drv.emac] RESET PHY! CPU : 0.0 [D/drv.emac] transmit frame lenth :350 CPU : 0.0 [D/drv.emac] PHY BASIC STATUS REG:0x7809 CPU : 0.6 [D/drv.emac] PHY BASIC STATUS REG:0x7809 CPU : 0.6 [D/drv.emac] PHY BASIC STATUS REG:0x782D [D/drv.emac] PHY Control/Status REG:0x0000 [D/drv.emac] link up [D/drv.emac] 10Mbps [D/drv.emac] half-duplex [D/drv.emac] transmit frame lenth :350 [D/drv.emac] receive frame faild [D/drv.emac] receive frame len : 342 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame faild [D/drv.emac] transmit frame lenth :350 [D/drv.emac] receive frame len : 342 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame faild [D/drv.emac] transmit frame lenth :42 [D/drv.emac] transmit frame lenth :42 [D/drv.emac] transmit frame lenth :42 netif: netmask of interface e0 set to 255.255.255.0 netif: GW address of interface e0 set to 192.168.1.1 netif_set_ipaddr: netif address being changed [D/drv.emac] transmit frame lenth :42 netif: IP address of interface e0 set to 192.168.1.95 CPU : 5.96 [D/drv.emac] PHY BASIC STATUS REG:0x782D [D/drv.emac] PHY Control/Status REG:0x0000 [D/drv.emac] transmit frame lenth :42 CPU : 0.36 [D/drv.emac] PHY BASIC STATUS REG:0x782D [D/drv.emac] PHY Control/Status REG:0x0000 [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame faild [D/drv.emac] transmit frame lenth :42 CPU : 0.0 [D/drv.emac] PHY BASIC STATUS REG:0x782D [D/drv.emac] PHY Control/Status REG:0x0000 [D/drv.emac] transmit frame lenth :42 CPU : 0.6 [D/drv.emac] PHY BASIC STATUS REG:0x782D [D/drv.emac] PHY Control/Status REG:0x0000 CPU : 0.0 [D/drv.emac] PHY BASIC STATUS REG:0x782D [D/drv.emac] PHY Control/Status REG:0x0000 CPU : 0.6 [D/drv.emac] PHY BASIC STATUS REG:0x782D [D/drv.emac] PHY Control/Status REG:0x0000 CPU : 0.6 [D/drv.emac] PHY BASIC STATUS REG:0x782D [D/drv.emac] PHY Control/Status REG:0x0000 CPU : 0.0 ``` 而且有时,会连续出现错误RX err = -3,表示邮箱已满。 ``` tcpip_thread: PACKET 2000280c [D/drv.emac[E/drv.emac] RX err = -3 c]receive frame len : 60 t[E/drv.emac] RX err = -3 [0m = -3emac] T 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2[E/drv.emac] RX err = -3 000280c [D/drv.emac] receive frame len : 60 tcpip_thread: [E/drv.emac] RX err = -3 ac] T 2000280c [D/drv.emac] receive frame len : 60 tcpip[E/drv.emac] RX err = -3 = -3emac] T 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2[E/drv.emac] RX err = -3 000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame len : 60 tcpip_threa[E/drv.emac] RX err = -3 emac] T 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread[E/drv.emac] RX err = -3 emac] T 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild me faild 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame faild [D/drv.emac] receive frame faild [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c [D/drv.emac] receive frame len : 60 tcpip_thread: PACKET 2000280c ``` 但正常时,邮箱使用如下: ``` mailbox entry size suspend thread -------- ---- ---- -------------- mbox0 0000 0016 1:tcpip etxmb 0000 0016 1:etx erxmb 0000 0016 1:erx ``` ifconfig 如下: ``` network interface: e0 (Default) MTU: 1500 MAC: 00 80 e1 07 33 47 FLAGS: UP LINK_UP ETHARP BROADCAST IGMP ip address: 192.168.1.95 gw address: 192.168.1.1 net mask : 255.255.255.0 dns server #0: 192.168.1.1 dns server #1: 192.168.1.1 ``` 插上网线每次都是10M,半双工模式。。。 ``` [D/drv.emac] link up [D/drv.emac] 10Mbps [D/drv.emac] half-duplex ``` ``` ```
yqiu
2019-01-30
这家伙很懒,什么也没写!
用的哪个 BSP, RT-Thread 版本是什么呢?
sync
2019-01-30
这家伙很懒,什么也没写!
使用的bsp目录是rt-thread-master\bsp\stm32\stm32f4xx RT-Thread版本是 4.0.0 build Jan 29 2019
sync
2019-01-30
这家伙很懒,什么也没写!
[i=s] 本帖最后由 sync 于 2019-1-30 11:19 编辑 [/i] 使用的drv_eth.c的版本 ``` /* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-11-19 SummerGift first version * 2018-12-25 zylx fix some bugs */ #include "board.h" #include "drv_config.h" #include
#include "lwipopts.h" #include "drv_eth.h" ``` 问题应该就 出在rt_stm32_eth_rx函数里面 ``` struct pbuf *rt_stm32_eth_rx(rt_device_t dev) { struct pbuf *p = NULL; struct pbuf *q = NULL; HAL_StatusTypeDef state; uint16_t len = 0; uint8_t *buffer; __IO ETH_DMADescTypeDef *dmarxdesc; uint32_t bufferoffset = 0; uint32_t payloadoffset = 0; uint32_t byteslefttocopy = 0; uint32_t i = 0; /* Get received frame */ state = HAL_ETH_GetReceivedFrame_IT(&EthHandle); if (state != HAL_OK) { printf("state = %d\r\n",state); LOG_D("receive frame faild"); return NULL; } /* Obtain the size of the packet and put it into the "len" variable. */ len = EthHandle.RxFrameInfos.length; buffer = (uint8_t *)EthHandle.RxFrameInfos.buffer; LOG_D("receive frame len : %d", len); if (len > 0) { /* We allocate a pbuf chain of pbufs from the Lwip buffer pool */ p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); } #ifdef ETH_RX_DUMP dump_hex(buffer, p->tot_len); #endif if (p != NULL) { dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc; bufferoffset = 0; for (q = p; q != NULL; q = q->next) { byteslefttocopy = q->len; payloadoffset = 0; /* Check if the length of bytes to copy in current pbuf is bigger than Rx buffer size*/ while ((byteslefttocopy + bufferoffset) > ETH_RX_BUF_SIZE) { /* Copy data to pbuf */ memcpy((uint8_t *)((uint8_t *)q->payload + payloadoffset), (uint8_t *)((uint8_t *)buffer + bufferoffset), (ETH_RX_BUF_SIZE - bufferoffset)); /* Point to next descriptor */ dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr); buffer = (uint8_t *)(dmarxdesc->Buffer1Addr); byteslefttocopy = byteslefttocopy - (ETH_RX_BUF_SIZE - bufferoffset); payloadoffset = payloadoffset + (ETH_RX_BUF_SIZE - bufferoffset); bufferoffset = 0; } /* Copy remaining data in pbuf */ memcpy((uint8_t *)((uint8_t *)q->payload + payloadoffset), (uint8_t *)((uint8_t *)buffer + bufferoffset), byteslefttocopy); bufferoffset = bufferoffset + byteslefttocopy; } } /* Release descriptors to DMA */ /* Point to first descriptor */ dmarxdesc = EthHandle.RxFrameInfos.FSRxDesc; /* Set Own bit in Rx descriptors: gives the buffers back to DMA */ for (i = 0; i < EthHandle.RxFrameInfos.SegCount; i++) { dmarxdesc->Status |= ETH_DMARXDESC_OWN; dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr); } /* Clear Segment_Count */ EthHandle.RxFrameInfos.SegCount = 0; /* When Rx Buffer unavailable flag is set: clear it and resume reception */ if ((EthHandle.Instance->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) { /* Clear RBUS ETHERNET DMA flag */ EthHandle.Instance->DMASR = ETH_DMASR_RBUS; /* Resume DMA reception */ EthHandle.Instance->DMARPDR = 0; } return p; } ``` 调试发现每次发生 LOG_D("receive frame faild");错误的时候 HAL_ETH_GetReceivedFrame_IT中的heth->RxDesc->Status状态是 0x80400320 也就是((heth->RxDesc->Status & ETH_DMARXDESC_OWN) == (uint32_t)RESET) 不成立
sync
2019-01-30
这家伙很懒,什么也没写!
[i=s] 本帖最后由 sync 于 2019-1-30 11:35 编辑 [/i] rt_stm32_eth_rx里面的 dmarxdesc->Status |= ETH_DMARXDESC_OWN; 这句话是啥意思呢?我将其注销掉的话,会有其他影响吗? 注销掉就没再发生receive frame faild错了。 ``` for (i = 0; i < EthHandle.RxFrameInfos.SegCount; i++) { // dmarxdesc->Status |= ETH_DMARXDESC_OWN; dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr); } ``` 注销掉,会有另外的错误 ``` [D/drv.emac] receive frame len : 342 ethernetif_input: Input error [D/drv.emac] receive frame len : 342 ethernetif_input: Input error [D/drv.emac] receive frame len : 60 ethernetif_input: Input error [D/drv.emac] receive frame len : 60 ethernetif_input: Input error [D/drv.emac] receive frame len : 342 ethernetif_input: Input error [D/drv.emac] receive frame len : 342 ethernetif_input: Input error [D/drv.emac] receive frame len : 60 ethernetif_input: Input error [D/drv.emac] receive frame len : 60 ethernetif_input: Input error [D/drv.emac] receive frame len : 342 ethernetif_input: Input error [D/drv.emac] receive frame len : 342 ethernetif_input: Input error [D/drv.emac] receive frame len : 60 ethernetif_input: Input error ```
zhifou
2019-01-30
这家伙很懒,什么也没写!
这种是否先找个完全已有BSP的开发板来验证比较好些?
sync
2019-01-30
这家伙很懒,什么也没写!
>这种是否先找个完全已有BSP的开发板来验证比较好些? --- 不同开发板使用的驱动都是rt-thread-master\bsp\stm32\libraries\HAL_Drivers目录下的,使用的是同一个文件了,目前测试的情况是不稳定,也不是不能工作,很郁闷了。。。
sync
2019-01-30
这家伙很懒,什么也没写!
eth接收函数,之前裸机下 执行的是 HAL_ETH_GetReceivedFrame,RTT下使用中断,执行的是 HAL_ETH_GetReceivedFrame_IT(&EthHandle); 另外就是rtt使用了接收线程,根据邮箱来读取eth数据, 暂时测试发现LOG_D("receive frame faild")的原因是EthHandle.RxDesc.Status中的ETH_DMARXDESC_OWN一直为1. 年后再继续调了,暂时就到这里,多谢大家了
撰写答案
登录
注册新账号
关注者
0
被浏览
6k
关于作者
sync
这家伙很懒,什么也没写!
提问
12
回答
413
被采纳
78
关注TA
发私信
相关问题
1
lwip1.4.1连接经常会断开无法连接上,可以ping通
2
LPC1768:RTT+LWIP+webserver用IE刷网页出现硬件中断错误(已经解决)
3
求一些LWIP开发的经验,目前ping一直不稳定。
4
stm32f207+dp83848无法ping通
5
RTT下的LWIP传递机制
6
rtt内lwip的socket是否是线程安全?
7
Lwip+enc28j60无法ping通
8
坑爹的rtconfig.h lwip关掉了checksum
9
花了一个晚上,把RT2.0的LWIP、网卡驱动、文件系统整合起来了,发现一点小问题
10
lwip例程中udp发送时如何指定源端口发送到指定目的地端口
推荐文章
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-thred的stm32h723对应bsp包CubeMX添加其他外设报错
2
RT-Thread中的time溢出问题,时间戳溢出,解决方法
3
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
4
SystemView线程名字不显示
5
只用网页也能跑RT-Smart 无门槛腾讯Cloud studio + smart-build快速构建
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
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_逍遥
9
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
YZRD
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部