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