LwIP协议栈的学习与应用.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

LwIP协议栈的学习与应用

前言

LWIP(LightWeightInternetProtoco1)是瑞士计算机科学院(SwedishInstituteofComputerScience)AdamDunkels等人开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LWIP的含义是LightWeight(轻型)IP协议。LWIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LWIPTCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用。一般它只需要几十KB的RAM和40KB左右的ROM就可以运行,这使LWIP协议栈适合在小型嵌入式系统中使用。

第二章基础组件

内存管理

LwIP内存管理部分(mem.hmem.c)比较灵活,支持多种分配策略,有运行时库自带的内存分配(MEM_LIBC_MALLOC),有内存池分配(MEM_USE_POOLS),有动态内存堆分配,这些分配策略可以通过宏定义来更改。在嵌入式系统里面,C运行时库自带的内存分配一般情况下很少用,更多的是后面二者,下面就这两种分配策略进行简单的分析:

动态内存堆分配

其原理就是在一个事先定义好大小的内存块中进行管理,其内存分配的策略是采用最快合适(FirstFit[user1])方式,只要找到一个比所请求的内存大的空闲块,就从中切割出合适的块,并把剩余的部分返回到动态内存堆中。在分配的内存块前大约有12字节会存放内存分配器管理用的私有数据,该数据区不能被用户程序修改,否则导致致命问题。

内存释放的过程是相反的过程,但分配器会查看该节点前后相邻的内存块是否空闲,如果空闲则合并成一个大的内存空闲块。

采用这种分配策略,其优点就是内存浪费小,比较简单,适合用于小内存的管理,其缺点就是如果频繁的动态分配和释放,可能会造成严重的内存碎片,如果在碎片情况严重的话,可能会导致内存分配不成功。对于动态内存的使用,比较推荐的方法就是分配-释放-分配

-释放,这种使用方法能够减少内存碎片。

mem_init()内存堆的初始化,主要是告知内存堆的起止地址,以及初始化空闲列表,由lwip初始化时自己调用,该接口为内部私有接口,不对用户层开放。

mem_malloc()申请分配内存。将总共需要的字节数作为参数传递给该函数,返回值是指向最新分配的内存的指针,而如果内存没有分配好,则返回值是NULL,分配的空间大小会收到内存对齐的影响,可能会比申请的略大。返回的内存是“没有“初始化的。这块内存可能包含任何随机的垃圾,你可以马上用有效数据或者至少是用零来初始化这块内存。内存

的分配和释放,不能在中断函数里面进行。内存堆是全局变量,因此内存的申请、释放操作做了线程安全保护,如果有多个线程在同时进行内存申请和释放,那么可能会因为信号量的等待而导致申请耗时较长。

mem_calloc()是对mem_malloc()函数的简单包装,他有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小,与mem_malloc()不同的是它会把动态分配的内存清零。有经验的程序员更喜欢使用mem_malloc(),因为这样的话新分配内存的内容就不会有什么问题,调用mem_malloc()肯定会清0,并且可以避免调用memset()。

mem_realloc() 函数

说实话,我也不知道这个说法对不对,反正从源代码里面看,前者叫heap,后者叫pool。欢迎专家指正。Opt.h

说实话,我也不知道这个说法对不对,反正从源代码里面看,前者叫heap,后者叫pool。欢迎专家指正。

动态内存分配方式只能在内存池与内存堆中二选一。他们对外部的接口都是一样,只不过内部工作原理不太一样。动态内存池分配部分底层实现是在memp.c,memp.h文件里面实现。

采用内存池进行内存管理可以有效防止内存碎片的产生,而且相比之下内存的分配、释放效率更高,不过,他会浪费部分内存。

需要启用宏MEM_USE_POOLS和MEM_USE_CUSTOM_POOLS,另外还要做类似如下定义:

LWIP_MALLOC_MEMPOOL_STARTLWIP_MALLOC_MEMPOOL(20,256)

LWIP_MALLOC_MEMPOOL(10,512)

LWIP_MALLOC_MEMPOOL(5,1512)

LWIP_MALLOC_MEMPOOL_END

上面的意思就是分配20个256字节长度的内存块,10个512字节的内存块,5个1512字节的内存块。内存池管理会根据以上的宏自动在内存中静态定义一个大片内存用于内存池。在内存分配申请

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档