OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8862|回复: 7

STM32107+UIP返回ARP应答包超时造成PC端数据发送丢失的问题

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-2-28
在线时间
0 小时
发表于 2013-2-28 10:43:14 | 显示全部楼层 |阅读模式
        最近在做一个PC与STM32网络双向通讯的STM32端程序,STM32使用UIP,通讯协议使用UDP,硬件是STM32F107+DP83848。通讯都正常,两者之间能正常收发数据。PC端通过一个VC程序与STM32通讯。
    问题在于PC端的ARP缓存表中若没有目的主机(STM32)的IP-MAC对应表项时(被定时删除或者其他情况),此时若PC向STM32主动发送UDP数据时,就会出现数据丢失,丢失的数据包个数不定。
    通过wireshark抓包发现,此时因为没有目的主机的MAC,PC会发送arp广播包,STM32也会返回arp应答包,但是由于这个应答包返回时间过长,导致PC端发送的数据包“在网络物理层”(wireshark也不能抓到数据包)丢失,或者说可能是在PC端的TCP/IP协议栈中丢失了,因为根本没有抓到这几个丢失的数据包,也可以推定为根本没有发送。不是PC端VC通讯程序的问题,这个程序跟购买的网络控制卡通讯完全没有问题。

解决这个问题的方式我自己想大概有以下几种:
1、加快加快STM32端返回arp应答包的速度;
2、PC端建立静态的arp缓存表(比较麻烦),如果能在VC程序中保存目的主机MAC则可以得到解决;
3、控制卡在不通讯时,定时向PC发送arp包(造成网络数据量大);

我想问的是:
1、如何加快STM32端返回arp应答包的速度?(通过测试发现当应答速度快时是不会丢包的,并且购买的网络控制卡应答速度比我自己做的这个明显快,要快1到2个数量级)
2、PC端从发送arp请求包到发送UDP数据的时间是多少(从现象看,PC并不等待arp应答包)?如果得不到应答包PC端默认如何处理?

请原子哥帮我分析一下应该如何解决,谢谢啦。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-2-28
在线时间
0 小时
 楼主| 发表于 2013-2-28 11:15:37 | 显示全部楼层
消灭零回复,大家帮忙看看吧,STM32的EMAC是带DMA的,是不是在DMA传输的时候CPU与DMA控制器占有DMA描述符冲突,或者是某一方占有后没有及时释放导致的啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-28 16:35:36 | 显示全部楼层
加快arp应答,可以考虑加快轮询速度了。把循环的延时减少。
这个UDP时间我也不知道了,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-2-28
在线时间
0 小时
 楼主| 发表于 2013-3-1 12:13:50 | 显示全部楼层
回复【3楼】正点原子:
加快arp应答,可以考虑加快轮询速度了。把循环的延时减少。 这个UDP时间我也不知道了,呵呵。
---------------------------------
1、原子哥所说的循环指的是UIP的主循环吗?
2、下面哪种方式的效率高些呢
a、直接赋值方式
//   BUF->dhwaddr.addr[0] = BUF->shwaddr.addr[0];
//   BUF->dhwaddr.addr[1] = BUF->shwaddr.addr[1];
//   BUF->dhwaddr.addr[2] = BUF->shwaddr.addr[2];
//   BUF->dhwaddr.addr[3] = BUF->shwaddr.addr[3];
//   BUF->dhwaddr.addr[4] = BUF->shwaddr.addr[4];
//   BUF->dhwaddr.addr[5] = BUF->shwaddr.addr[5];
//
//   BUF->shwaddr.addr[0] = uip_ethaddr.addr[0];
//   BUF->shwaddr.addr[1] = uip_ethaddr.addr[1];
//   BUF->shwaddr.addr[2] = uip_ethaddr.addr[2];
//   BUF->shwaddr.addr[3] = uip_ethaddr.addr[3];
//   BUF->shwaddr.addr[4] = uip_ethaddr.addr[4];
//   BUF->shwaddr.addr[5] = uip_ethaddr.addr[5];
//
//   BUF->ethhdr.src.addr[0] = uip_ethaddr.addr[0];
//   BUF->ethhdr.src.addr[1] = uip_ethaddr.addr[1];
//   BUF->ethhdr.src.addr[2] = uip_ethaddr.addr[2];
//   BUF->ethhdr.src.addr[3] = uip_ethaddr.addr[3];
//   BUF->ethhdr.src.addr[4] = uip_ethaddr.addr[4];
//   BUF->ethhdr.src.addr[5] = uip_ethaddr.addr[5];   
//   
//   BUF->ethhdr.dest.addr[0] = BUF->dhwaddr.addr[0]; 
//   BUF->ethhdr.dest.addr[1] = BUF->dhwaddr.addr[1]; 
//   BUF->ethhdr.dest.addr[2] = BUF->dhwaddr.addr[2]; 
//   BUF->ethhdr.dest.addr[3] = BUF->dhwaddr.addr[3]; 
//   BUF->ethhdr.dest.addr[4] = BUF->dhwaddr.addr[4]; 
//   BUF->ethhdr.dest.addr[5] = BUF->dhwaddr.addr[5]; 

b、memcpy方式
      memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6);
      memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);
      memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
      memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);

3、如果CPU操作被DMA占有的描述符,会有什么结果呢

呵呵,多谢啦,问题比较多。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-1 20:49:00 | 显示全部楼层
第一种方法应该快一些.
你测试下.
3,不是很懂你的意思.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-9-10
在线时间
0 小时
发表于 2013-4-3 21:01:38 | 显示全部楼层
在stm32刚上电后,如何主动发送ARP请求?
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-9-10
在线时间
0 小时
发表于 2013-4-3 21:02:28 | 显示全部楼层
uip_arp_out();
tapdev_send();
直接这样吗
回复 支持 反对

使用道具 举报

4

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2012-11-29
在线时间
0 小时
发表于 2013-4-8 21:56:04 | 显示全部楼层
uIP不支持中断方式
你的案例可能用LwIP更好

uIP 或 lwIP 很灵活,号称轻量级的tcp/ip协议。
之前用DM9000AEP / DM9000CEP +uIP 或 lwIP  时,仔细研究过一段时间,有这方面兴趣可交流。
jonny.chu@qftek.com  Tel:13554902206
MICREL KSZ8851SNL   , WIZNET W5500  , SPI接口硬件简单,嵌入式网络芯片
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 16:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表