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 调用可释放的逻辑匹配。 这种 方法效果更好、但在 一次发送多个数据包时、似乎仍然会出现问题。
请告诉我是否有可用的修复程序或您可能需要的任何其他信息。