S2E例程不是很熟,但个人觉得楼主的情况也许和下面文章有些相似,帮楼主转来了,也许对楼主有帮助,可以参考下。
下文来自于TI社区经验分享文章hasten lin一等奖的文章(www.deyisupport.com/.../5240.aspx)。
我使用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状态;最终达到两端的链接状态一致;一旦链路恢复正常,设备与服务器就能再次正常建立链接。这个问题总算是解决了。
设备运行到现在已经快半年了,目前为止,还没有发现什么问题。