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.

[参考译文] TMS320F28388D:描述符和数据缓冲区的内容不匹配(再次)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1501550/tms320f28388d-the-contents-of-the-descriptor-and-data-buffer-do-not-match-again

器件型号:TMS320F28388D
主题中讨论的其他器件:C2000WARETMDSCNCD28388D

工具/软件:

我正在重新发布这个线程,因为它可能已经被埋葬了。

尊敬的专家:

处理从以太网接收的数据时、描述符指示的信息可能与数据缓冲区的内容不匹配。

问:您能告诉我如何避免这种情况吗? 如果当前信息不够、请告诉我我应该检查哪些要点。

我的客户正在使用以太网和 F28388D、并评估 LWIP。 这是 这一主题的延续。

当 PC 和 F28388D 与 LAN 电缆连接时、会出现此现象。 特别是当 PC 建立链路时、许多数据包会流动、因此处理过程可能无法跟上、内存可能会被重写。

它们使用一个名为 KSZ8794的交换机作为以太网 PHY。 此交换机具有多个端口、并将一个字节的标识信息(TailTag)添加到从外部接收的数据中。 需要删除这些标识信息、但数据会添加到接收到的数据的末尾(在 FCS 之前)。 因此、有必要从接收到的数据的数据长度(pPacket->validLength)信息中识别数据的位置并对其进行提取。 但是、有时数据长度(pPacket->validLength)表示的位置包含的内容与实际数据不同。

Wireshark 日志调查的结果表明、当接收函数处理数据长度(pPacket->validLength)时、稍后发送的数据将存储在存储器中、从而导致提取不正确的 TailTag。 使用 Wireshark 检查相同的日志时、可以确认数据内容指示的位置存在正确的 TailTag。

下面的示例代码用作基址、中断发生后会立即禁用、并在缓冲区处理完成后释放中断。
: \libraries\communications\Ethernet\third_party\lwip\examples\enet_lwip

他们在中断处理期间复制接收缓冲区的内容(f2838xif_receive ())、然后在复制后设置断点并比较结果。
复制缓冲区在停止在断点处时的内容与接收缓冲区不同、具体而言、复制缓冲区的内容旧了几倍。

此致、
正常

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

    尊敬的专家:

    是否有任何更新?

    此致、
    正常

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

    尊敬的专家:

    很抱歉耽误你。 您能告诉我这种情况吗?

    如果您在这里很难回答、 我们可以在私人聊天中进行讨论。

    此致、
    正常

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

    尊敬的 O.H:

    1. 我想在 EVM 上重现这个问题。   如果可能、您能否分享如何在不使用 KSZ8794的情况下在本地重现此问题?

    2. 您能否分享您正在使用的 C2000Ware 版本?

    3. 能否分享 Wireshark 转储/片段以显示数据包中的错误。

    此致、
    Pradeep

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

    您好  Pradeep、

    感谢您的答复。 很抱歉耽误回复。 以下是客户的一些意见。

    1.  我想在 EVM 上重现此问题。   如果可能的话,请分享如何在本地重现此问题而不使用 KSZ8794吗?[/报价]

    我使用 TMDSCNCD28388D 对其进行了测试。
    我尝试两次在接收功能中保存到内存并比较差异。
    在我检查的示例中、当连续出现长度为110的数据包(间隔约为100us)时、我能够确认 buf 的内容在接收中断函数期间发生了变化。
    当收到的数据连续出现时、我们似乎可以确认一个与 Desc 和 buf 的内容不同的症状类似的条件。
    当 TailTag 与 KSZ 一起添加时、这更明显、但在没有 TailTag 的情况下、这种情况似乎不太可能发生。

    我附加了源文件(f2838xif.c)。
    我将在私人聊天中发送验证材料和整个项目。
    我尝试替换 examples/enet_lwip_udp 工程中的 f2838xif.c、但无法确认任何存储器不匹配。

    2.  您能否分享您正在使用的 C2000Ware 版本?

    C2000Ware 还检查了5.04、但实际源参考值为5.01。

    3.  您能否分享 Wireshark 转储/代码片段以显示数据包中的错误。

    我会在私人聊天中发送材料。

    此致、
    正常

    e2e.ti.com/.../6557.f2838xif.c

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

    您好、

    请问 genericISRCustomcount 和 genericISRCustomRBUcount 的值是什么 ?

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

    您好、

    以下是一些客户意见。

    请问 genericISRCustomcount 和 genericISRCustomRBUcount 的值是什么 ?

    当在 controlCARD 上接收到连续数据时、我们确认了这一点、并且​​在接收处理函数之前和之后保存在缓冲区中的值不同(不匹配)。
    当数据以大约81uS 或85uS 的间隔发送时、似乎发生了这种不匹配。

    此时、"genericISRCustomcount"和"genericISRCustomRBUcount"保持为零。 ("genericISRCustomROVcount"和"genericISRCustomRIcount"也保持为零。)
    当没有发生不匹配时、"genericISRCustomcount"和"genericISRCustomRBUcount"有时会变为1。

    使用 KSZ8794时获得了相同的结果。

    此致、
    正常

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

    您好  Pradeep、

    您能否接受我朋友的请求、以便我向您发送错误数据包的内容?

    此致、
    正常

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

    您好、

    我无法重现同样的问题。 由于您提到缓冲区损坏、我建议您增加缓冲区的数量、以便每个缓冲区都是这样

    diff --git a/examples/enet_lwip/cm/enet_lwip.c b/examples/enet_lwip/cm/enet_lwip.c
    index 5dc6a36..42b3af9 100644
    --- a/examples/enet_lwip/cm/enet_lwip.c
    +++ b/examples/enet_lwip/cm/enet_lwip.c
    @@ -70,7 +70,7 @@ extern uint16_t constRunSize;
     //
     //*****************************************************************************
     
    -#define ETHERNET_NO_OF_RX_PACKETS   2U
    +#define ETHERNET_NO_OF_RX_PACKETS   8U      //2U
     #define ETHERNET_MAX_PACKET_LENGTH 1538U
     #define NUM_PACKET_DESC_RX_APPLICATION 8
     
    @@ -163,19 +163,24 @@ SysTickIntHandler(void)
     //  Rewrite this API for custom use case.
     //
     //*****************************************************************************
    +uint32_t Ethernet_numGetPacketBufferCallbackCustom = 0;
     Ethernet_Pkt_Desc* Ethernet_getPacketBufferCustom(void)
     {
         //
         // Get the next packet descriptor from the descriptor pool
         //
    -    uint32_t shortIndex = (Ethernet_numGetPacketBufferCallback + 3)
    +    uint32_t shortIndex = (Ethernet_numGetPacketBufferCallbackCustom + 3)
                     % NUM_PACKET_DESC_RX_APPLICATION;
     
         //
         // Increment the book-keeping pointer which acts as a head pointer
         // to the circular array of packet descriptor pool.
         //
    -    Ethernet_numGetPacketBufferCallback++;
    +    Ethernet_numGetPacketBufferCallbackCustom++;
    +    if(Ethernet_numGetPacketBufferCallbackCustom == NUM_PACKET_DESC_RX_APPLICATION)
    +    {
    +        Ethernet_numGetPacketBufferCallbackCustom = 0;
    +    }
     
         //
         // Update buffer length information to the newly procured packet
    @@ -446,7 +451,7 @@ Ethernet_init(const unsigned char *mac)
         // Receive packet callback on Receive packet completion interrupt
         //
         pInitCfg->pfcbRxPacket = &Ethernet_receivePacketCallbackCustom;
    -    pInitCfg->pfcbGetPacket = &Ethernet_getPacketBuffer;
    +    pInitCfg->pfcbGetPacket = &Ethernet_getPacketBufferCustom;
         pInitCfg->pfcbFreePacket = &Ethernet_releaseTxPacketBufferCustom;
     
         //
    @@ -454,6 +459,7 @@ Ethernet_init(const unsigned char *mac)
         //Packets. This should be accessible by the Ethernet DMA
         //
         pInitCfg->rxBuffer = Ethernet_rxBuffer;
    +    pInitCfg->numChannels = 1U;
     
         //
         // The Application handle is not used by this application
    diff --git a/examples/enet_lwip/cm/lwipopts.h b/examples/enet_lwip/cm/lwipopts.h
    index 845ca58..3b30f21 100644
    --- a/examples/enet_lwip/cm/lwipopts.h
    +++ b/examples/enet_lwip/cm/lwipopts.h
    @@ -69,7 +69,7 @@
     //#define MEMP_NUM_NETCONN                4
     //#define MEMP_NUM_TCPIP_MSG_API          8
     //#define MEMP_NUM_TCPIP_MSG_INPKT        8
    -#define PBUF_POOL_SIZE                    24    // Default 16, was 36
    +#define PBUF_POOL_SIZE                    10    //24    // Default 16, was 36
     缓冲区将由单个 DMA 描述符保存、并测试相同问题是否可重现。

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

    尊敬的 Gouri Siva M:

    感谢您的支持。

    以下是客户的评论。

    我无法重现同样的问题。 由于您提到缓冲区损坏、我建议您增加缓冲区数量、以便每个
    缓冲区将由单个 DMA 描述符保存、并测试相同的问题是否可重现。

    我之前检查过缓冲区大小、然后再次检查过、但似乎没有任何效果。
    在附加的注释文件中、添加了"pInitCfg->numChannels = 1U;"、所以我也检查了它、但它没有效果。
    (我在私人聊天中发送了详细信息。)

    我无法重现同样的问题。 [/报价]

    我认为、如果连续的数据包紧密连续、就会发生这种情况。
    另外、您能否检查第一次它是否为空?
    为了进行验证,我们将适当数量的数据存储在确认缓冲区中。 但是、如果我们在将数据存储在缓冲区中时不限制数据长度、我认为这是第一次包含空数据。

    问:我相信这基本上是由于调用中断和数据存储在缓冲区之间的差异造成的,但你对此有何看法?
    以下帖子是一个类似的情况。
    在连续接收期间、数据似乎丢失、并且中断不足以处理它、因此它切换到轮询。
    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1292322/tms320f28388d-ethernet-issues---tx-missing-interrupt-and-delayed-tx-packet-transmission/4936233

    此致、
    正常

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

    补丁已在私人聊天中提供给客户。

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

    为了使用8个缓冲区、 应使用修改后的 Ethernet_getPacketBufferCustom、并将其分配给修补程序中给出的 pInitCfg->pfcbGetPacket。 这将确保每个 DMA 描述符将保存一个唯一的缓冲区。 在该补丁中、我们仅使用一个 DMA 通道