1. 程式人生 > >lwip ping時間長解決辦法

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的時間越來越長