LWIP运行一段时间后ping不通或者ping响应时间长

所用硬件平台为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运行稳定增强。

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值