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.

[参考译文] TMS320C6457:NDK 库中的 SEND()函数

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/905776/tms320c6457-send-function-in-ndk-library

器件型号:TMS320C6457

此线程与以下 e2e 线程相关。 由于我收到了其他问题、请允许我重新打开此主题。

https://e2e.ti.com/support/processors/f/791/p/895613/3313673#3313673

 

 

大家好、整个团队

由于 Covid-19的情况、我们的客户尚无法查看 ROV 信息。 抱歉。 其他查询如下。

 

1.在以下环境下,您是否曾听到类似的 send()冻结问题?

===

工具:CCS 版本4.2.4.00033

RTOS:SYS/BIOS 6.32.02.39

NDK  :2.23.02.03

===

2. TCP 发送缓冲区大小是否有任何限制? 我是说、此设置是否有最大尺寸定义?

3.客户希望通过其他方式调查此问题,直到获得 ROV 信息。 您能否就此分享您的建议/想法? 首先、客户希望调查此问题是否与硬件站点或软件站点有关。

 

我认为很难回答上述问题、但如果您能够分享您对此的评论、我们将不胜感激。

此致、

宫崎

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

    宫崎

    回复:#1

    当所有输入和输出缓冲器同时变为满状态时、会出现一个常规的 TCP 死锁问题。 下面是一个描述问题的链接。

    如果没有足够频繁地调用 recv(),则可能会发生另一种情况。 在较低的层次上、PBM 资源在发送和接收之间共享。 如果未发生接收、则 PBM 池将耗尽、发送将阻止等待 PBM 资源变为可用状态。

    回复:#2

    最大 TCP 发送缓冲区大小为65535字节。

    r3:#3

    捕获 Wireshark 对问题的跟踪将非常有用。 请附加 Wireshark 日志文件。

    此外、请尝试在 CCS 表达式视图中查看 TCP 统计数据变量。 在视图中输入名称"TCPs"。 在问题发生前后拍摄快照。

    作为恢复机制、您可以向套接字添加5秒超时值。 如果 send()返回超时错误,则可以关闭并重新连接。

    发送和接收套接字上的/* 5秒超时*/
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
    setsockopt (s、SOL_socket、SO_SNDTIMEO、&timeout、sizeof (timeout));
    setsockopt (s、SOL_socket、SO_RCVTIMEO、超时、sizeof (timeout));

    ~Ramsey

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

    您好、Ramsey、

    感谢您的评论和详细想法。 我与客户分享了这些信息。 我希望等待客户的反馈。

    此致、Miyazaki

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

    您好 Ramsey、

    关于 Wireshark 日志、客户迄今无法捕获此日志、因为这种行为很少发生。 但是、根据 Sever-site 分析(tcpdump 日志)、最后一次通信是来自 Linux 服务器的"Ack"。 (似乎客户无法共享此日志)。 在这一点上,您是否可以考虑"所有输入/输出缓冲器碰巧变满"的可能性?

    我认为很难就此发表评论、但是、请允许我提出、因为客户在问。

    如果您能与我们分享您的意见、我们将不胜感激。

    BES 此致、Miyazaki

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

    宫崎

    我认为您需要在堆栈中启用一些调试消息。 《NDK 用户指南》第3.5节提供了一些有关调试应用的信息。 NDK 参考指南第2.5节介绍了有关 DbgPrintf() API 的一些信息。 最好在客户构建中启用此功能。 我将向您返回代码的仪器位置。

    ~Ramsey

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

    宫崎

    尝试检测以下函数:

    /ti/ndk/stack/sock/sock.c:SockSend()
    /ti/ndk/stack/tcp/tcpout.c:TcpOutput()
    /ti/ndk/stack/ip/ipout.c:IPTxPacket()

    一般执行流程是

    SockSend ()->TcpOutput()->IPTxPacket ()

    -DTCP_DEBUG 添加到构建选项中。

    ~Ramsey

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

    您好、Ramsey、

    感谢 您对此分析提供的有用建议。 我与我们的客户分享了您的意见并进行了讨论。 对于调试构建、由于行为不同、客户无法确认发生了此问题。 因此、我们假设很难通过一些调试消息来阐明此问题的根本原因...

    然后,对于 SEND ()/recv ()的超时,客户添加了超时 并尝试验证此问题,但是,我听说 SEND ()没有返回超时错误。

    从该视图的角度来看、

    1.您是否会认为 PBM 池可能会耗尽 ?

    2.当 PBM 池即将用完时,recv()是否也会阻止等待 PBM 资源变为可用?

    请问您的专家对他们有什么建议/意见吗?

    由于缺乏信息、客户了解很难对该问题进行分析。 不过、非常感谢您的建议。 在客户收到专家的意见后,客户计划关闭此主题,直到客户能够获得更多详细数据。

    此致、

    宫崎

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

    宫崎

    是的、PBM 池仍有可能已耗尽。

    NDK 使用的 PBM 池是一个双链接的缓冲区列表。 可以在 CCS Expressions 视图中查看可用 PBM 池的大小。 在表达式视图中输入'PBMQ_free '。 然后展开该项目。 "Count"值指示池中可用的缓冲区数量。

    当 SEND ()故障再次发生时,停止处理器并检查 PBMQ_free Count 值。 如果该值为零,则很可能是 SEND ()锁定的原因。

    如果 PBM 池不为零,则仍有另一种可能性。 驱动程序还具有自己的 PBM 池。 如果这种情况不存在、这也会是一个问题。 最后、驱动程序 EMAC DMA 代码可能有一个缓冲区池。 如果这种情况不存在、它也可能会解释问题。 但是、用于 C6457的网络驱动程序不属于 NDK 团队。 您需要联系处理器团队以了解驱动程序的详细信息。

    PBM 池运行的最可能原因是数据可用时应用程序没有调用 recv()。 最常见的实现方式是创建一个专用任务来接收数据。 此任务将在循环中调用 recv()。 这可确保使用传入数据、并将所有 PBM 缓冲区回收到池中。

    如果 PBM 池为空,则询问 recv()是否会阻止。 是的、可以。 PBM 缓冲器与接收和发送数据路径共享。

    客户是否收集了 TCP 统计数据? 这也可以通过在 CCS Expressions 视图中输入'TCPs'来查看。

    ~Ramsey

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

    您好 Ramsey、

    感谢你的建议。 我同意了您的意见、并收到了有关此问题恢复的询问。

    当发生 PBM 池块问题时,是否有任何恢复过程(硬件重置除外)?

    正如我之前所说的,客户在 send()/ recv()中添加了超时,客户告诉我 send()没有返回超时错误,我的意思是,系统似乎仍处于冻结状态。 如果可能、客户希望了解其他恢复方法。 例如,在问题发生后,如果调用 recv(),您是否会考虑是否有可能解决此死锁?

    很抱歉,如果您将共享其他恢复方法或您对此的评论,我们将不胜感激。

    此致、

    宫崎

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

    宫崎

    目标是避免 PBM 池锁定问题,而不是实施恢复方法。 对于调试、最好确认 PBM 导致锁定、然后向后工作以防止锁定。 如果 PBM 不是故障的根本原因、那么我们需要去别处看看。 客户是否确认在锁定发生时 PBM 池为空?

    如果您已确定 PBM 池是锁定问题的原因,则应通过调用 send()和 recv()来预防它。 这将确保正确的应用行为。 客户是否尝试过此操作?

    最后、如果发生了锁定、则表示应用程序处于故障状态。 唯一的恢复是重新启动。 尝试调用 recv()可能会导致未定义的行为,因为应用程序已经处于故障状态。 但这是最坏的情况。 在正常运行条件下、不应出现此故障。

    ~Ramsey

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

    您好、Ramsey、

    感谢您的分享专家的评论。 非常感谢您的宝贵建议。 我将关闭此主题、直到客户能够获得更多详细数据。

    此致、

    宫崎