lwip stm32 - http请求失败
Posted
技术标签:
【中文标题】lwip stm32 - http请求失败【英文标题】:lwip stm32 - http requests failing 【发布时间】:2018-02-06 17:17:01 【问题描述】:我在 stm32 处理器 (stm32f407) 上使用套接字 api 运行 freeRTOS 和 lwip 1.4.1。 总的来说,它工作得很好。 我可以使用 udp 和 tcp 发送和接收数据。
但在 3 到 7 天的时间窗口内,我看到了一个奇怪的行为。
我的问题
每隔 3 到 7 天,我的客户端(Windows 10,每秒发送 1-2 个 HTTP 请求)无法发送这些请求。发生这种情况时,连续有约 10 个请求失败。在很短的时间内,堆栈根本不会重新生成。
我的猜测
我认为我的 LWIP 配置中可能配置错误。 因为栈用得很好,应该不会有这个方向的bug
我的以太网设置
服务器和客户端直接相连,中间没有交换机、集线器或路由器。
服务器(stm32/lwip):
静态,192.168.168.2 网络掩码,255.255.255.0客户端(win10)eth0:
静态,192.168.168.1 网络掩码,255.255.255.0客户端(win10)eth1:
dhcp,正常工作网络我的尝试
目前我正在运行测试,每秒发送约 7-8 个请求,但该错误并不经常出现。 我玩弄了 lwip 配置:
为堆栈提供更多内存 更多 pbufs 更大的 pbufs 有/没有积压但一切都没有改善这个连接问题。 会不会是因为客户端经常重复使用的端口号,导致这个问题?
这里我有 lwip 调试输出的相关部分:
tcp debugging output
https://pastebin.com/a9JabhET
这里是 Wireshark 日志:
orig screenshot
hole wireshark log:
https://www.file-upload.net/download-12682664/debug_tcp_00001_20170828172950.html
这里是我的 lwipopts.h:
lwip configuration:
https://pastebin.com/cW0v4hF6
【问题讨论】:
【参考方案1】:这似乎是一个内存问题,但由于它是暂时的,它可能是某事超时。 建议使用LwIP的内存统计功能,同时开启ARP调试信息。
【讨论】:
【参考方案2】:我有一份新工作,不再处理这个问题。
在我宣布我的新工作之前,我可以证明这不是 LwIP 上的内存问题(我定义了不合理的大型 pbuf 和内存池),它们从未达到极限。
问题出在 ETH 的 DMA 驱动程序中。当到达 DMA 驱动程序的内存链末端时,链元素永远不会被释放,所以我遇到了 RBU(接收缓冲区欠载)问题,并且 RBU 标志再也没有被重置,并且 DMA ETH 驱动程序在这个 RBU 中断中挂起(甚至如果有足够的 LwIP 缓冲区可以从 DMA 链写入)。所以我向 DMA 驱动程序添加了一个大锤修复程序并禁用了 RBU 中断(我在多种情况下轮询 RBU 标志并在需要时将其清除,然后再次开始从 ETH 读取)。
我认为从那时起问题或多或少“解决了”。不太好,但它有效。
【讨论】:
以上是关于lwip stm32 - http请求失败的主要内容,如果未能解决你的问题,请参考以下文章
STM32F107+LWIP怎样判断网络已经连接成功或断开的
基于STM32单片机的LwIP协议LwIP 的TCP_client 上传数据温度电压数据到网络调试助手