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.

[参考译文] EK-TM4C1294XL:UDP 发送到启动时发出

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1198933/ek-tm4c1294xl-udp-sendto-issue-on-startup

器件型号:EK-TM4C1294XL

您好!

我注意到尝试使用 sendto ()发送 UDP 数据包时出现了一个奇怪的问题。 当我尝试在初始化后过早定期发送时、会出现此问题。 症状:

- Sendto 不起作用,报告 ENOBUFS 的时间为15-30秒,最终以正确的频率恢复并开始发送。 (在 Wireshark 和 SocketTest 中观察网络流量)

-如果我在开始定期发送之前添加延迟、我根本看不到问题、定期发送会在开始时立即开始工作。 (Sendto 始终返回成功发送的正确字节数、而不是-1 (当它不起作用且流量在 Wireshark 和 sockettest 中可见时)

是否有人知道导致这种情况的原因?

工具:

TM4C1294开发套件

TI-RTOS TIVAC 2.16

NDK 2.25

计划:

Enet_udpecho_client_tirtos 的修改版本、使用时钟模块定期发送(大约100-200ms)而不是回波。

也不能完全确定这是否是正确的论坛、请告诉我是否应该移动它。

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

    您好!

     很抱歉、我不确定问题是什么。 读取 NDK 参考指南时、错误代码指示内存分配失败。  

    进一步阅读 sendto 描述  https://pubs.opengroup.org/onlinepubs/009604499/functions/sendto.html 可能是 :如果发送套接字中没有空间来容纳要发送的消息,并且套接字文件描述符没有 O_NONBLOCK 设置, sendto ()应在空间可用之前阻止。 如果发送套接字中没有空间来保存要发送的消息,并且套接字文件描述符确实设置了 O_NONBLOCK, 则 sendto ()将失败。 您能确定您是处于阻塞模式还是非阻塞模式吗? 您可以更改为阻塞模式吗? 可以使用 getsockopt()获取套接字选项的值,使用 setsocketop()设置套接字选项参数的值。  

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

    您好、Charles、

    感谢您的回复。 它似乎在默认情况下处于打开状态,我根据您的建议使用 getsockopt()进行了验证。

    还有其他想法吗?

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

    您好!

     我发现以下两个主题帖存在您报告的类似问题、但我不确定该解决方案 是否适用于您。 可以看一下吗?

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/601850/rtos-dk-tm4c129x-need-memory-for-ndk-as-in-makinghttpserver-settings-ignored-by-xgconf?tisearch=e2e-sitesearch&keymatch=ENOBUFS#

    https://e2e.ti.com/e2eprivate/ficosa/ficosa-sv/f/ficosa-sv-jacinto-forum/1151274/sendto-returns-enobufs/4327024?tisearch=e2e-sitesearch&keymatch=ENOBUFS#4327024

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

    您好、Charles、

    我读取了您的第一个链接、它似乎指向内存问题? 由于我的问题似乎是临时性的、我不确定这是正确的方向。

    我已将以太网发送任务大小设置为1024、数据包不超过20字节。

    该任务使用邮箱、共享套接字和 sendto、这就是它的相关内容。 ROV Classic 报告 stackPeak 为504、heapMem largestFreeSize 为0x2e78。 这对我来说似乎是足够的证据、这不是一个记忆问题、但您的想法是值得欢迎的。

    很遗憾、我无法打开第二个链接。

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

    您好 Sasha、

     第二个线程是内部线程、我没有意识到这一点。 我将整个线程链复制到 Word 文档中。 此线程还具有 ENOBUFS 标志。  

    共享套接字是什么意思?  enet_udpecho_client_tirtos 是否适合您? 我不确定您的应用要求您在 while 循环中发送数据、而在接收特定事件和发送数据之间没有某种形式的同步。 如果没有同步、您唯一的活动任务是在 while 循环中持续发送数据、我认为这些数据可能导致缓冲区溢出。  

    e2e.ti.com/.../Sendto-Returns-ENOBUFS.docx

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

    您好、Charles、

    内部线程似乎显示了一些配置更改、如果这确实是内存问题、可能会有所帮助、我将尝试这些更改并返回给您。

    对于共享套接字、我使用 fdShare 在接收和发送任务之间共享套接字。 正如我说过的、我正在使用示例项目的修改版本、我已经在相当大的裕度上偏离了该版本。 此外、我不会以无限 while 循环发送数据、我会定期发送数据(每200ms 一次)。

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

    您好 Sasha、

     我想在帖子开始时、您说过如果您添加200ms 的延迟、那么就没有问题了。 您是要进一步缩短延迟吗? 您能不能告诉您可以在多短的时间内成功传输数据?