[原创] enet_lwip,enet_io,enet_ptpd,enet_uIP的一点总结

academic   2010-12-30 11:12 楼主
enet_lwip,enet_io,enet_ptpd,enet_uIP这四个都是TI StellarisWare中关于以太网的例程,前三个都是基于lwIP协议栈的,后一个是基于uIP协议栈的。
1.enet_lwip,enet_io,enet_ptpd的共同点
  • 都是基于lwIP协议栈
  • 都包含有web服务器
  • 每一个例程都是从两个方面来实现的,比如enet_lwip采用了两种存放网页的方法,一是通过makefsfile把网页数据转换为.h文件,包含到工程里,编译,最后和程序一起写进了flash里边,二是通过直接把设计好的网页文件直接放到SD卡当中,程序会自动检测到SD卡插入,然后从SD中读取网页;enet_io采用了两种控制io的方法,一种是通过Javascript+XMLHttpRequest的方法,一种是通过表单+CGI+SII的方法,这两种方法都可以来控制Kit board上的io(在前段时间的帖子中我也分享了每种方法的一些心得);enet_ptpd也采用了两种对接收的数据包加时间戳的方法,一种是硬件时间戳(这是默认的情况),一种是软件时间戳(通过复位时按住SELECT PUSH BUTTON来关闭硬件时间戳,复位后松开SELECT键启用软件时间戳)。
  • 这几个例程对于初学者来说是既爱又恨。一方面,每个例程的含金量较高,设计很严密,规范,两种方法的对比可以学到不少知识;另一方面,由于综合了的东西较多,似乎上手不太容易,包含了很多文件,很多if else,很多define。

回复评论 (26)

  • 都采用了DHCP动态分配IP地址和AUTOIP自动分配IP地址,当DHCP动态分配IP地址失败后,就会自动启用AUTO在子网内生成一个IP地址,比如网关IP地址是192.168.0.1时,AUTOIP第一次生成的IP地址一般就是192.168.0.192。.
  • 都在代码中添加了locator service。所以用finder可以发现开发板IP地址。
  • 对协议栈的配置,都要通过lwipopts.h来进行。
总之,这几个例程都有很多部分是相似的,只要细心的分析,总会有很多的收获,我们也可以在这几个例程的基础之上进行一些自己的设计。
几个例程中lwIP的不同点:
  • 首先各个主文件肯定有是不同的,如enet_lwip.c enet_io.c,enet_ptpd.c,它们的难度也是按顺序由易到难的。
  • 每个工程文件夹下都有一个lwipopts.h文件,它们是量体裁衣的。
  • 其次一般lmi_fs.c有所不同。这个文件可以认为是一个极其简易的虚拟“文件系统”,其实就是管理一个静态的单向的数组链表,通过比较数组中的文件名来确定文件数据所处的位置。主要就是把存储到flash中的网页文件,io_fsdata.h中的网页数据定位(相当于打开文件),复制到buffer(相当于读文件),释放内存(相当于关闭文件)。如果你的网页时存储在SD卡中的,那么lmi_fs.c中的各个函数要和FATfs中的打开文件,读文件,关闭文件的函数进行一个融合,这样可以通过这个躯壳来操作SD卡中的文件。这一点仔细分析一下enet_lwip例程中的lmi_fs.c中的几个函数,就可以理解了。我还写了两个例程把这个综合的例程分开了,把所谓的两种文件系统分开了。所以需要实现或者修改的就是fs_read(),fs_open(),fs_close(),fs_init()这几个函数而已。在这里提醒的一点就是,在使用makefsfile命令的时候,经常会有人出错。makefsfile -i fs -o io_fsdata.h -r -h ,很多人不解为什么输出的文件名要是io_fsdata.h。原因就是在这个lmi_fs.c里边,有#include "lmi-fsdata.h"。 
  • 其次httpd.c里都是相同的,当然根据实际的应用可以进行修改,尤其是其中的send_data()函数,如果没有把握,就不要轻易修改。


点赞  2010-12-30 11:41
网上很多文章都提到,LWIP的BUG很多,您怎么看?
点赞  2010-12-30 22:25
   不错哦!  学习了。。。
机遇总是给有准备的人呢
点赞  2010-12-30 23:09

学习

谢谢了
http://www.tdhj.cn
点赞  2010-12-30 23:19

回复 板凳 ebuffalo 的帖子

我对lwIP的应用经验还不是很多,尚未有能力能找出什么bug。不过我觉得和商业的协议栈相比可能在某些地方有bug,但是将lwIP协议栈作为学习以太网入门来说,它是很不错的,并且网络上研究它的人,不是在减少而是在增多。 bug可以有,谁没有bug,TI 的StellarisWare中也是有bug的,Keil的编译器是有bug的,所以它们一直都在更新和修正。 我觉得那些说lwIP有bug的人中有一部分是对lwIP并没有很好地使用,理解不够导致误会,所以断定lwIP有bug,运行不稳定,运行不稳定就一定是lwIP的bug吗?如果它真正知道了BUG,完全可以和瑞典计算机科学院的Adam联系一下。 当然也可以把这个问题传上TI的论坛,问问他们,我很想知道是怎么回答的。那些厉害的老外们肯定可以发现BUG。

[ 本帖最后由 academic 于 2010-12-31 10:58 编辑 ]
点赞  2010-12-31 10:24
LWIP的BUG确实多,但胜在免费,网上资料也比较多,我目前应用在公司产品中叶比较稳定了
点赞  2010-12-31 16:15
    楼主  你可以发表下,在这几个例程中,web客户端是如何和服务器进行通信的,通信的具体流程。。
机遇总是给有准备的人呢
点赞  2011-1-1 22:50

引用: 原帖由 fengzhang2002 于 2010-12-31 16:15 发表 LWIP的BUG确实多,但胜在免费,网上资料也比较多,我目前应用在公司产品中叶比较稳定了

 

能大概说一下有哪些BUG么?

点赞  2011-1-4 13:06

回复 8楼 flyingbing 的帖子

你是指lwIP里各个函数的调用关系吗?
通信流程其实就是浏览器发送get方法(浏览器会建立TCP连接,应用层是HTTP协议)在embedded web server端,会使用httpd中的http_recv()函数会接收到这个TCP数据报中的数据,进行一系列的分析之后,通过文件系统找到要get的文件,然后调用send_data()函数发送网页数据。调用http_sent()函数调整窗口。浏览器端的过程,我说过,可以用firebug来分析,还可以用TCP&UDP debug来分析。对于服务器端,就好好分析一下send_data和http_recv这两个函数。

[ 本帖最后由 academic 于 2011-1-4 13:26 编辑 ]
点赞  2011-1-4 13:17
上传一张各种协议栈图片的对比:

  • 1.jpg
点赞  2011-1-4 13:30

回复 9楼 ebuffalo 的帖子

通过上面这张图片可以看到,lwIP实现了有些商业协议栈相当的功能,甚至某些方面有过之而无不及,最大的优势是开源、免费,最新版本好像是1.3.1。至于它内部的bug我尚未看到有有人明确指出代码中bug的位置。

[ 本帖最后由 academic 于 2011-1-4 13:48 编辑 ]
点赞  2011-1-4 13:34
楼主能不能给我发一下enet_lwip,enet_io,enet_ptpd,enet_uIP这些源文件啊!我很想看看这些源代码!我也是在8962在实现时钟同步的!严重关注楼主的进展!我的邮箱:guweiyangpeng@126.com
  拜托了!!!!1;P
点赞  2011-1-5 15:38

回复 13楼 历史的天空 的帖子

这些例程都是TI StellarisWare里边的例程啊,源文件很容易找到的,还有在阅读源文件的时候关于lwIP和IEEE1588等问题随时欢迎交流,就算是其中某个函数的用法也可以。同时也希望把你的心得也分享一下。
点赞  2011-1-5 17:43

以下内容转自ZLG网站,LWIP确实有问题。

在成都zlg买了easyARM8962的开发套件,我使用ucos+lwIP来实现tcp的数据收发,遇到的问题一大堆,不过之前的问题都解决的差不多了,现在遇到几个大问题,如下:

      1.PC作服务端,8962做客户端,假如,服务端先不开启,而这时候客户端运行(这种情况非常普遍,作为监控端的设备会一直上电,而pc端会经常关机)经过一段时间以后,再开启服务器,这时候客户端的tcp任务早于进入一个死循环(也就是faultISR),跟踪的结果是,在调用netconn_connect()这个函数的时候,如果不成功,既不会一直阻塞进程,也不会返回任何的错误,而是直接进入一个死循环,现在的问题是,如何才能让我能控制客户端能一直处于连接请求状态,不要进入死循环,返回错误也行啊,

      2. 同样问题,假如在建立好连接后,正常的收发数据,这时候断开服务器的连接,这时候的客户端能检测到错误,但是在重新连接的时候有时候根本连接不上,而一旦连接失败,结果都是和上面一样进入一个死循环,
      3.连接正常的情况下,如果拔掉网线,8962不能检测到断线,如何解决?

      以上问题集中在断线重新连接,如果不成功会进入死循环(faultISR) 请指导如何解决这个问题,我希望能实现调用netconn_connect()的时候要么就一直阻塞直到成功建立连接,要么就一段时间后返回错误代码,我能进行处理,最好是返回错误!

      
      麻烦广州的zlg的技术支持能尽快帮我解决这个问题,我们这个项目就卡在这里了,成都的技术支持对LWip也不太熟悉,服务还是很好的,没办法,我只有论坛求助了,


icepnt,您好!
     你这个问题我们仔细分析了一下,应该是LwIP协议栈自身的缺陷,所以暂时还不能给你一个很明确的解决方法,我们的工程师正在处理这个问题,看看能不能改动一下LwIP弥补这个缺陷,一旦有结果我们将第一时间回复你。


     能留下个联系方式么?我一直卡在这里,项目很急的,本来元旦就该验收了,希望你们能尽快帮助我解决上述问题,你们广州zlg的技术支持一定能轻易解决这个问题的


icepnt,你好!
     你可以联系020-28267818,找任工,他会给你解决的。

希望尽快给我解答这个问题吧,客户都在催着去安装了,现在卡在这里,其他的调试都还没进行下去!!

另外再次说明下情况,上述第二种情况,服务器端开后,8962能检测到断线,之后再次重新连接,往往连接不上,这时候调用netconn_connect()后有三种情况出现:

1.进入faultISR 死循环,不知何故
2.进入OS_TaskIdle 死循环,还是没有从netconn_connect()返回
3.服务端能监测到8962发起的连接并显示连接成功,不过端口并不是8962重新连接的时候指定的那个端口,而是随机的端口,经常是跳到4097端口,重点是,这时候的客户端其实并没有连接成功,也就是还是没从netconn_connect()返回!!


icepnt,您好!
这个问题现在正在测试中,一旦通过会及时联系您的。

问题已经修正,请联系销售!
点赞  2011-1-6 16:14

回复 15楼 ebuffalo 的帖子

谢谢楼上分享了这样的信息,对于在μC/OS上使用lwIP协议栈目前我还没试过,一直都是在裸奔。我昨天晚上看lwIP协议栈的时候,也发现了它里边有些代码在注释上有错误(注:我的是lwip1.3.0)。lwIP协议栈是灵活性很强的,可能用起来并不是太容易,一不小心容易出现问题各种各样的问题。但是如果肯下功夫,总会弄明白的。而且以后你再去使用商用协议栈会很轻松的,因为当你分析过lwIP代码后,很多关于TCP/IP的理论你都弄明白了,而这一块本身也是很复杂的,商用协议栈把很多事情都替用户做完了,然后封装起来,减少了用户可配置的部分,自然就避免了很多的错误发生的可能性,如果你去学习RL—TCPnet的话肯定要容易很多的。其实不管是什么协议栈都是依据TCP/IP协议族来实现的,这个是通用的。
我认为产生了fault,我们应该更进一步地去分析产生了什么fault,是usage fault,bus fault 还是memory management fault?.
最最重要一点是,免费的,开源的本来不多,lwIP用来学习是很理想的,同时我们也看到TI 的S2E模块用到了lwIP还是很稳定的,而且也山寨了。
对于我个人而言,主要是学习TCP协议栈,不在乎是哪种。
如果是商用的法,谁都要慎重的。
以上是个人的看法,欢迎大家批评指正啊。

[ 本帖最后由 academic 于 2011-1-7 15:29 编辑 ]
点赞  2011-1-6 16:28
mark 刚分到了9B96用以太网做数据发送作用的任务....
点赞  2011-1-7 14:39

回复 7楼 fengzhang2002 的帖子

版主,说一下经验?
点赞  2011-1-7 23:45

引用: 原帖由 fengzhang2002 于 2010-12-31 16:15 发表 LWIP的BUG确实多,但胜在免费,网上资料也比较多,我目前应用在公司产品中叶比较稳定了

 

版主说其公司产品上只用了UDP,TCP还没有调通。

点赞  2011-1-8 13:52

回复 沙发 academic 的帖子

顶顶哈哈哈
点赞  2011-1-14 17:19
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复