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:这是否是 F2838x CM 以太网驱动程序中的错误?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/896108/tms320f28388d-is-this-a-bug-in-f2838x-cm-ethernet-driver

器件型号:TMS320F28388D

您好!

我在 f28388的 CM 上使用 LWIP。

在 f2838xif.c:f2838xif_transmit ()中,如果输入 pbuf 是一个链,则发送描述符将被链接。  使用 nextPacketDesc 成员链接描述符。

nextPacketDesc 成员还用于将描述符放置在以太网驱动程序的等待队列中,位于 ethernet.c:ethernet_performPushOnPacketQueue()中。

f2838xif.c:f2838xif_process_transmit ()中的 TX 完成调用遵循 nextPacketDesc 的链、为每个描述符调用 mem_free ()。

这会导致问题、因为当描述符从等待队列中删除并被指定给 EMAC 发送时、它可能具有非空的 nextPacketDesc、 这意味着、当调用完成例程时、它将释放等待队列中的所有描述符、而不管它们是否是原始 pbuf 链的一部分。

请注意、即使 pbufs 从未被链接、这也是一个问题。 只要 TX 等待队列中有多个数据包、就会发生此问题。

是否有人可以确认我已正确理解了这一点、这确实是一个错误?

我认为,如果例程 ethernet.c:ethernet_removePacketsFromTxQueue()安排清除链中最后一个描述符的 nextPacketDesc 成员,因为它将这些描述符发送到器件,那么问题就会得到解决。

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

    您好!

    我看到了代码的局限性、因为它会释放所有描述符、直到它为空。但是您是否遇到过任何问题? 您使用哪种应用程序来运行?

    正如我在另一个主题中所说的、我们在 HTTP 服务器的参考应用中没有遇到此问题。  

    感谢您的反馈。  

    此致、

    Sudharsanan

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

    您好 Sudharsanan、

    我没有遇到任何问题、我只是在调试其他内容时注意到了这一点。

    我的应用程序是28388 CM 上的 telnet 和 ECAT 从属设备(CoE 和 foo)。 我正在更改示例代码的工作方式、以便将 LWIP 处理从 ISR 中移出并移入轮询主循环。 我没有 RTOS、因此使用 no_SYS 构建 LWIP。 我的轮询循环直接调用 ethernet_transmitisr()和 ethernet_receiveisr(),而以太网中断从未启用。

    我的应用程序现在似乎运行得非常好*没有*我更改 f2838xif_process_transmit ()或 nextPacketDesc 的使用。 我几乎100%确定我的测试用例不会使用等待队列,即使它们使用了等待队列,也可能是可以的,因为没有其他代码调用 mem_malloc()。

    感谢您花时间进行分析和回答。

    此致、

    镍氢电池

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

    您好、Nik、

    感谢您的应用详细信息。  

    [报价用户="Nicholas Langrind"]我几乎100%确定我的测试用例不会使用等待队列,an

    但是、根据设计、所有传入驱动程序的数据包都被置于等待队列中、然后添加到硬件队列中。 您最终可能不会在等待队列中有多个项目。

    此致、

    Sudharsanan