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.

[参考译文] TM4C129ENCZAD:UDP recvfrom ()一段时间后停止工作

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/946237/tm4c129enczad-udp-recvfrom-stops-working-after-some-time

器件型号:TM4C129ENCZAD

我们的应用程序在 UDP 套接字上使用 recvfrom() API 来侦听来自 PC 的广播请求(请注意,我们已将 UDP 套接字设置为非阻塞模式)。  recvffrom () API 在上电后的第一分钟或第二分钟内工作正常,并且从 PC 接收数据也正常。  但是几分钟后,即使 PC 向端口发送 UDP 消息,recvfrom () API 也不再返回大于0的值。  我已经确认,当 API 正常工作并且不能正常工作时,传递给 recvfrom ()的所有参数都是相同的。  每次在特定点之后调用 EWOULDBLOCK 时、Recvfrom API 都会返回 EWOULDBLOCK。

我们的产品使用的是 TI RTOS 2.16.1.14、该版本似乎是该微处理器的最新版本。  请提供任何指导。   

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

    您好 Mitch、

     如果返回 EWOULDBLOCK、则表示套接字指定为非阻塞或超时已过期。 recvfrom()通常是一个阻塞 API。 您如何使其成为非阻塞式? 您是否使用 setsockopt()将超时配置为零或超短超时,导致超时在 PC 发送数据包之前过期? 如果您使用 setsocketopt 配置短超时值、您是否可以增大并查看是否会产生差异?

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

    您好、Charles、

    我们使用 setsockopt()设置1微秒的接收超时:

    //将超时设置为1us
    结构时间值超时;
    timeout.tv_sec = 0;
    timeout.tv_usec = 1;
    if (setsockopt (m_udp_socket[arry_idx]。handle、SOL_socket、SO_RCVTIMEO、超时、sizeof (timeout))< 0)
    {
    Arry_idx = ERROR_FAIL_U8;
    PRINTFD (TPRINTF_LEVEL_network | TPRINTF_LEVEL_ERROR、Ethernet_SET_UDP_SOCKET_OPTION 失败、false、
    "错误-设置 Etherent UDP rcv 超时失败。 代码=%d\n",call_fdError();
    } 


    然后,我们在循环中调用 recvfrom (),以处理来自 UDP 套接字的传入消息。  下次我在办公室时、我将增加超时时间、看看这是否有用。

    谢谢、

    Mitch

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

    您好、Charles、

    我将超时时间从1微秒增加到10毫秒、但仍然存在以下问题:

    //将超时设置为1us
    结构时间值超时;
    timeout.tv_sec = 0;
    timeout.tv_usec = 10000;
    if (setsockopt (m_udp_socket[arry_idx]。handle、SOL_socket、 SO_RCVTIMEO、超时、sizeof (timeout)< 0)
    {
    Arry_idx = ERROR_FAIL_U8;
    PRINTFD (TPRINTF_LEVEL_network | TPRINTF_LEVEL_ERROR、Ethernet_SET_UDP_SOCKET_OPTION 失败、false、
    "错误-设置 Etherent UDP rcv 超时失败。 代码=%d\n",call_fdError();
    } 

    Recvfrom ()总是在一个特定点后返回 EWOULDBLOCK。

    如果有更多的想法,将不胜感激。

    谢谢、Mitch

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

    您好 Mitch、

     为了进行实验,如果将 recvfrom()保持在阻塞模式,该怎么办? 您能否澄清您的 MCU 是客户端还是服务器?  

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

    您好、Charles、

    我更改了代码、使 UDP 套接字阻塞、但仍然存在相同的问题。  只要我们的 PC 工具向器件发送消息,它就可以正常工作一分钟或两分钟,并且从插槽中读取55个字节的 recvf()。  但是几分钟后,recvfrom()调用会保持阻塞,并且在 PC 工具向设备发送消息时不返回。

    至于 MCU 是客户端还是服务器、我要说 UDP 端口就像服务器一样工作。  PC 工具使用 UDP 向器件发送消息、并且器件以一些有关自身的信息进行响应。

    如果您希望我尝试其他测试、请告诉我。

    谢谢、Mitch!

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

    您好 Mitch、

     我希望您尝试一些操作。

     1.您能否使用 ROV 来确定是否存在堆栈溢出或内存问题(如堆)? 当你增加任务堆栈和系统堆时、它会产生影响吗?

     TI-RTOS 提供了 udp_echo 示例。 您可以从 Resource Explorer 下载它。 不确定您之前是否运行过此示例。 如果您的 PC 像以前一样发送广播请求、您是否会遇到运行此示例的相同问题? 此示例将 recvfrom()作为分块。 首先尝试分块、您可以修改它、 以便稍后使用 setsockopt 更改超时周期。

     3.如果您当前使用的是更高版本,您可以尝试 XDCtool 3.32.00.06和 TI-RTOS 2.16.00.08吗? 我想确保问题是否与 中 TivaC 2.16.01.14的发行说明中显示的 TI-RTOS 1887有关 

     4、我们先尝试上述三项、然后再尝试下一项、即上述已知问题页面中显示的 TIDRIVERS 1579。

      

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

    您好、Charles、

    我最终决定尝试这些操作、虽然增加堆栈/堆大小无法解决问题、但如果我用 UDP 回显示例替换我们的网络代码、则不会发生此问题。  因此、我认为问题出在我们的代码中的某个位置、并使用 UDP 回显示例作为参考、我应该能够解决这个问题。

    另外、我发现、如果我们在设备和办公室的墙上插孔之间放置以太网交换机、问题就不再发生了。  我不确定这意味着什么、但由于这一原因、此问题的优先级已降低了更多(由于其他更高优先级的任务、此问题已经很低)。

    感谢您的帮助!

    Mitch