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.

[参考译文] PROCESSOR-SDK-AM64X:发送数百个软件包后、调用 EnetDma_submitTxPktQ 时、CPSW 发送将冻结 EnetUdmaStats_addCnt

Guru**** 2448780 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1547653/processor-sdk-am64x-cpsw-send-will-freeze-at-enetudmastats_addcnt-when-calling-enetdma_submittxpktq-after-sending-hundreds-of-packages

器件型号:PROCESSOR-SDK-AM64X


工具/软件:

尊敬的先生:

   我们 使用快速启动 CPSW 示例评估 CPSW 发送函数、我的发送函数如下所示:

while(1)
    {
        EnetQueue_initQ(&txSubmitQ);

        EnetApp_retrieveFreeTxPkts();
        /* Dequeue one free TX Eth packet */
        txPktInfo = (EnetDma_Pkt *)EnetQueue_deq(&gEnetApp.txFreePktInfoQ);
        if (txPktInfo != NULL)
        {
            /* Fill the TX Eth frame with test content */
            txFrame = (EthFrame *)txPktInfo->sgList.list[0].bufPtr;
            memcpy(txFrame->hdr.dstMac, &dstMac[0], ENET_MAC_ADDR_LEN);
            memcpy(txFrame->hdr.srcMac, &srcMac[0U], ENET_MAC_ADDR_LEN);
            txFrame->hdr.etherType = 0x88a4;

            txPktInfo->sgList.list[0].segmentFilledLen = 120;

            memcpy(&txFrame->payload[0U],
                   &layload[0U],
                   txPktInfo->sgList.list[0].segmentFilledLen - sizeof(EthFrameHeader));

            txPktInfo->sgList.numScatterSegments = 1;
            txPktInfo->chkSumInfo = 0U;
            txPktInfo->appPriv = &gEnetApp;
            txPktInfo->tsInfo.enableHostTxTs = false;

            EnetDma_checkPktState(&txPktInfo->pktState,
                                    ENET_PKTSTATE_MODULE_APP,
                                    ENET_PKTSTATE_APP_WITH_FREEQ,
                                    ENET_PKTSTATE_APP_WITH_DRIVER);

//            EnetAppUtils_print("before enqueue txPkt %d \r\n", i);
            /* Enqueue the packet for later transmission */
            EnetQueue_enq(&txSubmitQ, &txPktInfo->node);
        }
        else
        {
            EnetAppUtils_print("Drop due to TX pkt not available\r\n");
        }

//        EnetAppUtils_print("before Transmit %d \r\n", i);
        /* Transmit all enqueued packets */
        status = EnetDma_submitTxPktQ(gEnetApp.hTxCh, &txSubmitQ);
        if (status != ENET_SOK)
        {
            EnetAppUtils_print("Failed to submit TX pkt queue: %d\r\n", status);
        }

        i++;
//        EnetAppUtils_print("before sleep %d \r\n", i);

//        ClockP_usleep(200000U);
    }

但发送 230 个软件包后、该函数将冻结、不再发送软件包、通过查看 JTAG、我发现该函数冻结在 enet_uDMa.c 文件中的 EnetDma_submitTxPktQ -> EnetUdmaStats_addCnt、如下所示:

int32_t EnetDma_submitTxPktQ(EnetDma_TxChHandle hTxCh,
                                  EnetDma_PktQ *pSubmitQ)

{
    EnetPer_Handle hPer = hTxCh->hDma->hPer;
    int32_t retVal = UDMA_SOK;
    Udma_RingHandle ringHandle;

#if ENET_CFG_IS_ON(DEV_ERROR)
    if ((NULL == hTxCh) ||
        (NULL == pSubmitQ))
    {
        ENETTRACE_ERR_IF((NULL == hTxCh), "[Enet UDMA] hTxCh is NULL!!\n");
        ENETTRACE_ERR_IF((NULL == pSubmitQ), "[Enet UDMA] pSubmitQ is NULL!!\n");
        Enet_assert(FALSE);
        retVal = UDMA_EBADARGS;
    }
    else
#endif
    {
#if defined(ENETDMA_INSTRUMENTATION_ENABLED)
        uint32_t startTime, diffTime;
        uint32_t pktCnt, notifyCount;
        startTime = EnetOsal_timerRead();
        pktCnt    = EnetQueue_getQCount(pSubmitQ);
#endif
#if (UDMA_SOC_CFG_UDMAP_PRESENT == 1)
        ringHandle = hTxCh->fqRing;
#else
        ringHandle = hTxCh->cqRing;
#endif
        /* Enqueue descs to fqRing regardless of caller's queue state */
        if (EnetQueue_getQCount(pSubmitQ) > 0U)
        {
            retVal = EnetUdma_submitPkts(hPer,
                                         ringHandle,
                                         pSubmitQ,
                                         hTxCh->hDmaDescPool,
                                         hTxCh->txChPrms.disableCacheOpsFlag,
                                         ENET_UDMA_DIR_TX
#if (UDMA_SOC_CFG_PROXY_PRESENT == 1)
                                         ,
                                         hTxCh->hUdmaProxy
#endif
                                         );
        }

        /* If fqRing ran out of space it is not an error, packets will be re-submitted by application*/
        if (UDMA_ETIMEOUT == retVal)
        {
            ENETTRACE_INFO("TX Channel FQ underflow had occurred\n");
            retVal = UDMA_SOK;
        }

#if defined(ENETDMA_INSTRUMENTATION_ENABLED)
        EnetUdmaStats_addCnt(&hTxCh->stats.txSubmitPktOverFlowCnt, EnetQueue_getQCount(pSubmitQ));
        pktCnt -= EnetQueue_getQCount(pSubmitQ);
        EnetUdmaStats_addCnt(&hTxCh->stats.txSubmitPktEnq, pktCnt);
        diffTime                                                  = EnetOsal_timerGetDiff(startTime);
        notifyCount                                               = hTxCh->stats.submitPktStats.dataNotifyCnt & (ENET_DMA_STATS_HISTORY_CNT - 1U);
        hTxCh->stats.submitPktStats.readyDmaDescQCnt[notifyCount] = hTxCh->hDmaDescPool->count;

        EnetUdmaStats_updateNotifyStats(&hTxCh->stats.submitPktStats, pktCnt, diffTime);
#endif
    }

顺便说一下、Marco ENETDMA_Instrumentation_enabled 对于 CPSW DMA 发送的正常功能是否必不可少? 我可以在哪里关闭它?我可以在哪里关闭它?

   谢谢!

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

    还有一点、我还尝试 在 lib makefile 中禁用 ENETDMA_Instrumentation_enabled、然后重新构建 lib。  EnetDma_submitTxPktQ 仍然发生冻结。 每次当系统停止发送软件包时从 JTAG 停止时、我都会发现 PC 在 ClockP_timerTickIsr 函数中用于处理 ClockP_timerClearOverflowInt 。 然后跳回 EnetDma_submitTxPktQ。 我不知道到底发生了什么、也不知道如何继续调试。

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

    您好、Brian、

    请允许我在一周内尝试重现问题。 我会根据看到的结果回复您。 同时、请分享您使用的 MCU+ SDK 版本的详细信息、环境(定制电路板或 TI 评估模块)、发送的数据包大小以及有关该应用不同于 MCU+ SDK 的任何其他信息。 此示例也需要更改电路板才能正常运行。 有关详细信息、请参阅以下链接:

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/EXAMPLES_ENET_LAYER2_CPSW_FAST_STARTUP.html#autotoc_md1641

    此致、
    Teja。

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

    尊敬的 Teja:

       好的。 谢谢!

       我的羡慕是这样的:

    CCS 版本:12.8.1

    SDK 版本: mcu_plus_sdk_am64x_10_01_00_32

    电路板:定制、芯片:AM6442F、CPSW RGMII1 上的 PHY:DP83867、无 I2C EEPROM 来存储 MAC 地址

    发送的数据包:我尝试了 60,128 和 512 字节

       顺便说一下、由于时间线的限制、我们不得不改用 L2 cpsw 示例、该示例使用 FreeRTOS 作为基本起点、以满足 9 月的节目需求。 现在、它可以在 FreeRTOS 下工作。 但下一步将再次回到赤马特尔、尝试提高性能。 我们期待您的测试结果。 再次感谢您!

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

    您好、Brian、

    我将尝试在测试台上重现此问题。 您可以在 2 周内获得结果。 在我能够重现问题或需要其他信息时、我会更新 E2E。

    此致、
    Teja。