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/AM3356:UDP 发送丢包

Guru**** 2540720 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/609085/rtos-am3356-udp-transmit-packet-drop

器件型号:AM3356
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我有一个应用程序、它有两个不同的线程 、将 UDP 数据帧传输到两个不同的 IP 地址。    每个以每秒100帧的速率传输。

只要两个线程都发送到网络上的现有 IP 地址、就会按预期进行传输。

当其中一个目标 IP 地址不存在时、就会出现此问题。     当一个线程尝试向不存在的目标 IP 地址提供 UDP 数据帧时、我会看到第二个线程发送到关联 的第二个目标 IP 地址的 UDP 数据中出现周期性瞬时 UDP 传输丢失。    请注意、当预期的10毫秒周期帧在大约30毫秒内未接收到时、第二个目标 IP 地址/节点会检测到问题。   我不确定帧是延迟还是丢弃。

我注意到、第二个线程与其关联的目标 IP 地址/节点之间的通信中断有20秒的时间。    我猜这与 ARP 中的20秒超时相关、与第一个线程关联的不存在的目标 IP 地址/节点。

我当前配置的 NDK 优先级低于我的应用程序线程。

问题是否是第一个线程尝试传输 UDP 帧而导致的 ARP 的结果?    将 NDK 配置为比我的应用程序线程更高的优先级会解决此问题吗?    是否有任何其他选项可用于解决此问题。

谢谢、

标记

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Biser、

    我对 NDK 做了额外的探索(2.24.1.18)、并认为我可能会处理可能导致我的问题的原因。

    检查以下内容:  文件 lliout.c、 函数 LLITxIpcPacket 、从第141行开始:

    当我的通信问题发生时、 我认为由于我的一个线程以 每秒100帧的速率向不存在的 IP 地址发送 UDP 帧、整个数据包池最终出现在 ArpPktQ 上(地址解析不成功)。     另一个同时以类似速率发送 UDP 帧的线程由于空数据包池而无法发送。     当发生 ARP 超时并且不存在的 IP 地址的 ArpPktQ 被转储回数据包池时,问题会定期得到解决。   第二个线程将再次能够发送 UDP 帧、直到池再次清空。

    我认为该问题涉及到 SDOCM00088612的修复、该修复涉及到在 ArpPktQ 队列中放置数据包。    此修复程序似乎是为了解决传输需要分段到 IP 地址(没有已解析的 IP 地址)的帧时出现的问题。    队列确保了 IP 地址解析后发送的整个分段帧。

    此修复程序的可能不可预见的后果是、以更高的速率向不存在的 IP 地址发送帧时、可能会暂时将大量数据包放置在 ArpPktQ 上。   在极端情况下、当数据包池变空时、可能会导致在间隔期间丢失所有以太网通信。

    一种可能的解决 方案(至少对于我的应用而言)是将 SDOCM00088612修复程序备份出来、因为我的应用程序不会发送足够大的帧来要求碎片化。    我担心这样做会产生其他不可预见的后果。

    我希望适当的专家能够就我对这一问题的评估提出意见,并提出可能的解决办法。

    谢谢、

    标记    

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

    您能否尝试早期的 NDK 版本2.24.0.11 (software-dl.ti.com/.../index_FDS.html) 来确认您的评估? SDOCM00088612修复程序位于此主要版本的顶部。

    您还可以在以下位置找到所有 NDK 版本: software-dl.ti.com/.../index.html。

    从发行说明中可以看到,维护版本2.24.1.18之后,解决了多个问题,但是这些修复程序可能与您的应用程序无关。

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

    您好、Garret、

    我已经了解了 NDK 2.24.0.11和最新版本。   我认为,在最新版本中,没有任何明显的解决办法可以解决我所看到的问题。

    我正在尝试向 NDK 2.24.1.18 LLIOUT.C 添加更改、如下面的快照中所示。       更改的目的是仅保留 ARP 队列中包含未解析 MAC 地址的最后一个 UDP 帧。    更改将允许将消息的所有片段放置在 ARP 队列中, 但不能保证队列中的完整帧数不超过一个。

    我当前正在尝试重建 NDK、并且 FTD/SOCKET.C 存在未定义 SA_IN 结构元素的问题。

    下面是我修改 NDK.MAK 文件的方式。

    我确信我做了一些错误的事情--只是不确定是什么!!!      我们希望获得有关构建工作的任何指导、

    在我成功构建 NDK 后、我计划使用上述修复程序进行测试、并查看 NDK 2.24.1.18的小代码加法是否解决了问题。

    感谢您的支持、

    标记

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

    Mark、

    您描述如何修改 NDK.MAK 文件的部分缺失、但下面是构建 NDK 的指令: processors.wiki.ti.com/.../Rebuilding_The_NDK_Core_Using_Gmake

    您可以尝试以下操作:

    设置 XDC_INSTALL_DIR=C:/ti/xdctools_3_31_02_38_core  
    设置 SYSBIOS_INSTALL_DIR=c:/ti/bios_6_45_00_19
    设置 GNU.targets.arm.A8F=c:/ti/ccsv6/tools/compiler/gcc-arm-none-eabi-4_8-2014q3
    路径=%path%;C:\ti\xdctools_3_31_02_38_core
    gmake–f NDK.mak 清理
    gmake–f NDK。mak 全部

    此致、Garrett

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

    您好、Garret、

    让我澄清一下我在 NDK 重建(版本2.24.1.18)方面遇到的问题。

    当我执行重建(make -f ndk.mak all)时、我在源代码中看到未修改的意外编译错误。 具体而言、我在"FDT/SOCKET.C"的第107、216、308、394、488、733、1175、1295行看到错误错误为:未定义标识符"SA_IN"

    希望附件中的文本文件为: make -f NDk.mak all > ndk_make_out.txt、以防有助于确定重建 问题的原因。

    e2e.ti.com/.../ndk_5F00_make_5F00_out.txt

    我不理解为什么引用了"SA_IN"、因为发布说明状态为:

    删除 sa_len、sin_len 和 sin6_len 套接字地址结构成员

    从 NDK 2.24开始、已重新定义套接字地址结构以删除以下字段:

    sa_len

    Sin_len

    sin6_len

    我使用的是 SYS/BIOS 6.41.00.26、CCSv6、XDCtools 3.30.04.52、TI 代码生成工具 Cortex-A8 5.1.9。 这些都符合 NDK 2.24.1.18版本说明中的兼容性信息。

    我已修改了 NDK.MAK 中的以下行、如下所示:

    destdir ?= C:\ti\NDK_2_24_01_18

    XDC_INSTALL_DIR ?= C:\ti\xdctools_3_30_04_52

    SYSBIOS_INSTALL_DIR ?= C:\ti\BIOS_6_41_00_26

    TI.targets.arm.elf.A8Fnv ?=C:\ti\ccsv6\tools\compiler\arm_5.1.9

    A8Fnv 目标与 CCSv6中的目标一致。

    在我看来,这不是一个工具链问题--而是一个特定于 FDT/SOCKET.C 源文件的代码问题,我肯定需要帮助来确定如何继续。

    关于我在高频率将 UDP 帧发送到不存在的 IP 地址时 NDK 栈停止的原始问题,下面是我要添加到 lliout.c 的代码--在 PBMQ_enq 调用的正上方插入大约156行。

    //////////////////////////////////////////////////////////////////////// 堆栈停止固定增加////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /*

    * SDOCM00088612的附加修补程序:

    *如果这是第一个或唯一的数据包,则清除

    * ARP 数据包队列。 请注意、测试针对的是片段偏移

    *为零-对于碎片化的或来说就是如此

    *未分段的数据包。 一旦 ARP que 为空、则添加

    *新的第一个/唯一数据包。 是否存在其他碎片数据包

    *来了,它们也将被添加到 ARP 队列中

    *

    if (((HNC16 (((IPHDR *)(pPkt2->pDataBuffer + pPkt2->DataOffset))->FlagOff)& 0x1fff)==0)

    //正在处理第一个/唯一一个数据包,并且需要 ARP,所以如果有的话

    // ARP 队列中的其它数据包将它们返回到池中,并输入最新的数据包

    // ARP 队列中的数据包

    while ((pCurPkt=PBMQ_DEQ (&(plli->ArpPktQ))!=空)

    PBM_FREE (pCurPktt);

    //////////////////////////////////////////////////////////////////////// 加法结束//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    感谢您在这方面的帮助、

    标记

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

    请忽略重建问题。 我刚刚下载了 NDK 2.24.1.18的新副本、并与我的工作副本进行了比较。 我发现工作副本中的 include 发生了变化、导致了我遇到的编译错误。

    今天下午我将测试代码更改----但希望对更改的可行性发表任何评论。

    谢谢、

    标记