本系列以V1.4.1为蓝本。
在此版本中,内存分配分为:普通和内存池两种。
本篇介绍普通的内存分配,所有的函数在文件mem.c(本小结介绍的是L496-L518)。
1. 声明变量
(1) 内存大小变量
mem_size_t ptr, ptr2;
声明两个16位的无符号整型变量。
即:
unsigned short ptr, ptr2;
(2) 内存链表变量
struct mem *mem, *mem2;
结构mem的原型:
struct mem { unsigned short next; unsigned short prev; unsigned char used; }
next和prev提供了向前和向后读写数据;
used为标志,1表示使用;0表示未使用;
作者在说明这个结构时,反复强调这是在堆(Heap)上进行的。
/** * The heap is made up as a list of structs of this type. * This does not have to be aligned since for getting its size, * we only use the macro SIZEOF_STRUCT_MEM, which automatically alignes. */
2. 入参检查
在分配内存时,我们可以指定内存大小:size;就是这个入参。
在说明这个入参前,我们要知道,作者设置了内存对齐的默认值:4。当然,我们也可以指定为2。
此值设置在lwipopts.h文件中。
MEM_ALIGNMENT 4
(1) 值为0
不分配内存,返回空值。
(2) 值小于最小内存对齐
当值小于MIN_SIZE(12,mem.c - L169)时,设置为12。
(3) 值大于内存对齐
当值大于MEM_SIZE(8000,lwipots.h)时,不分配内存,返回空值(NULL)。
对于进行入参的(2),(3)检测前有一个入参的再运算:
(((size) + MEM_ALIGNMENT - 1) &~(MEM_ALIGNMENT - 1))
(未完待续...)
LWIP源码 - mem_malloc(1)
时间: 2024-10-07 04:26:23