内存堆其实就是一个数组。为了方便管理需要将内存堆首尾组织成内存块,因此多分配的2 * SIZEOF_STRUCT_MEM大小的空间
/* 内存堆空间 */
static u8_t ram_heap[MEM_SIZE_ALIGNED + (2 * SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT];
动态内存堆会被组织成内存块,用于管理内存的分配和释放
/* 内存块结构体 */
struct mem {
/* 指向后一个内存块 */
mem_size_t next;
/* 指向前一个内存块 */
mem_size_t prev;
/* 内存块是否被使用 1:被使用 0:未使用 */
u8_t used;
};
初始化堆内存,将对内部组织成内存块链表。
/* 内存堆初始化 */
void mem_init(void)
{
struct mem *mem;
/* 内存堆地址 */
ram = LWIP_MEM_ALIGN(ram_heap);
/* 将内存堆首部组织成一个内存块,该内存块包含整个内存堆有效区域 */
mem = (struct mem *)ram;
mem->next = MEM_SIZE_A