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:使用STM32CubeMX生成项目

基于STM32单片机的LwIP协议LwIP 的TCP_client 上传数据温度电压数据到网络调试助手

基于STM32单片机的LwIP协议LwIP 的TCP_client 上传数据温度电压数据到网络调试助手

STM32 + LWIP - Pbuf 配置

stm32以太网的lwip怎么开dhcp