所用硬件平台为STM32F407+LAN8720I,在测试过程中发现,lwip运行不稳定,ping响应时间刚开始运行时是1ms,运行一段时间后变成几百ms,甚至超过3s,只有重启才能解决。另外,通过仿真器调试,在网口接收数据位置打断点,也能造成上面不稳定现象的出现。
参考上面文章所述:“使用了中断的方式接收网卡数据包,在每次中断中只读取网卡的一个数据包。如果一次中断发生,而网卡内事实上可能存在有多个数据包,这样如果只读一个,最终导致网卡内数据包积压,所以会出现ping延迟的现象。如果数据包长期积压,还可能出现因网卡缓冲区满而无法接收数据的情况,由于无接收中断产生,控制器也不会处理积压数据的现象,从而发生网卡假死的现象,系统无法接收数据。”
包括老外也遇到过同样的问题:
这里的正确解决方法是, 在一个中断中,需要读取并处理所有的已经接收的数据包。
与原文章的lwip的版本可能不一样,这里修复比较简单,在etnernetif.c文件中,修改ethernetif_input函数,原函数如下:
err_t ethernetif_input(struct netif *netif)
{
err_t err;
struct pbuf *p;
p=low_level_input(netif);
if(p==NULL) return ERR_MEM;
err=netif->input(p, netif);
if(err!=ERR_OK)
{
LWIP_DEBUGF(NETIF_DEBUG,("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
return err;
}
原函数
修改后如下:
err_t ethernetif_input(struct netif *netif)
{
err_t err;
struct pbuf *p;
p=low_level_input(netif);
while(p)
{
err=netif->input(p, netif);
if(err!=ERR_OK)
{
LWIP_DEBUGF(NETIF_DEBUG,("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
break;
}
p=low_level_input(netif);
}
return err;
}
修改后
修改后,lwip运行稳定增强。