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):
- 静态,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
- 更大的 pbufs
- with/without 积压
但是一切都没有改善这个连接问题。
会不会是因为客户端经常重复使用的端口号,导致了这个问题?
这里有 lwip 调试输出的相关部分:
tcp debugging output
这里是 Wireshark 日志:
hole wireshark log:
https://www.file-upload.net/download-12682664/debug_tcp_00001_20170828172950.html
这是我的 lwipopts.h:
lwip configuration:
这似乎是内存问题,但由于它是暂时的,所以可能是某事超时了。
我建议使用 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。
我 运行 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):
- 静态,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
- 更大的 pbufs
- with/without 积压
但是一切都没有改善这个连接问题。 会不会是因为客户端经常重复使用的端口号,导致了这个问题?
这里有 lwip 调试输出的相关部分:
tcp debugging output
这里是 Wireshark 日志:
hole wireshark log:
https://www.file-upload.net/download-12682664/debug_tcp_00001_20170828172950.html
这是我的 lwipopts.h:
lwip configuration:
这似乎是内存问题,但由于它是暂时的,所以可能是某事超时了。 我建议使用 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。