ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
LwIP中,内存的选择是通过以下这几个宏值来决定的,根据用户对宏值的定义值来判断使用那种内存管理策略,具体如下: * MEM_LIBC_MALLOC:该宏定义是否使用C 标准库自带的内存分配策略。该值默认情况下为0,表示不使用C 标准库自带的内存分配策略。即默认使用LwIP提供的内存堆分配策略。如果要使用C标准库自带的分配策略,则需要把该值定义为 1。 当该宏定义为0表示使用LwIP自己实现的动态内存管理策略。LwIP的动态内存管理策略又分为两种实现形式:一种通过内存堆(HEAP)管理策略来实现内存管理(大数组),另一种是通过内存池(POOL)管理策略来实现内存管理(事先开辟好的内存池)。 * MEMP_MEM_MALLOC:该宏定义表示是否使用LwIP内存堆分配策略实现内存池分配(即:要从内存池中获取内存时,实际是从内存堆中分配)。默认情况下为 0,表示不从内存堆中分配,内存池为独立一块内存实现。与MEM_USE_POOLS只能选择其一。 * MEM_USE_POOLS:该宏定义表示是否使用LwIP内存池分配策略实现内存堆的分配(即:要从内存堆中获取内存时,实际是从内存池中分配)。默认情况下为 0,表示不使用从内存池中分配,内存堆为独立一块内存实现。与MEMP_MEM_MALLOC只能选择其一。 要使用内存池的方式实现内存堆分配,则需要将MEM_USE_POOLS与MEMP_USE_CUSTOM_POOLS定义为 1,并且宏定义MEMP_MEM_MALLOC必须为 0,除此之外还需要做一下处理: 创建一个lwippools.h文件,在该文件中添加类似代码清单 5-15初始化内存池相关的代码,内存池的大小及数量是由用户自己决定的。 ``` 1 LWIP_MALLOC_MEMPOOL_START 2 3 LWIP_MALLOC_MEMPOOL(20, 256) 4 5 LWIP_MALLOC_MEMPOOL(10, 512) 6 7 LWIP_MALLOC_MEMPOOL(5, 1512) 8 9 LWIP_MALLOC_MEMPOOL_END ``` 此处需要注意一点的是,内存池的大小要依次增大,在编译阶段,编译器就会将这些内存个数及大小添加到系统的内存池之中,用户在申请内存的时候,根据其需要的大小在这些内存池中选择最合适的大小的内存块进行分配,如果具有最匹配的内存池中的内存块已经用完,则选择更大的内存池进行分配,只不过这样子会浪费更多的内存,当然,内存池的分配效率也是最高的,也相对于是我们常说的以空间换时间。 >关于如何选择这些宏定义及其分配策略,具体见表格 5‑1。 |MEMP_MEM_MALLOC|MEM_USE_POOLS|内存分配策略| |---|---|---| |0|0|LwIP中默认的宏定义,内存池与内存堆独立实现,互不相干。| |0|1|内存堆的实现由内存池实现。| |1|0|内存池的实现由内存堆实现。| |1|1|不允许的方式。| 总结来说,无论宏值怎么配置,LwIP都有两种内存管理策略:内存堆和内存池。