lwip stm32 - http 请求失败

lwip stm32 - http requests failing

我 运行 freeRTOS 和 lwip 1.4.1 与套接字 api 在 stm32 处理器 (stm32f407) 上使用。 总的来说它工作得很好。 我可以使用 udp 和 tcp 发送和接收数据。

但是在 3 到 7 天的时间窗口中,我看到了一个奇怪的行为。

我的问题

每隔 3 到 7 天,我的客户端(Windows 10,每秒发送 1-2 HTTP-Requests)就无法发送这些请求。发生这种情况时,连续有 ~10 个请求失败。在极短的时间内,堆栈根本不会重新生成。

我的猜测

我想我可能在我的 LWIP 配置中配置错误。 因为栈用的很好,应该不会有这个方向的bug

我的以太网设置

服务器和客户端直连,中间没有交换机、集线器或路由器。

服务器(stm32/lwip):

客户端 (win10) eth0:

客户端 (win10) eth1:

我的尝试

目前我有测试 运行 每秒发送 ~7-8 个请求,但错误并不经常发生。 我玩弄了 lwip 配置:

但是一切都没有改善这个连接问题。 会不会是因为客户端经常重复使用的端口号,导致了这个问题?

这里有 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

这似乎是内存问题,但由于它是暂时的,所以可能是某事超时了。 我建议使用 LwIP 的内存统计功能,并启用 ARP 调试消息。

我有一份新工作,不再处理这个问题。

在我陈述我的新工作之前,我可以证明这不是 LwIP 上的内存问题(我定义了不合理的大型 pbuf 和内存池),它们从未达到极限。

问题出在 ETH 的 DMA 驱动程序中。一旦到达 DMA 驱动程序的内存链末端,链元素就再也没有被释放,所以我 运行 进入 RBU(接收缓冲区低于 运行)问题并且 RBU 标志再也没有被重置并且 DMA ETH驱动程序挂在这个 RBU 中断中(即使有足够的 LwIP buffs 可以从 DMA 链写入)。所以我对 DMA 驱动程序添加了一个大锤修复并禁用了 RBU 中断(我在多种情况下轮询 RBU 标志并在需要时清除它,然后开始再次从 ETH 读取)。

我想从那以后问题或多或少“解决了”。不好,但它有效。

我得到了我以前工作单位的同事的一些信息: RBU 中断和清除不起作用,因为我们使用的 CAN 堆栈不能很好地与 FreeRTOS 一起使用,繁忙系统上使用的 CAN 堆栈超过 90% CPU 的时间,这导致 ETH 中出现奇怪的行为驱动程序和 LWIP。