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.

[参考译文] TMS320F28388S:LwIP 内存分配问题

Guru**** 2478765 points
Other Parts Discussed in Thread: TMS320F28388S, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1457172/tms320f28388s-lwip-memory-allocation-issues

器件型号:TMS320F28388S
Thread 中讨论的其他器件: C2000WARE

工具与软件:

我最初 在这里发布了此信息、但从未得到回复、因此我会再次将其作为新主题发布。

我遇到了双重释放 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 中的一项、但却导致内存泄漏、并最终导致可用内存耗尽。

我最近修复此问题的尝试是 向 Ethernet_removePacketsFromTxQueue 添加一个循环、 调用 Ethernet_performPopOnPacketQueue 、直到返回 NULL -使逻辑与 pfcbFreePacket 调用可释放的逻辑匹配。 这种 方法效果更好、但在 一次发送多个数据包时、似乎仍然会出现问题。

请告诉我是否有可用的修复程序或您可能需要的任何其他信息。

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

    尊敬的 C2000团队:

    我通过电子邮件给您发了电话、但也想在这个主题上给您一个友好的微信。 您能帮助向 Scott 提供更新吗?

    -Matt

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

    嘿 Scott、

    非常感谢您的耐心等待! 我将直接通过电子邮件与您联系、提供更多信息、但与此同时、我还想分享此 E2E 帖子的更新信息以供参考。

    我收到了 C2000 SW 应用团队的反馈、即目前他们的 LwIP 和以太网专家的负载很大、但已将您的支持请求添加到他们积压的请求中。 下周早些时候、他们将开始测试、以验证您的情景的一些解决方案、以便我们可以在下周中旬收到他们团队的初步反馈。  

    此外、他们希望能够在2月份提供更深入的解决方案、因为本月晚些时候将有更多的资源处理这一请求。

    我将请他们对该主题发表评论、并对需要的任何其他评论或说明进行评论。

    此致、

    Matt

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

    Scott、您好!
     我已尝试详细了解实施情况、并尝试重现该问题。 通过多次运行、我看不到使用 UDP 流量时出现的任何问题。
    1.您能告诉我在我的终端上重现这一步骤吗?
    2. 在出现问题时、您还可以分享变量 mem_alloc_count、mem_free_count、process_transmit_count 的值吗?

    我发现的一个问题与释放数据包缓冲区而不等待数据包 Tx 完成有关。 这可能会导致数据包数据损坏、但可能不会显示与内存池中多个空闲单元相同的问题。

    此致、

    Pradeep

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

    Pradeep、

     释放的数据包缓冲区本身没有等待 Tx 完成、这是一个很大的问题。 我认为、这是 在尝试迭代缓冲区链接列表时偶尔出现无限循环的根本原因。  专注于修复缺陷的这一方面可能有助于 使系统更加稳定。

    如果打开 LWIP_STATS 和 MEM_STATS 定义、则应该能够运行 enet_lwip 示例并查看问题。

    • 连接到 enet_lwip 示例提供的网页。
    • 在调试器中为 lwip_stats 添加监视表达式。  
    • 单击 用于 切换 LED 的网页按钮时、我看到了 lwip_stats.mem.Illegal 计数增量
    • 为了查看双自由操作触发了非法计数器、我更改了 LWIP_ASSERT 宏以触发断点

    我当前并未设置重新运行此测试、但是我记得出现问题时、alloc/free/transmit 计数很低(<20)。

    谢谢!

    Scott

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

    嗨、

    我只是想在这个主题上给一个友好的微博、因为距离 Scott 最后一条消息已经有一周了。

    您能帮助向 Scott 提供反馈吗? 如果您仍在研究这些问题、或者正在努力在您身边重现内容、我们希望收到回复时、任何更新或时间表都将不胜感激!

    谢谢!

    -Matt

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

    Scott、您好!

    您可以查看以下主题:
    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1074652/tms320f28388d-lwip-webserver-example-memory-errors-due-to-ethernet-descriptors-queue-management/4027536
    这是我的同事的帖子。 对于 TI 提供的驱动程序、我们也会遇到类似的问题。 它看起来是类似的。
    现在、我们使用修改后的驱动程序和以太网、通过 F28388D 运行、我们的产品中没有任何问题。

    Jacek 文章中附加的源文件可能有点过时、如果您有兴趣、我可以在此处附加我们最近的文件。

    遗憾的是、实际上根本不存在 TI 对以太网驱动程序的支持、这一点令人失望。 这些错误已经存在了很多年。

    此致、
    Andy

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

    Scott、您好!
     所发现的问题很少、如下所示:
    1、TX 数据包缓冲区在等待传输完成之前被释放

    对于 pbuff_chain、会为 ethernet_pkt_desc 调用多个 mem_free。 这可能是非法自由的主要原因。

    这两个问题均已修复、并且附件中提供了补丁程序。 如果情况有所改善、敬请告知。

    e2e.ti.com/.../3632.f2838x_5F00_cm_5F00_tx_5F00_patch.diff


    此致、

    Pradeep