我使用在freeRTOS处理器(stm32f407)上使用的socket运行stm32和LWIP1.4.1。总的来说,它运行得很好。我可以用udp和tcp发送和接收数据。
但在3到7天的时间窗里,我看到了一种奇怪的行为。
我的问题
每隔3至7天,我的客户端(每秒发送1-2个HTTP请求的Windows 10 )无法发送这些请求。当发生这种情况时,连续有10个请求失败。在很短的时间内,堆栈就不会再生了。
我猜
我想我可能在我的LWIP配置中错配置了什么。因为堆栈使用得很好,在这个方向上不应该有任何错误。
我的以太网设置
服务器和客户端直接连接,中间没有交换机、集线器或路由器。
服务器(stm32 32/lwip):
client (win10) eth0:
client (win10) eth1:
我的尝试
目前,我正在运行的测试是每秒发送7-8个请求,但是错误并不适用于更多的情况。我玩了lwip配置:
但一切都没有改善这个连接问题。这是否是因为客户端经常重复使用的端口号,从而导致了这个问题?
这里有lwip调试输出的相关部分:
tcp debugging output在这里,Wireshark日志:

hole wireshark log:我的伊wipoptsh:
lwip configuration:发布于 2020-07-08 10:20:43
我有了一份新工作,不再从事这方面的工作。
在我声明我的新工作之前,我可以证明这不是LwIP上的内存问题(我定义了不合理的大型pbufs和内存池),它们从未达到极限。
问题在于ETH的DMA驱动程序。当到达DMA驱动程序的内存链端时,链元素从未被释放,因此我遇到了RBU (接收缓冲区欠运行)问题,RBU标志再也没有被重新处理,而DMA ETH驱动程序挂在这个RBU中断中(即使有足够多的LwIP缓冲区从DMA链写入)。因此,我在DMA驱动程序中添加了一个大锤修复程序,并禁用了RBU中断(我在多种情况下轮询RBU标志,并在需要时清除它,然后开始从ETH重新读取)。
我认为从那以后,这个问题或多或少已经“解决”了。不太好,但成功了。
在我以前的工作地点,我得到了同事的一些信息: RBU中断和clear没有工作,因为我们使用的CAN堆栈与FreeRTOS不太好,CAN堆栈用于繁忙系统的CPU时间远远超过90%,这使ETH驱动程序和LWIP中的奇怪行为更加严重。
发布于 2020-04-30 06:28:51
这似乎是一个记忆问题,但由于这是暂时的,它可能是一个超时的东西。我建议使用LwIP的内存统计函数,并启用ARP调试消息。
https://stackoverflow.com/questions/45935885
复制相似问题