主题中讨论的其他器件:C2000WARE、 TMS320F28388S
工具与软件:
您好!
我的应用的 CM 内核不断崩溃、从而提供 FaultISR
有时会像我之前提出的那样产生 mem_malloc 错误
我应该检查哪个部件以查看 mem 的释放次数是否超过其涂覆次数?
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.
工具与软件:
您好!
我的应用的 CM 内核不断崩溃、从而提供 FaultISR
有时会像我之前提出的那样产生 mem_malloc 错误
我应该检查哪个部件以查看 mem 的释放次数是否超过其涂覆次数?
您好!
您可以在 CCS 中选择 View -> Memory Allocation、以查看应用的存储器分配。 您能否确认您是否使用的是最新版本的 C2000Ware。 应该有解决此问题的修复程序。
您可以在此处参考类似的论坛帖子:
此致、
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 中的一项、但却导致内存泄漏、并最终导致可用内存耗尽。
如果有任何进一步的测试或修复可以尝试、请告诉我。