Other Parts Discussed in Thread: SYSCONFIG, AM2431
器件型号: AM243X - MCU-PLUS-SDK
Thread 中讨论的其他器件: Sysconfig、 AM2431
工具/软件:AM243X-EVM
您好:
我目前正在使用 AM243x EVM 测试 icssg 的双 MAC 功能。
两个以太网端口都在使用中、系统基于 FreeRTOS。
在最简单的示例 icssg tcpserver 中、app_main.c 文件内的 App_shutdownNetworkStack () 函数存在于 appMain 函数内。
但是、它位于一个无限循环之下、因此实际上永远不会执行。
对于我正在开发的功能、在某些情况下、我需要关闭 lwip 栈。
我修改了代码以在特定条件下退出 while (1) 循环、然后执行 App_shutdownNetworkStack ()。
static void App_shutdownNetworkStack()
{
for (uint32_t netifIdx = 0U; netifIdx < ENET_SYSCFG_NETIF_COUNT; netifIdx++)
{
LwipifEnetApp_netifClose(hlwipIfApp, NETIF_INST_ID0 + netifIdx);
}
return;
}
但是、此功能存在以下问题:
1.在此函数中调用的 LwipifEnetApp_netifClose 函数调用 nettif_remove。
netif_remove 函数检查 LWIP 的核心锁。
因此、直接调用该函数会使 MCU 根据置位进入无限循环。
因此、我按如下方式修改了该函数。
static void App_shutdownNetworkStack()
{
sys_lock_tcpip_core(); // Add for netif_remove
for (uint32_t netifIdx = 0U; netifIdx < ENET_SYSCFG_NETIF_COUNT; netifIdx++)
{
LwipifEnetApp_netifClose(hlwipIfApp, NETIF_INST_ID0 + netifIdx);
}
sys_unlock_tcpip_core(); // Add for netif_remove
return;
}
2.调用修改后的函数后,两个函数中的第一个元素似乎被正常删除。
然而,当删除第二个嵌套时,由于断言,它会进入一个无限循环。
第二个 netiF_remove 进入无限循环的原因可以在 MCU+SDK lwip2enet.c 文件内的 Lwip2enet_close 函数中找到。
此函数的第一部分如下所示。
void Lwip2Enet_close(Lwip2Enet_Handle hLwip2Enet, struct netif *netif)
{
Lwip2Enet_assert(NULL != hLwip2Enet);
/* Stop and delete the tick timer */
ClockP_stop(&hLwip2Enet->pacingClkObj);
ClockP_destruct(&hLwip2Enet->pacingClkObj);
Lwip2Enet_netif_t* pInterface = Lwip2Enet_getInterfaceObj(hLwip2Enet, netif);
.....
}
此函数停止和释放与 hLwip2enet 句柄关联的 pacingClkObj 的时钟。
问题是 hLwip2enet 句柄不是按每个子句分配的。 此句柄在 LWIP 中显示为单个实例。
**如果已经分配了 hLwip2enet、Lwip2enet_allocateObj 函数不会分配额外的句柄。
`,第二个` netiF_remove `在第一个` netiF_remove `期间已删除` pacingClkObj `hLwip2enet`的 pacingClkObj 时调用。
此时、由于 pacingClkObj 不再有效、因此断言会导致无限循环。
请修复此器件。
此外、如果在下一个 SDK 版本中反映此问题之前可以实施权变措施、请告知我。
此致、
Jinwon Jang