This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] J784S4XEVM:lwIP TCP 客户端连接导致系统挂起和 ping 停止

Guru**** 2916330 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1650026/j784s4xevm-lwip-tcp-client-connect-causes-system-hang-and-ping-stops

器件型号: J784S4XEVM

您好:

我目前正在 J784S4_EVM 环境中使用 lwIP 测试 TCP 客户端实施。

现有的 TCP 服务器实现工作正常。 当只有 TCP 服务器正在运行时、ping 工作正常。

但是、当我添加 TCP 客户端线程并调用 netconn_connect()lwip_connect()时、系统似乎挂起、ping 停止响应。

行为如下:

  • 网络接口启动成功。

  • 建立链路后、ping 立即起作用。

  • 只要 TCP 客户端尝试连接、ping 就会停止响应。

  • 系统在连接阶段似乎停止运行。

示例日志:

Network interface is ready. Starting TCP Client.
TCP client connecting to 192.168.70.142:50001

此日志后、不再打印任何日志、ping 也不再起作用。

我首先使用 netconn API 进行测试:

conn = netconn_new(NETCONN_TCP);
err = netconn_connect(conn, &server_ip, TCP_CLIENT_SERVER_PORT);

系统在期间似乎挂起 netconn_connect()、ping 也停止。

然后、我更改了实现、将 lwIP 套接字 API 与非阻塞连接结合使用、并 select()

sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
lwip_fcntl(sock, F_SETFL, flags | O_NONBLOCK);

ret = lwip_connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));

但是、结果是相同的。 日志在尝试连接后立即停止、ping 停止响应。

TCP 客户端线程是使用创建的 sys_thread_new()

sys_thread_new("tcpipv4_client_thread",
               tcpipv4_client_thread,
               NULL,
               DEFAULT_THREAD_STACKSIZE,
               DEFAULT_THREAD_PRIO);

lwIP tcpip_thread 也是使用 sys_thread_new() 内部创建的 tcpip_init()

sys_thread_new(TCPIP_THREAD_NAME,
               tcpip_thread,
               NULL,
               TCPIP_THREAD_STACKSIZE,
               TCPIP_THREAD_PRIO);

我怀疑 TCP 客户端线程优先级可能会干扰 tcpip_thread 或以太网 RX/lwIP 处理线程。  

作为参考、TCP 服务器使用类似的线程创建方法正常工作、但该问题仅在 TCP 客户端尝试连接时发生。

谢谢你。

 

No valid MAC address found in EEPROM, falling back to static address
EnetMcm: CPSW_2G on MCU NAVSS
PHY 0 is alive
EnetPhy_bindDriver: PHY 0: OUI:080028 Model:23 Ver:01 <-> 'dp83867' : OK
Host MAC address: 70:ff:76:1d:92:c1
[LWIPIF_LWIP] Enet LLD netif initialized successfully
Enet lwIP App: Added Network IP address I/F ti0: 192.168.70.210
Waiting for network interface to come UP...
IPC_MPU1_0 Start...

IPC_Setup done .....

mcu1_0 <--> mcu2_0, Ready Completed

mcu1_0 <--> mcu2_1, Ready Completed

mcu1_0 <--> mcu3_0, Ready Completed

mcu1_0 <--> mcu3_1, Ready Completed

mcu1_0 <--> mcu4_0, Ready Completed

mcu1_0 <--> mcu4_1, Ready Completed

All tests have passed
Cpsw_handleLinkUp: Port 1: Link up: 1-Gbps Full-Duplex
MAC Port 1: link up
Network interface is ready. Starting TCP Client.
TCP client connecting to 192.168.70.142:50001
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我们还没有使用 LWIP 堆栈验证 TCP 客户端、我们只使用 iperf 验证了 TCP 服务器。

    此致、
    Sudheer

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    通过使用 netconn_new_with_callback() 而不是 netconn_new()、使用启用非阻塞模式、 netconn_set_nonblocking()并根据从回调函数接收到的事件控制连接流、可以解决此问题。