(资料图)
Lwip的内存管理方式有两种:内存池和内存堆。本文先聊一下Lwip的内存堆(mem)。前面我们聊过ip层(网络层)传输的是Packet,可以回顾英飞凌tc397:基于Lwip以太网数据接收,小白级讲解,而每次Packet传输数据的多少是不确定的,这是因为上层模块一次发送的数据量是不确定的,因此给ip层分配合适的内存缓存上层数据是有必要的。
内存堆管理
对于Lwip来说,在分配堆空间时不要与用户堆混在一起,独立分配一个堆空间给Lwip使用,简言之:低耦合。实际上,就是分配一个全局数组,这个数组空间的大小需要开发人员预估。
对于堆的使用,我们清楚:分配某个指定大小空间时需要不断地查找未使用空间,如果能找到合适空间则将此空间开辟出来,否则空间分配失败。堆的使用可以让我们在整个堆空间任意切割空间大小,但是随着空间的不断被分配,可能会让整个堆空间变得零零碎碎。
使用内存堆分配内存空间时需要考虑时延问题,因为分配内存时需要通过链表查找合适空间位置,这势必消耗一定时间,堆空间的释放也需要消耗时间。
内存堆结构(mem)的链表形式如下所示:
对应Lwip mem.c文件声明的内存堆结构如下所示:
回答刚才的问题,如下图所示。每个内存堆结构消耗12byte空间,在分配我们想要的4K空间时,我们应该考虑第一个内存堆结构、最后一个内存堆结构以及最后一个内存堆结构对齐所消耗的内存。初始化完成,第一次分配内存空间时,可以分配最大4K的空间。