amobbs.com 阿莫电子技术论坛

标题: 关于LWIP和UIP的选用? [打印本页]

作者: eworker    时间: 2010-12-31 11:54
标题: 关于LWIP和UIP的选用?
看到坛子里很多人在使用LWIP时出现了各种问题,为何不选用UIP呢?UIP似乎很稳定的样子,没看到反映问题的帖子。
作者: eworker    时间: 2010-12-31 12:02
LWIP如果使用NOSYS,大循环程序结构,会不会就没有问题?
作者: eworker    时间: 2010-12-31 14:06
顶一下
作者: eworker    时间: 2010-12-31 15:55
转一篇文章:

lwip RawApi 数据发送2009-05-11 23:29       今天调试程序,使用lwip协议的Raw API工作模式,做了一个简单的客户/服务器系统。服务器运行FPGA上,使用Powerpc405处理器,32Kcache,64M内存,无操作系统。客户端运行在x86机器,安装Linux操作系统。服务器接收数据没问题,100M网卡下速度约为5MB,其中包括将数据从pbuf中copy至应用程序内存,如果不添加copy操作,大约能达到8MB的传输速度。

      数据的发送存在问题,一开始数据完全无法发送,通过GDB跟踪调试一阶段后,发现跟踪很困难,因为代码太多,而且在EDK中通过GDB调式也很麻烦。最后直接启动了Lwip的调试功能,将协议处理的每一步都打印出来,才发现错误:TCP控制管理块PCB中的send_buf值为0,每次发送的时候都会因为发送缓冲区为0而推出。通过追踪发现,send_buf的值由opt.h中TCP_SEND_BUF定义,而opt.h中TCP_SEND_BUF由lwipops.h中的TCP_SEND_BUF确定,而lwipops.h中由xilekd_lwipopts.h定义,这里的TCP_SEND_BUF由用户从EDK人机交互目录中设定:定义为65536。

#ifndef TCP_SEND_BUF

#define TCP_SEND_BUF 32768

#endif

lwipops.h中的TCP_SEND_BUF由xiledk_lwipopts.h

我在EDK的Lwip设置中,将这个值设置为65536,但是从实际来看,这个设置没有完全起作用,因此将设置去掉,TCP_SEND_BUF自动恢复为32768,数据发送成功。通过查看pcb的定义可知pcb中send_buf为u16类型,即为unsigned short,65536超出其表示范围。

本次的调试过程中,跟我感触最深的是Lwip协议栈的Debug功能,启动Debug参数之后,Lwip将协议栈中每一步的关键信息都打印出来,也因此找到了问题的所在。通过查看代码,发现几乎每一个函数内部都有类似的Debug语句,如

LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: queuelen: %u\n", (unsigned int)pcb>snd_queuelen));

其定义在Debug.h中实现:
define LWIP_DEBUGF(debug,x) do { if (((debug) & DBG_ON) && ((debug) & DBG_TYPES_ON) && (((debug) & DBG_MASK_LEVEL) >= DBG_MIN_LEVEL)) { LWIP_PLATFORM_DIAG(x); if ((debug) & DBG_HALT) while(1); } } while(0)

#define LWIP_PLATFORM_DIAG(x) do {printf x;} while(0)

不过我不是很明白为什么使用do{}while(0)。我猜测这种表示方法,是为了将函数内容封装为一句话,从而避免由于宏定义直接插入而可能引起的名字冲突之类的问题。确实令人佩服。。


采用RawAPI工作方式发送数据,数据量i较小的情况下,不存在问题,发送大数据量时,存在很大的问题:

主要原因在于啊,RawAPI工作模式基于回调,对于接受过程而言,通常需要用户主动去循环检测是否有数据包到达,一般是通过调用最底层的设备驱动程序实现此步骤;一旦有数据包到达,则提交给协议栈处理,如果这个数据包是特定链接的数据包,则协议处理完成之后交给用户定义的回调函数处理。对于数据发送过程,通用是用户通过tcp_write,tcp_output来主动发起发送操作。

     问题的关键在于,发送一次数据后协议栈会缩小滑动窗口的大小,直到接收到对方的应答,再扩大滑动窗口的大小,但是应答的接收同样是用户主动发起的,一般而言需要在发送结束之后才执行新的接收函数。这样导致的结果就是接收方发送的应答没有被发送方接收到。如果发送少量的数据,不会出现类似问题,发送数量较大时,就会发现最终发送的数据只有滑动窗口的大小。

    因此需要将大量数据的发送,划分为小块的数据发送,并且在每次发送之后都要调用底层的数据接收函数接收应答数据。
作者: liwang0806    时间: 2011-6-27 16:25
正在学习LwIP的路过....
作者: liwang0806    时间: 2011-6-27 16:31
1、BSD TCP/IP协议栈

    BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈)是BSD栈派生的。这是因为BSD栈在BSD许可协议下提供了这些专业栈的雏形,BSD许用证允许BSD栈以修改或未修改的形式结合这些专业栈的代码而无须向创建者付版税。同时,BSD也是许多TCP/IP协议中的创新(如广域网中饿拥塞控制和避免)的开始点。



2、uC/IP

    uC/IP是由Guy Lancaster编写的一套基于uC/OS且开放源码的TCP/IP协议栈,亦可移植到其它操作系统,是一套完全免费的、可供研究的TCP/IP协议栈,uC/IP大部分源码是从公开源码BSD发布站点和KA9Q(一个基于DOS单任务环境运行的TCP/IP协议栈)移植过来。uC/IP具有如下一些特点:带身份验证和报头压缩支持的PPP协议,优化的单一请求/回复交互过程,支持IP/TCP/UDP协议,可实现的网络功能较为强大,并可裁减。UCIP协议栈被设计为一个带最小化用户接口及可应用串行链路网络模块。根据采用CPU、编译器和系统所需实现协议的多少,协议栈需要的代码容量空间在30-60KB之间。http://ucip.sourceforge.net



3、LwIP

     LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP的含义是Light Weight(轻型)IP协议,相对于uip。LwIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LwIP TCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端嵌入式系统中使用。LwIP的特性如下:支持多网络接口下的IP转发,支持ICMP协议 ,包括实验性扩展的的UDP(用户数据报协议),包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议),提供专门的内部回调接口(Raw API)用于提高应用程序性能,并提供了可选择的Berkeley接口API。http://www.sics.se/~adam/lwip/或http://savannah.nongnu.org/projects/lwip/



4、uIP

    uIP是专门为8位和16位控制器设计的一个非常小的TCP/IP栈。完全用C编写,因此可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行。uIP中还包括一个HTTP服务器作为服务内容。许可:BSD许用证http://www.sics.se/~adam/uip/



5、TinyTcp

   TinyTcp 栈是TCP/IP的一个非常小和简单的实现,它包括一个FTP客户。TinyTcp是为了烧入ROM设计的并且现在开始对大端结构似乎是有用的(初始目标是68000芯片)。TinyTcp也包括一个简单的以太网驱动器用于3COM多总线卡http://ftp.ecs.soton.ac.uk/pub/elks/utils/tiny-tcp.txt

选择一个开源协议栈可以从四个方面来考虑:
       一个是是否提供易用的底层硬件API,即与硬件平台的无关性;一个是与操作系统的内核API。协议栈需要调用的系统函数接口是否容易构造,另一个对于应用支持程度。最关键的是占用的系统资源是否在可接受范围内,有裁减优化的空间否? 其中,BSD 栈可完整实现TCP/IP协议,但代码庞大,70KB-150KB之间,裁减优化有难度,uIP和TinyTcp代码容量小巧,实现功能精简,限制了在一些较高要求场合下的应用,如可*性与大容量数据传输。LwIP和uC/IP是同量级别的两个开源协议栈,两者代码容量和实现功能相似,LwIP没有操作系统针对性,它将协议栈与平台相关的代码抽象出来,用户如果要移植到自己的系统,需要完成该部分代码的封装,并为网络应用支持提供了API接口的可选性。uC/IP协议最初是针对uC/OS设计,为方便用户移植实现,同样也抽象了协议栈与平台相关代码,但是协议栈所需调用的系统函数大多参照uC/OS内核函数原型设计,并提供了协议栈的测试函数,方便用户参考,其不足在于该协议栈对网络应用支持不足。 根据以上分析,从应用和开发的角度看,似乎LWIP更得到了网上很多朋友使用的青睐;uC/IP在文档支持与软件升级管理上有很多不足,但是它最初是针对UC/OS而设计,如果选用UC/OS作为软件基础的话,在系统函数构造方面有优势。当然你选择其他操作系统的话,可参照OS_NULL文件夹下的文件修改。 以上的这些开源协议栈也并非免费,拿来就可以用,据我所知,UC/OS的母公司推出UC/OS-TCP/IP花了6人*2年的工作量,国内某公司使用LWIP作为移植的参照,花了4-5人*2年的工作量来测试与优化协议,使用商用TCP/IP栈的高费用就不足为奇了。 作为广大的爱好者学习而言,如果只是跑跑原型,实验一下效果,以上的几种开源协议栈都提供了测试的例子,应该是不错的选择。个人的看法:LWIP可优先考虑,至少网上有很多的人一块研究,参考的资料较多;UC/IP其次,如果你想深入学习TCP/IP的话,移植UC/IP是一种挑战性的工作,它尚需完善。
作者: ljt8015    时间: 2011-6-27 17:34
lwip功能全些!~
作者: luck851    时间: 2011-6-27 19:18
mark
作者: shuaishuai2599    时间: 2011-11-14 09:12
mark!
作者: hejiang177    时间: 2012-3-28 09:26
mark!
作者: simon_leung    时间: 2012-4-23 14:44
mark!!!!!~
作者: tgyd    时间: 2012-4-23 15:19
UIP的性能很差。TCP的包好像是挨个确认。跑UDP还行。
作者: lionsg    时间: 2012-12-10 22:02
有人用过或者听过 GHNet TCP/IP Stack  和Fusion Embedded™ TCP/IPv4/IPv6 吗?和LwIP相比,哪种实用化更好?
作者: mcuandmex    时间: 2012-12-15 14:23
1.BSD TCP/IP
2.UC/IP
3.LWIP
4.UIP
5.TINYTCP
作者: robin45853258    时间: 2013-1-5 10:21
liwang0806 发表于 2011-6-27 16:31
1、BSD TCP/IP协议栈

    BSD栈历史上是其他商业栈的起点,大多数专业TCP/IP栈(VxWorks内嵌的TCP/IP栈) ...

您好,有个问题请教一下。我刚刚研究LwIP的移植,里面的硬件模拟层涉及到邮箱的部分不太理解。为什么说uc/OS II的消息队列没有管理功能,所以要人为地构造链表呢(参考的是网上流传的焦海波和杨晔的移植方法)?如果我直接使用消息队列函数会有什么问题?非常感谢!
作者: robin45853258    时间: 2013-1-5 12:04
基于我对uc/osII的理解,讲一下我的想法,不知道对不对啊。UC/OSII中,当创建消息队列的时候就会产生一个维护消息队列的结构,也就是一个控制块,当向消息队列里发送消息的时候就会在内存中保存消息,但是当删除消息队列的时候只是删除了这个控制块,并没有清空内存,导致内存产生碎片。所以,UC/OSII中明确指出不能轻易用队列删除函数,如果使用就要维护好内存,所以移植LwIP的时候由于借用了消息队列机制来实现邮箱,有反复使用创建和删除的操作,所以不能轻易使用UC/OSII,这点是UC/OS的机制所决定的。
如理解有误,请指教!
作者: limxuzheng    时间: 2013-3-26 11:48
学习了啊, 一只听看很多人用lwip,不过还没时间整过。
作者: asia_hoo    时间: 2013-3-31 20:16
我也是在 ecos上跑lwip 还行
没具体测试 负荷那些
作者: wwjdwy    时间: 2013-5-29 16:20
学习了,好像lwip多一些啊
作者: NJ8888    时间: 2013-5-29 16:53
裸奔,跑lwip,UDP协议
作者: 东海傲虾    时间: 2013-7-24 10:06
UIP是专门为16位一下的单片机设计的,LWIP功能全,稳定与不稳定肯定与自己编写的代码有关系,很多人移植后不好用就说协议栈不好,怎么不想想是不是自己的问题呢
作者: bbglx    时间: 2013-8-5 13:20
mark以后看看
作者: sgj245609615    时间: 2013-11-22 17:49
了解一下     
作者: wrj    时间: 2013-11-26 15:02
kankan看看
作者: bookerca    时间: 2013-12-18 21:43
mark here,ok?
作者: Cavsle    时间: 2014-9-19 11:19
LwIP现在是比较主流的开源嵌入式TCP/IP协议栈,很多mcu都可以使用,就是RAM占用回答一点,对于ram有要求的还是要注意看一下是不是能精良精简代码,减少ram的占用
作者: djragon    时间: 2014-9-19 11:41
lwip会多点        

作者: spacekey    时间: 2014-9-19 11:45
uIP 适合 8位机用
作者: ggchao    时间: 2014-9-19 13:54
准备使用Lwip的
作者: 昨夜清风    时间: 2014-9-23 11:46
东海傲虾 发表于 2013-7-24 10:06
UIP是专门为16位一下的单片机设计的,LWIP功能全,稳定与不稳定肯定与自己编写的代码有关系,很多人移植后 ...

LWIP其实还有个精简的版本,适用16位,8位的单片机,占用内存小,官网有说明的
作者: kejinkun    时间: 2014-10-18 11:18
看来要升级到lwip了
作者: zhq_chd    时间: 2015-1-14 13:49
lwip可用
作者: huang_4115    时间: 2015-3-14 11:24
正在学习lwip
作者: allen_comm    时间: 2016-12-15 14:07
确实不少开源系统里面用的都是lwip,应该说lwip在功能性和精简程度上做的相对比较平衡吧
作者: wl_am    时间: 2017-1-18 22:05
即将用到这一块.




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4