- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LwIP配置文件opt.h和lwipopts.h初步分析
其实对于在Stellaris上应用lwIP最难的部分是如何去配置协议栈,使我们设计出来的web服务器或者串口转以太网及TFTP等等应用能够在lwIP协议栈的基础之上,既要保持稳定、快速地运行,又要占用最少的内存,正所谓:又要马儿跑,又要马儿不吃草。能跑是第一步,这一步呢,StellarisWare的例程基本上把这一步做得非常完美,丰富的公开源码的例程是一个很好的借鉴,很多例程稍稍修改就能弄到自己的设计当中去,比如在enet_Lwip这个例程中我们只需要通过makefsfilefile转化一下,或者直接把我们设计的网页index.htm(注意使用.html后缀有可能是访问不到的,具体原因以后分析)放到SD卡的根目录下就能跑了,但是我们还必须要考虑第二步,你虽然是照猫画虎的跑起来来了,但是忽略了一个很重要的问题,那就是enet_lwIP例程的lwip的配置是按照这个例程量体裁衣的,这个例程的网页是TI的介绍,你实际设计的网页肯定与它的例程不同,如果是动态网页就更应该注意了。这就是为什么有的人没有把例程分析清楚,就直接从中间卸掉一块放到自己的工程里边去之后,会出现的一大堆莫名奇妙的问题,什么打开网页的速度很慢啊?什么丢包啊,什么死机啦,什么跑到无限循环里边去了,总之很多。。。那主要你没有去修改过配置文件,没有为你的工程去量体裁衣。
就算第二步你侥幸躲过去了,也能够稳定的运行,就像借一双别人的鞋,虽然自己穿着大了点,但是呢,也能跑得很快,很稳当,不过有点浪费材料了。所以第三步我们要考虑的问题是,如何去配置lwip,使它去适合不同大小的脚,这就是本贴的主题lwIP的配置问题。尤其是内存的配置,配置多了浪费,配置少了跑不了或者不稳定。研究如何占用内存少,正式我们学习和采用lwip中最关键的问题。否则你可以直接去使用TCPnet,可配置的不太多,可以把主要的精力放到应用层上面去。
有点罗嗦,在论坛上一个字一个字的敲出来的。
在这里先说一下这两个配置lwip协议栈文件opt.h和lwipopts.h的关系:
opt.h是lwip“出厂”时原装的配置文件,它的作者是瑞士科学院的Adam等人,而lwipopts.h的作者是stellarisWare的工程师,它集合了opt.h中常常需要改动的部分和针对Stellaris所特有的配置选项添加进来了。这两个文件里边都配置的选项,以后者为准,不是共有的选项以它们各自的配置为准。
在这里先说一下lwip的内存管理机制,我们以enet_lwip这个例程为例。
在使用lwip的时候,我们可以使用两种形式的内存,一种是heap,一种是pool。heap就像是一整块蛋糕,我们需要多少就切多少,但是切了之后不能吃,只能看,因为看完之后,你还要放回去让别人看,因为当整块蛋糕很少的时候,有很多人等着都要切了看,这样很多次的切了之后又放回去,必然要产生一些很小的蛋糕块,这就是内存的碎片,到最后都是切得很细的蛋糕块,假如这个时候你想切块大点的蛋糕来看看,不好意思,你找遍了整个拼凑起来的蛋糕块,没有发现你想要的那么大的,结果你只好放弃了,所以最后内存申请回频频失败。
因为我们是嵌入式系统,我们的RAM再大也不能和PC机的天文数字相比,我们不能使用PC机所使用的蛋糕刀具来切蛋糕,必须使用更小型的道具,占用CODE更小,这一点Adam等相对于标准C而实现了几个小的内存分配、重分配和释放函数,它们都以mem_为前缀,已和原来的标准库函数相区别。当然如果你偏要使用大的刀,只需要
#define MEM_LIBC_MALLOC 1 。
这几个工具不管你是heap型模式切蛋糕还是pool模式切蛋糕,都可以用它们来完成,它们只是刀,至于怎么切蛋糕,这里不是它们该考虑的事情。
上面介绍了heap型的切蛋糕的方法,在简单说一下pool型切蛋糕的方法。
为了能让更多的人把蛋糕切回去看并且不至于还回来的蛋糕都是非常地小。Adam非常努力地在lwip切蛋糕上问题上采用一种Pool型的切法,找来一块蛋糕,把它切成n等分,每一份都是相同的固定大小,一份不够的可以拿两份,一份用起来太多的人你也最少拿一份(虽然浪费了,但是你也必须这么做),这种切法有两个好处,一是:现在你不能再随便的按自己的要求大小去切蛋糕了,大小是固定的,这样你申请了蛋糕之后不需要去切了,已经切好了,你可以很快地拿到一份大小固定的蛋糕,这非常适合于在接受数据帧的底层使用,当大量的数据来的时候,我们一下子需要很多的内存,这种方式下,我们很快就可以拿到足量的内存,不至于应接不暇;二是:在切成多少份,
原创力文档


文档评论(0)