RT-Thread + LwIP,强大的优化
开始我也没想到,优化会到这种地步先看一个几种开源的TCP/IP协议栈对比:
几种开放源码的TCPIP协议栈概述
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是一种挑战性的工作,它尚需完善。 从上面可以看得出来,如果要在小型设备上跑TCP/IP协议栈,体积无疑是一个重要的衡量指标。如果<1k RAM,毫无疑问uip是首选。
但uip的功能限制也蛮多的,和RTOS配合不是太好(如果要在2K RAM上跑RTOS,估计也够残废了),实时性也比较低(其中关中断用于做数据保护)
但RAM是32K - 64K的系统呢,似乎LwIP和ucip不错。BSD TCIP/IP协议栈就不要想了,RTEMS就是用的BSD TCP/IP协议栈移植,体积是比较庞大的。ecos选择要好些,有LwIP和BSD TCP/IP协议栈的选择。
网上的资料显示,LwIP的体积大约在几十K的RAM和40K左右的ROM,这个和RT-Thread/AT91SAM7X256 0.2.4版本给出的指标是比较一致的,64K SRAM用来跑LwIP,剩余的就不多了(10K左右)。而ucip则绑定到了那个收费的ucos-ii。
RT-Thread 0.3.0版本的协议栈用的依然是LwIP,但做了改进,效果非常明显,而且依然保留了RTOS的特性。RT-Thread选择LwIP是有原因的,首先是它的功能,其次是它的体积。功能上满足大多数嵌入式设备的需求,同时体积也比较小,在优化的情况下,体积更进一步缩小了。 RT-Thread 0.3.0 + LwIP指标:(无shell,无文件系统的情况,最大32线程优先级)
5K SRAM静态占用,3K RAM动态占用(ping设备时)。
STM32F103VB(128K Flash, 20K SRAM)上跑RT-Thread + LwIP + Web Server没问题。 这个绝对要顶...... 顶一个。
感谢ffxz帮忙! ffxz你把以太网模块发给智林更换一下吧 顶,有空搞到我做的板子上跑一炮! 多谢,多谢。。。要顶 ffxz,web server啥时候能搞到ZE上去呀?最近启动一个项目要做WEB应用。
打算直接用你这个系统试试. 是的,正在筹划这个事,刚好enc28j60也通了。
不过在这之前会把RT-Thread的文档先完善,新的文档将包含lwip相关的一些编程内容。 goahead webserver,按照它文档的说法,对每个连接是需要8K内存的,所以这个地方也要优化,期望值是2K。
然后还会在目前的DFS上架一层API,让它和goahead webserver去适配。(原来的goahead webserver是在s3c2410上做的,上面包含了完整的newlib库支持) 哦,看样子我只能先玩玩Libhttp了 不过我的产品上会有一片512K*16位的SRAM。每个连接8K那是小case呀。而且连接数量不会很多,就是各个局的领导查看设备的运行状态。能否先搞一个不优化的? 很快的,如果这几天公司不用加班的话 呵呵,那就期待你的作品 很好,很强大,谢谢你的无私奉献。喔耶!! 赞一个 ffxz 可以告诉我你的联系方式吗? 强烈支持 http://cache.amobbs.com/bbs_upload782111/files_15/ourdev_449633.gif
(原文件名:gmail.gif)
联系方式如上。 GoAhead WebServer默认情况下,64KSRAM是不够的,现在终于开始一点点往下缩了:
finsh>>list_mem()
total memory: 48264 <-- 总共可用内存
used memory : 20448 <-- 当前使用的内存
maximum allocated memory: 22824<-- 历史记录中使用的最大内存
finsh>>list_thread()
threadpristatus sp stack size max used left tickerror
-------- ---- ------- ---------- ---------- ---------- ---------- ---
echo 0xc8 suspend 0x000000c0 0x00000400 0x00000124 0x00000014 000
twebsrv0x8c suspend 0x00000160 0x00000400 0x000001bc 0x00000012 000
tcpip 0x78 suspend 0x000000b8 0x00000400 0x000000dc 0x00000014 000
tidle 0xff ready 0x00000050 0x00000100 0x00000050 0x00000016 000
tshell 0x14 ready 0x00000228 0x00000800 0x00000334 0x0000005d 000
eth 0x80 suspend 0x00000088 0x00000400 0x000000a0 0x00000014 000
pri 线程优先级
sp 当前线程栈指针位置
stack size 线程栈大小
max used 历史记录中栈使用的最大位置
Kernel + LwIP + Filesystem + GoAhead WebServer
一个端午假期的成果!新版本支持线程栈溢出监测了。 呵呵,啥时候能发布呀? 外部不是还有512K 字节SRAM么。可以充分利用一下哈! 我试试外部的512K SRAM,上次被那块板子搞怕了,SRAM会自己变的~~ 那可能是受屏幕的影响。你调外部SRAM的时候可以考虑把屏幕拿下来,或者在主程序的第一句就初始化屏幕的外部接口。
这个板子的SRAM已经经过了我无数次测验证了,请放心使用。有问题可以直接联系我 使用外部SRAM的时候要在启动代码里做相应的设置 哦,原来要这样啊。那如果SRAM和LCD一起用的话应该如何设置?我试试了下,即使LCD不初始化,SRAM也不可用。 SRAM要和LCD一起用的话就在main函数的第一句化调用LCD外部接口初始化函数就可以。
SRAM对应的外部接口初始化代码在启动代码里,有一个使用外部SRAM的宏定义DATA_IN_ExtSRAM。把它定义成1如下:
DATA_IN_ExtSRAMEQU1
还要把__initial_sp定义成__initial_sp EQU 0x20000000 + Stack_Size
更详细的使用外部SRAM的例子请参考ST官方发布的库文件里的例子。
在库文件的STM32F10xFWLib2.0.3\FWLib\examples\FSMC\SRAM_DataMemory文件夹下有详细的英文说明,你可以先跑跑那个例子 GoAhead WebServer Ready!
这几天就开始考虑发布版本,呵呵,当然希望体积能够再缩小下来,同时也试着做几个ASP,让网页显示和Target联系起来。最终外扩的SRAM没有用起来,打算在优化RTGUI的时候再把外扩的512K SRAM放开吧。 一直都在期待GoAhead WebServer的发布 赞一个!不过ffxz你起得够早啊?
还是压根就没睡,一直再调GoAhead ?
如果真是,我再赞一个。呵呵!精神可嘉呀。
我昨天也在你的系统上移植libhttp了,目前能编译通过了,但是还有几个跟系统时间相关的函数不知道如何实现。主要是MDK的time.h里的函数,不知道咋整,还有文件操作接口不知道如何跟你的文件系统适配起来。对你的文件系统还不熟悉。弄起来比较费劲。
不知道你的文件系统的使用说明出来了没有? 从楼主的发帖时间来看,多数时候是6:30起床白天满负荷上班大概17:00左右下班有时加班
回家后继续研究他的系统 BBS上回帖及其它联系工具的答疑解问 还要沟通协调其它成员的工作
23:30前准时睡觉偶尔过零点...
不得不叹道:"强" 【30楼】 PZLPDY
目前能够使用标准的文件接口了,把dfs_posix.c编译进去即可。GoAhead WebServer可以先给你一份,和你说的类似,time函数实现我现在返回了一个固定值,正在加RTC设备驱动。
【31楼】 aozima 残剑饮血
你强好不好啊,这你都能摸索出来,不得不佩服。
一般23:00前得准时睡觉的,但早上6:00也必须得起来了,小孩闹得呢,不可能睡的。 那先谢过了。如果我不在发我邮箱吧!tmb1983@163.com
我拿到之后先测测稳定性 ls,已经发了
今天加班加得比较累~~ 没lpc2478的开发板呢,想从icdev那里弄个,可惜他们没货。 lwip听说不错 谢谢了!只是对zlg的东西很反感。 ICDEV的那个2478开发板好像不带以太网的吧? 对于lpc2478,我们看中的是在上面能够实现更好的RTGUI效果以及动态模块加载的功能。所以基于这个目的,SDRAM是必要的。
当然我们也可以在PXA上实现这些开发工作,不过目前来看PXA上的开发进展缓慢了些。 mark 这个体积优化已经合并到最新的lwip 1.3.2中(RT-Thread google svn中的版本),争取能够合并到官方版本中。
另外和LwIP相关的几个其他优化会继续下去,主要体现在使用bsd socket的性能,lwip本身的性能上,这个是基于RT-Thread的OS监控工具来完成的,因为在使用监控工具的过程中,发现LwIP在使用RTOS的情况下,某些地方处理得不是太好。
RT-Thread推荐使用bsd socket的方式编写代码,因为bsd socket在网络编程上已经是一个事实的标准,在linux下通用,在windows下也大部分通用。同样遵循bsd socket风格的网络代码,可以非常容易的移植到不同的平台中,这对于代码(自身技术)的积累无疑是非常重要的。所以RT-Thread这边希望bsd socket接口能够做得更完善些,离标准更进一些,性能也不太差。而对于0.4.0版本的RT-Thread,也会试图推出完全POSIX的接口,特别是pthread实现。 我用fsl的mcf52235 32kB的ram用freertos+lwIP发现ram不够了,总共要近50KB的ram才能跑,现在想优化下lwIP,不知道在哪几方面入手,可以适当降低以太网的传输速率,还望牛人们多多点拨啊 太强了! 谢谢了 了解了 学习学习 回复【46楼】moying050
我用fsl的mcf52235 32kB的ram用freertos+lwIP发现ram不够了,总共要近50KB的ram才能跑,现在想优化下lwIP,不知道在哪几方面入手,可以适当降低以太网的传输速率,还望牛人们多多点拨啊
-----------------------------------------------------------------------
比较下RT-Thread在LwIP上做的修改就知道了,目前google svn上的LwIP版本是1.3.2,对比下就知道了。
呵呵,或者用用RT-Thread/ColdFire的版本。 回复【50楼】ffxz
-----------------------------------------------------------------------
我先看看那个代码吧,不能优化再用RT-Thread的版本
顺便问下,RT-thread好吗?跟其他rtos相比 从RT-Thread开发人员的角度说,好,永远好,^-^ RT-Thread是有ColdFire版本的。
从技术人员的角度说,离Nucleus,ThreadX这些老牌RTOS有一段距离。再从RT-Thread开发人员的角度说,今年,0.4版本这个分支一定要弥补这个距离。 ffxz 豪言万丈!
顶!!!!!!!!!!! 回复【52楼】ffxz
-----------------------------------------------------------------------
支持牛人啊 回复【52楼】ffxz
-----------------------------------------------------------------------
我在http://code.google.com/p/rt-thread/上只看到了0.30的,而且也没看到支持coidfire
问下哪有吗?给个链接吧,谢了哈 回复【52楼】ffxz
从RT-Thread开发人员的角度说,好,永远好,^-^ RT-Thread是有ColdFire版本的。
从技术人员的角度说,离Nucleus,ThreadX这些老牌RTOS有一段距离。再从RT-Thread开发人员的角度说,今年,0.4版本这个分支一定要弥补这个距离。
-----------------------------------------------------------------------
"从技术人员的角度说,离Nucleus,ThreadX这些老牌RTOS有一段距离"这个指的是哪些方面呢? 马克 比较了下RTT下的lwIP代码和官方的lwIP代码,发现在协议栈实现和内存管理上基本没有改动,看opt.h和lwipopts.h,也没发现很大的特别之处,想问下ffxz,协议栈的优化是怎么实现的,希望能大致指明个方向,现在都没头绪的,谢谢了 真是强人啊 好东西 mark 回复【58楼】moying050
比较了下rtt下的lwip代码和官方的lwip代码,发现在协议栈实现和内存管理上基本没有改动,看opt.h和lwipopts.h,也没发现很大的特别之处,想问下ffxz,协议栈的优化是怎么实现的,希望能大致指明个方向,现在都没头绪的,谢谢了
----------------------------------------------------------------------
LWIP太耗内存了。只开了UDP,居然要耗掉15K RAM。
ZLG LWIP应用指南\UDP服务器实验V 0.01\Debug\Obj:
Main.o 104
Target.o 48
etharp.o 2 644 16 201
icmp.o 696
inet.o 54
inet_chksum.o 400
init.o 12
ip.o 1 028 2
ip_addr.o 82 4
lwiplib.o 400 20 72
mem.o 1 016 4 129
memp.o 392 24 9 464
netif.o 230 9
pbuf.o 982
raw.o 132 4
startup_ewarm.o 6 240 2 048
stats.o 192
stellarisif.o 948 188
sys_arch.o 30
udp.o 1 104 4
-------------------------------------------
Total: 10 308 304 16 313 mark mark mark 回复【58楼】moying050
比较了下rtt下的lwip代码和官方的lwip代码,发现在协议栈实现和内存管理上基本没有改动,看opt.h和lwipopts.h,也没发现很大的特别之处,想问下ffxz,协议栈的优化是怎么实现的,希望能大致指明个方向,现在都没头绪的,谢谢了
-----------------------------------------------------------------------
同问 其实这个修改非常微不足道的,实质就是把lwip的内存管理转移到RT-Thread的内存管理上去了。关键点在memp.c 这个必须要mark的 mark 强大的优化!
具体优化了些什么? 回复【70楼】ljt8015
-----------------------------------------------------------------------
回复【67楼】ffxz
其实这个修改非常微不足道的,实质就是把lwip的内存管理转移到rt-thread的内存管理上去了。关键点在memp.c
-----------------------------------------------------------------------
看这里 顶 顶牛人 不错! mark mark! 回复【楼主位】ffxz
-----------------------------------------------------------------------
mark mark mart 嗯,上一个RT-Thread + LwIP速度测试不知道大家是否注意到了,这个算是我目前看到的cortex-m3上tcp速度最快的了
接收到了7MB/s,发送到了5.2MB/s
采用的是LPC1768,其他的,例如STM32F107、STM32F207还没做对比实验。可惜LPC1768没有硬件的IP/UDP/TCP checksum,否则应该更快! 回复【楼主位】ffxz
-----------------------------------------------------------------------
请问lwip里面那个自带的ppp到底怎么移植啊 这帖子时间可够长的。。。。。。 嘿嘿MARK 想问一下ffxz大侠,16K SRAM够不够整lwIP,裸机,速度可以降。 这个介绍好啊! 不要沉 mark ffxz大侠,什么时候出书,好买一本研究。 mark......谢谢分享
ffxz真是N人啊!!mark学习 支持~!! 学习。。。。 谢谢分享 谢谢分享... 这个一定要顶一下,正在用LWIP 现在看,还是很激动!正在学习中! mark 以备后用 RT-Thread/LwIP,很期待弄一下。 有人有 goahead的 资料么?找了好久都没找到资料啊 我也学习一下 ffxz 发表于 2010-12-28 23:01 static/image/common/back.gif
其实这个修改非常微不足道的,实质就是把lwip的内存管理转移到RT-Thread的内存管理上去了。关键点在memp.c ...
Mark一下,回头看看。 ffxz 发表于 2010-12-28 23:01 static/image/common/back.gif
其实这个修改非常微不足道的,实质就是把lwip的内存管理转移到RT-Thread的内存管理上去了。关键点在memp.c ...
MARK 此处 本帖最后由 qinmeng 于 2013-1-7 09:38 编辑
ffxz 发表于 2010-12-28 23:01 static/image/common/back.gif
其实这个修改非常微不足道的,实质就是把lwip的内存管理转移到RT-Thread的内存管理上去了。关键点在memp.c ...
我只发现lwip的mem.c文件被RT-Thread的mem.c文件替换了,难道RT-Thread还修改了lwip的memp.c文件么?我去好好看下~~
没发现有改动,倒是看到lwip1.4.1跟lwip1.4.0源代码有3、4行的差别
页:
[1]
2