Sockets lwip stm32-http请求失败

Sockets lwip stm32-http请求失败,sockets,ethernet,lwip,stm32f4,Sockets,Ethernet,Lwip,Stm32f4,我在stm32处理器(stm32f407)上运行freeRTOS和LWIP1.4.1,并使用套接字api。 总的来说,它工作得很好。 我可以用udp和tcp发送和接收数据 但在3到7天的时间窗内,我看到一种奇怪的行为 我的问题 每隔3到7天,我的客户端(Windows 10,每秒发送1-2个HTTP请求)就无法发送这些请求。发生这种情况时,会连续出现约10个请求,这些请求都失败了。在很短的时间内,堆栈根本不会重新生成 我猜 我想我可能在LWIP配置中配置错误。 因为堆栈使用得很好,在这个方向上不

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

但在3到7天的时间窗内,我看到一种奇怪的行为

我的问题

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

我猜

我想我可能在LWIP配置中配置错误。 因为堆栈使用得很好,在这个方向上不应该有任何错误

我的以太网设置

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

服务器(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配置:

  • 为堆栈提供更多内存
  • 更多PBUF
  • 更大的PBUF
  • 有/无积压
但这一切都没有改善这个连接问题。 这可能是因为客户机经常重复使用端口号造成的吗

这里是lwip调试输出的相关部分:

tcp debugging output

这里是Wireshark日志:

这里是我的lwipopts.h:

lwip configuration:

这似乎是内存问题,但由于这是暂时的,可能是某件事情超时。
我建议使用LwIP的memory stats功能,并启用ARP调试消息。

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

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

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

问题出在ETH的DMA驱动程序中。当到达DMA驱动程序的内存链末端时,链元素从未被释放,因此我遇到RBU(接收缓冲区欠运行)问题,RBU标志从未再次重置,DMA ETH驱动程序在这个RBU中断中挂起(即使有足够的LwIP缓冲区从DMA链写入)。因此,我在DMA驱动程序中添加了一个大锤修复程序,并禁用了RBU中断(我在多种情况下轮询RBU标志,如果需要,将其清除,然后再次开始从ETH读取)


我认为从那时起,这个问题或多或少得到了“解决”。不太好,但它奏效了。

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

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

问题出在ETH的DMA驱动程序中。当到达DMA驱动程序的内存链末端时,链元素从未被释放,因此我遇到RBU(接收缓冲区欠运行)问题,RBU标志从未再次重置,DMA ETH驱动程序在这个RBU中断中挂起(即使有足够的LwIP缓冲区从DMA链写入)。因此,我在DMA驱动程序中添加了一个大锤修复程序,并禁用了RBU中断(我在多种情况下轮询RBU标志,如果需要,将其清除,然后再次开始从ETH读取)

我认为从那时起,这个问题或多或少得到了“解决”。不太好,但它奏效了

lwip configuration: