工具/软件:
您好、专家、
我使用的是 MCU_PLUS_SDK_am64x_09_01_00_41 版本的 SDK 和 Code Composer Studio 12.8.0。 我目前正在自定义 AM64x 电路板上的{MCU_SDK_PATH}/examples/networking/lwip/enet_cpsw_tcpserver 上运行示例工程。
我的目标是在运行时完全取消初始化并重新初始化 Enet、UDMA 和 LwIP 等所有组件。 我有一个定期执行此重新初始化的函数。
SDK 提供了一个名为 App_shutdownNetworkStack() 的函数来关闭 netif 连接。 基于此、我将尝试按以下顺序执行重新初始化:
空 myFunction (void)
{
App_shutdownNetworkStack();
EnetApp_closeDmaChannels();
EnetApp_driverClose (gEnetAppParams[0].enetType、gEnetAppParams[0].instId);
for (instId = 0;instId < CONFIG_UDMA_NUM_instances;instId++)
{
RetVal += UDMA_deinit (&gUdmaDrvObj[instId]);
DebugP_ASSERT (UDMA_Sok == RetVal);
}
switch_mac_port();
for (instId = 0;instId < CONFIG_UDMA_NUM_instances;instId++)
{
RetVal += UDMA_init (&gUdmaDrvObj[instId]、&gUdmaInitPrms[instId]);
DebugP_ASSERT (UDMA_Sok == RetVal);
}
EnetApp_driverInit();
对于 (uint32_t enetInstIdx = 0;enetInstIdx < ENET_SYSCFG_MAX_ENET_Instances;enetInstIdx++)
{
状态= EnetApp_driverOpen (gEnetAppParams[enetnstIdx].enetType、gEnetAppParams[enetInstIdx].instId);
IF (status!= ENET_Sok)
{
EnetAppUtils_print(“打开 ENE[%d]失败:%d\r\n“、enetInstIdx、status);
EnetAppUtils_assert (status == ENET_Sok);
}
EnetApp_addMCastEntry (gEnet App_Params Idx].enetType、
Enet App_Params [enetInstIdx].instId、
EnetSoc_getCoreId ()、
BROADCAST_MAC_ADDRESS、
CPSW_ALE_ALL_PORT_MASK);
}
App_setupNetwork();
}
到目前为止、一切都正常工作、并打印有效的日志输出、只有一项除外。 在 App_shutdownNetworkStack -> LwipIfEnetApp_netifClose ()-> nettif_remove ()-> remove_callback ()-> Lwip2enet_close () 期间、将显示以下警告:
Lwip2enet_close() 无法检索所有 PktInfo
此时、hLwip2enet->allocPktInfo 为 48。
尽管如此、EnetApp_driverClose() 和 EnetMem_deInit() 不会失败、表示所有数据包计数器都已正确平衡。
但是、当代码到达 App_setupNetwork ()-> ApptcpipInitCompleteCb ()-> LwipifEnetApp_netifOpen ()-> LWIP_START ()-> Lwip2enet_open ()-> Lwip2enet_initRxObj () 时、它会在以下位置崩溃:
对于 (i = 0U;i < numCustombuf;i++)
{
cpbuf = NULL;
cpbuf =(Rx_Custom cpbuf *) LWIP_MEMPOOL_ALLOC (RX_POOL);
EnetAppUtils_assert (cPbuf != NULL );//<--此断言失败
}
错误为:
cpbuf !=空:失败!!!
因此、即使在 EnetMem_deInit(检查数据包泄漏)期间没有出现错误、此重新分配也会失败。
我的问题:
-
我是否缺少需要手动释放数据包缓冲区或其他资源的步骤?
-
在重新初始化之前、LWIP 自定义 pbuf 池是否需要 deinit 回调或额外清理?
-
在运行时完全关断和重新启动 enet-UDMA-LwIP 协议栈的正确顺序是什么?
void EnetApp_closeDmaChannels (void)
{
LwipifEnetApp If_Release RxHandleInfo Rx_handle;
LwipifEnetApp If_Release TxHandleInfo TX_handle;
Enet Dma_Pkt fqPktInfoQ、cqPktInfoQ;
rx_handle.enetType = gEnetAppParams[0].enetType;
rx_handle.instId = gEnetAppParams[0].instId;
rx_handle.rxChNum = 0;
Enet App_Handle.Info handleInfo;
Enet Per_Attach CoreOutArgs attachInfo;
uint32_t CoreID = EnetSoc_getCoreId ();
EnetApp_acquireHandleInfo (rx_handle.enetType、rx_handle.instId、&handleInfo);
EnetApp_coreAttach (rx_handle.enetType、rx_handle.instId、CoreID、&attachInfo);
EnetQueue_initQ (&fqPktInfoQ);
EnetQueue_initQ (&cqPktInfoQ);
EnetApp_closeRxDma (0、
handleInfo.henet、
attachInfo.coreKey、
CoreID、
&fqPktInfoQ、
&cqPktInfoQ);
EnetAppUtils_freePktInfoQ (&fqPktInfoQ);
EnetAppUtils_freePktInfoQ (&cqPktInfoQ);
// TX 通道
tx_handle.enetType = gEnetAppParams[0].enetType;
tx_handle.instId = gEnetAppParams[0].instId;
tx_handle.rxChNum = 0;
EnetQueue_initQ (&fqPktInfoQ);
EnetQueue_initQ (&cqPktInfoQ);
EnetApp_acquireHandleInfo (tx_handle.enetType、tx_handle.instId、&handleInfo);
EnetApp_closeTxDma (0、
handleInfo.henet、
attachInfo.coreKey、
CoreID、
&fqPktInfoQ、
&cqPktInfoQ);
EnetAppUtils_freePktInfoQ (&fqPktInfoQ);
EnetAppUtils_freePktInfoQ (&cqPktInfoQ);
返回;
}
我非常感谢为帮助解决此问题提供的任何建议、见解或工作流程示例。 提前感谢您的支持。
此外、我将使用如下所示的方法关闭 DMA 通道、我也通过引用相同的 SDK 示例创建了该方法。 如果您也能考虑到这一点、我将不胜感激。
此致、