新闻  |   论坛  |   博客  |   在线研讨会
[转载]协议网关lwip遇到的问题
jobs | 2012-06-30 20:35:28    阅读:9562   发布文章

我使用TI芯片也有三年时间了,期间开发过低功耗无线传感器、无线转以太网网关等设备

现在讲一下用LM3S9B90芯片开发的无线转以太网网关设备中遇到的一些问题吧!

以太网用的是LWIP协议,这也是我第一次用32位机、第一次用ARM内核芯片、也是第一次与LWIP接触;

一开始我没有什么信心会做好,还好在TI例程及技术支持的帮助下,半年内将产品设计出来,并且相当稳定的运行。

这其间遇到最大的问题是TCP运行的问题:(前两个还是小问题,最后一个才是问题致命的所在)

   问题一,IP地址分配的问题;当时利用例程的办法,调用lwIPInit,和lwIPLocalIPAddrGet的办法获取IP地址,如果当时没接网线,或者路由器没有开启DHCP功能怎么办?

  最开始我采用重新调用以上函数的办法,进行处理,发现系统会复位;可见这个办法行不通,

  后来通过对LWIP的认识发现可以通过修改IP地址的方式,调用lwIPNetworkConfigChange函数,将IP地址设置成上次分配的IP,这样一来,只要设备能正常使用过一次,以后都不会有问题了!

  问题二,调用tcp_output函数,为了提高发送速度,在每次调用tcp_write函数前,先调用一次tcp_output函数;加了这个函数后, 短时间内使用是不会有问题的,但时间长了以后,发现系统也会复位;经过一系列的查找,终于锁定是tcp_output函数的问题,取消后,系统不再复位了

  问题三,网络异常的处理;在正常的使用过程中,会遇到设备端网线断开、服务器网线断开、服务器软件关闭、服务器电脑死机等等情况,其它几种都比较好判别,唯独服务器网线断开这种情况不能区分;

   服务器网线断开(设备与路由器链接是好的)的时候,设备不会得到异常报告,也不会有PHY寄存器标志,只能通过给服务器发送数据时,判断是否有发送完成回调函数;如果没有回调函数,服务器链路一定有问题。

   一旦出现服务器网线断开的情况,设备的LWIP中的pcb->state一直处理链接成功的状态,而服务器在一定时间后会删除这条链接,也就是 说,超过一定的时间后,设备与服务器之间的链接状态是不一样的;同时,设备一直处于虚假链接,不会重新与服务器建立链接;

   最后导致,服务器与设备是永远也不可能建立链接。

   这个问题困扰了我们好长一段时间,而且是在客户的使用中才发现,客户的压力可想而知。

   还好,经过一段时间的排查,终于找到问题的所在、以及解决问题的办法:

   效仿服务器的办法,在经过一段超时后,主动断开与服务器(确切来说是路由器)的链接,给服务器发送close命令;发完后,pcb进入 FIN_WAIT_1状态和FIN_WAIT_2状态,如果期间链接上,服务返回ACK确认关闭链接, 否则超时后,设备自动进入CLOSE状态;最终达到两端的链接状态一致;一旦链路恢复正常,设备与服务器就能再次正常建立链接。这个问题总算是解决了。

   设备运行到现在已经快半年了,目前为止,还没有发现什么问题。
原帖地址:http://www.deyisupport.com.sixxs.org/question_answer/f/23/t/5240.aspx?PageIndex=8作者:hasten lin on 2012-1-12 0:15

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客