lwip ping时间长解决办法
来源:互联网 发布:淘宝网安踏春秋长裤 编辑:程序博客网 时间:2024/05/16 01:42
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时间长解决办法
- lwip ping 其他设备
- LwIP裸机ping问题
- LWIP-ping出问题又一实例
- STM32F207,LWIP,DM9000,netif_set_up()与ping
- ping lwip网络协议栈 分析(一)
- ping lwip网络协议栈 分析(二)
- ping lwip网络协议栈 分析(三)
- ucos下lwip的ping功能实现
- 关于Lwip移植-测试ping显示超时
- lwip运行一段时间后ping时间延长
- 折弯机——程序部署、调试时间长的解决办法
- 程序执行时间长了导致出现502问题的解决办法
- STM32F207,LWIP,DM9000,网口驱动,ping不通
- 让LwIP拥有PING其他设备的能力
- LWIP[转]为什么ping时间会越来越长
- 让LwIP拥有PING其他设备的能力
- ping: unknow host解决办法
- 基于nginx的中间件架构(1)环境准备
- __bridge 显式转换 id和void *
- bzoj 5047 空间传送装置 最短路
- 在Mac中配置tomcat服务器教程(超详细配图)以及其配置简单原理
- Codeforces 873B Balanced Substring(利用前缀和找和为0的子串)
- lwip ping时间长解决办法
- 深度学习lstm防止过拟合之dropout
- Android指纹
- 数组 Map 使用小结
- 递归展示评论
- 三分钟明白 Activity工作流 -- java运用
- 利用PickerView完成条件选择器
- 从零一起学react(8)---表单的使用
- Android 百分位金额数字动画添加 方支付余额