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.

[参考译文] RTOS/TM4C1292NCPDT:TI NDK 中的背负式支持

Guru**** 2393095 points
Other Parts Discussed in Thread: AM3357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/707807/rtos-tm4c1292ncpdt-piggybacking-support-in-ti-ndk

器件型号:TM4C1292NCPDT
主题中讨论的其他器件:TDA2AM3357

工具/软件:TI-RTOS

您好!

请在以下链接中找到有关我的产品描述的更多信息。

是否有任何选项可配置 TI NDK 以支持 ACK 数据包的背负方法?

此致

巴拉

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

    唯一可以禁用 TCP ACK 行为的方法是修改 NDK TCP 代码。

    我不能真正建议您如何准确地执行此操作、因为从我可以告诉您的内容来看、如果您禁用 ACK 数据包、则您将完全中断 TCP。

    如果出于某种原因您不关心这一点、则需要修改的代码位于函数 TcpOutput 中的 NDK 文件 ti/NDK/stack/tcpout.c 中。

    但是、在我继续之前、请注意、如果您沿着这条路线行驶并遇到问题、很遗憾、TI 不能支持您进行这样的修改。

    说过了...

    在此函数中、您可以看到 ACK 数据包将设置 TF_ACKNOW 或 TF_DELACK 标志:

    //在543行附近
    if (pt->t_FLAGS &(tf_ACKNOW|tf_DELACK))
    TCPS.SndAcks++; /* Peek ACKS 已发送*/

    因此,您可以在类似的 if 语句中使用这些标志来过滤掉实际发出 ACK 数据包的调用,IPTxPackag()在第697行附近。

    再说一次,我看不出如何在不中断 TCP 的情况下做到这一点...

    另一个想法是、如果您的 Modbus 协议内置了 ACK、为什么不在 UDP 上运行呢?

    祝您好运、

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

    在制定和概述这种独特的解决方案时、只有最基本的理解-即公司/我可以、"认可并赞扬"-您的智慧和关心。

    最优秀-请注意、您的努力(两者)得到了认可、并且得到了充分的重视/赞赏!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Steve、

    总的想法是不要禁用 ACK 数据包、而是应将 ACK 数据包附加到 Modbus 数据包响应中。

    请查看下面的 Modbus 通信图。  由于 Modbus TCP 查询将始终包含响应数据包、因此 ACK 数据包可附加到响应数据包、而响应数据包 ACK 将附加到下一个 Modbus 查询数据包。 这可以一直持续到套接字结束。 如果我们这样做、我们希望网络堆栈带宽能够减少并提高 Modbus 事务速率。  

    请注意、我的第三方 Modbus 库不支持 TCP ACK 数据包、只有它会响应 Modbus 查询。

    此致

    巴拉

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

    要开始,请尝试使用 NDK_setsockopt()设置 TCP 选项 tcp_NODELAY。

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

    已测试并发现设置 TCP 选项的 tcp_NODELAY 无效。 仍然可以看到 Modbus Query 和 Response 之间有单独的 ACK 数据包。

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

    这是不幸的、因为它是唯一可能指定延迟 ACK 行为的 NDK TCP 选项
    是实现背负式的典型方法。 其他人在 TI 论坛上发布了同样或类似问题、并尝试使用 tcp_NODELAY 实现延迟 ACK 但未成功。 显然、这是 TI NDK TCP 实现的缺陷。
    查看博文:

    e2e.ti.com/.../2550591
    RTOS/TDA2:包含有效载荷的 TCP ACK 段

    e2e.ti.com/.../647489
    RTOS/AM3357:NDK 2.25.1.11中的 TCP
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Steve、

    [引用用户="Steven Connell"]
    在此函数中、您可以看到 ACK 数据包将设置 TF_ACKNOW 或 TF_DELACK 标志:

    //在543行附近
    if (pt->t_FLAGS &(tf_ACKNOW|tf_DELACK))
    TCPS.SndAcks++;//发送 Peek ACKS */

    因此、您可以在类似的 if 语句中使用这些标志来过滤掉实际发送 ACK 数据包的调用、IPTxPackag()在第697行附近。[/quot]正如您建议的、我们在 tcpout.c 的第697行中进行了如下修改。

     

     /*发送数据包*/

     

                   if (pt->t_FLAGS &(tf_ACKNOW|tf_DELACK))

                                   错误= IPTxPack( pPkt,

                           SockGetOptionFlags(pt->hSock)& FLG_IPTX_SOSUPPORTED );

    但我们仍会单独获取 ACK 数据包。 请查看下面的 Wireshark 捕获。

    请建议我们如何延迟 NDK 中的 ACK 数据包?

    此致

    巴拉