代码之家  ›  专栏  ›  技术社区  ›  i3luefire

lwip stm32-http请求失败

  •  1
  • i3luefire  · 技术社区  · 8 年前

    我运行freeRTOS和lwip 1.4.1,在stm32处理器(stm32f407)上使用套接字api。

    我的问题

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

    我想我可能在LWIP配置中配置错误。

    我的以太网设置

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

    • 静态,192.168.168.2
    • 网络掩码,255.255.255.0

    客户端(win10)eth0:

    • 静态,192.168.168.1
    • 网络掩码,255.255.255.0

    客户端(win10)eth1:

    我的尝试

    我使用了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

    lwip configuration:
    

    https://pastebin.com/cW0v4hF6

    2 回复  |  直到 8 年前
        1
  •  0
  •   ofaurax    5 年前

    这似乎是一个内存问题,但由于它是暂时的,它可能是一个超时的东西。

        2
  •  0
  •   i3luefire    3 年前

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

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

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

    RBU中断和清除不起作用,因为我们使用的CAN堆栈在FreeRTOS上工作不太好,在繁忙系统上使用的CAN堆栈占用了超过90%的CPU时间,这导致了ETH驱动程序和LWIP中的奇怪行为。

    推荐文章