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:在 LWIP (TMS320F28388D)中、MEM_FREE_COUNT 大于 MEM_ALLOC_COUNT

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1432622/tms320f28388d-mem_free_count-is-greater-than-mem_alloc_count-in-lwip-tms320f28388d

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

工具与软件:

您好!  

我的应用的 CM 内核不断崩溃、从而提供 FaultISR  

有时会像我之前提出的那样产生 mem_malloc 错误

我应该检查哪个部件以查看 mem 的释放次数是否超过其涂覆次数?

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

    您好!  

    您可以在 CCS 中选择 View -> Memory Allocation、以查看应用的存储器分配。 您能否确认您是否使用的是最新版本的 C2000Ware。 应该有解决此问题的修复程序。

    您可以在此处参考类似的论坛帖子:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1100471/tms320f28388d-fault-lwip-f2838x---full-memory-without-reasons 

    此致、

    Ozino

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

    我使用的是 c2000ware 版本5.03.00.00。

    我已经应用了您引用的帖子提供的解决方案、但仍然崩溃。

    我注意到的是、 它只会在我调试时崩溃。

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

    尊敬的 Mark:

     我正在将这篇文章转发给 LWIP 专家、以便进一步发表意见。

    此致、

    Ozino

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

    我在 双重释放 LWIP 缓冲区时遇到同样的问题。 我一直在尝试通电、但我认为 LwIP 示例甚至对于5.4.0.0 C2000ware 也有一些基本的错误。 我使用的是 TMS320F28388S 处理器。

    打开 LWIP_STATS 和 MEM_STATS 定义会显示为双空闲操作递增的非法计数。

    我将问题的一部分追溯到 f2838xif_process_transmit 中的循环 、该循环从 f2838xif.c 中释放了 数据包描述符链。

        do
        {
            pktDescPtrShadow = pktDescPtr->nextPacketDesc;
            mem_free(pktDescPtr);
            pktDescPtr = pktDescPtrShadow;
        }
        while(pktDescPtr != 0);

    这段代码可以追溯到从 ethernet_removePacketsFromTxQueue [driverlib_cm/ethernet/c]调用、它 使用 ethernet_performPopOnPacketQueue 每次从队列中弹出一个数据包 、并 在其中调用 pfcbFreePacket 函数。

    static Ethernet_Pkt_Desc *Ethernet_performPopOnPacketQueue(
                Ethernet_PKT_Queue_T *pktQueuePtr)
    {
        Ethernet_Pkt_Desc *pktDescHdrPtr;
    
        pktDescHdrPtr = pktQueuePtr->head;
    
        if(0U != pktDescHdrPtr)
        {
            pktQueuePtr->head = pktDescHdrPtr->nextPacketDesc;
            pktQueuePtr->count--;
        }
    
        return(pktDescHdrPtr);
    }

    pktQueuePtr->head 保留指向 pktDescHdrPtr->nextPacketDesc 的指针、该指针在  f2838xif_process_transmit 中得到释放。 如果处理更多的数据包重复使用这些缓冲区并导致描述符 nextPacketDESC 链接中的循环引用、问题就会变得特别困难。

    我尝试解决这一问题的方法之一是一次只释放 f2838xif_process_transmit 中的一项、但却导致内存泄漏、并最终导致可用内存耗尽。

    如果有任何进一步的测试或修复可以尝试、请告诉我。