lwip ping时间长解决办法

lwip ping时间长可能有两个原因造成的

1.网卡数据堆积,lwip采用网卡中断接收数据,每次中断处理一次数据包如红色部分

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;

static struct pbuf * low_level_input(struct netif *netif)
{  
struct pbuf *p,*q;
u32 len;
u8 *buffer;
int l=0;

p=NULL;
buffer=mymalloc(SRAMIN,1600);
if(buffer!=NULL)len=ENC28J60_Packet_Receive(MAX_FRAMELEN,buffer);
else 
{
printf("½ÓÊÕÊý¾Ý»º³åÇøÄÚ´æÉêÇëʧ°Ü\r\n");
return p;
}

p=pbuf_alloc(PBUF_RAW,len,PBUF_POOL);
if(p!=NULL)
{
for(q=p;q!=NULL;q=q->next)
{
memcpy((u8_t*)q->payload,(u8_t*)&buffer[l], q->len);
l=l+q->len;
}    
}
myfree(SRAMIN,buffer);
return p;
}

但是可能每次中断有可能来两个或多个数据包,这时候可能造成数据堆积,长期下去会导致ping时间越来越长,所以要在ethernetif_input函数中增加数据包数判断

我所用的网卡芯片是enc28j60,当网卡接收到一个完整数据包时EPKTCNT会递增,这时候判断这个寄存器不为0则表示还有数据包,这时候继续处理就行

err_t ethernetif_input(struct netif *netif)
{
err_t err;
struct pbuf *p;
struct eth_hdr *ethhdr;

 
   reset_x:
{
ippacket_flag=ENC28J60_Read(EIR);
ippacket_flag=(ippacket_flag&EIR_PKTIF); 
p=low_level_input(netif);   //µ÷ÓÃlow_level_inputº¯Êý½ÓÊÕÊý¾Ý
 if(p==NULL) 
{
        pbuf_free(p);         
        return ERR_MEM;
}
err=netif->input(p, netif); //µ÷ÓÃnetif½á¹¹ÌåÖеÄinput×Ö¶Î(Ò»¸öº¯Êý)À´´¦ÀíÊý¾Ý°ü


if(err!=ERR_OK)
{
LWIP_DEBUGF(NETIF_DEBUG,("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;

}
 if((ippacket_cnt=ENC28J60_Read(EPKTCNT))!=0)
 goto reset_x;
return err;


lwip还有一个缺陷是在上面蓝色部分直接return,而前面申请了一片内存没有释放,从而造成内存泄漏,ping的时间越来越长


你可能感兴趣的:(lwip ping时间长解决办法)