首页 >  资讯 >  详情

嵌入式以太网:Lwip内存管理之内存堆-世界看点

2023-06-21 15:25:37来源:个人图书馆-新用户3849ayns


(资料图)

Lwip的内存管理方式有两种:内存池和内存堆。本文先聊一下Lwip的内存堆(mem)。前面我们聊过ip层(网络层)传输的是Packet,可以回顾英飞凌tc397:基于Lwip以太网数据接收,小白级讲解,而每次Packet传输数据的多少是不确定的,这是因为上层模块一次发送的数据量是不确定的,因此给ip层分配合适的内存缓存上层数据是有必要的。

内存堆管理

对于Lwip来说,在分配堆空间时不要与用户堆混在一起,独立分配一个堆空间给Lwip使用,简言之:低耦合。实际上,就是分配一个全局数组,这个数组空间的大小需要开发人员预估。

对于堆的使用,我们清楚:分配某个指定大小空间时需要不断地查找未使用空间,如果能找到合适空间则将此空间开辟出来,否则空间分配失败。堆的使用可以让我们在整个堆空间任意切割空间大小,但是随着空间的不断被分配,可能会让整个堆空间变得零零碎碎。

使用内存堆分配内存空间时需要考虑时延问题,因为分配内存时需要通过链表查找合适空间位置,这势必消耗一定时间,堆空间的释放也需要消耗时间。

内存堆结构(mem)的链表形式如下所示:

对应Lwip mem.c文件声明的内存堆结构如下所示:

回答刚才的问题,如下图所示。每个内存堆结构消耗12byte空间,在分配我们想要的4K空间时,我们应该考虑第一个内存堆结构、最后一个内存堆结构以及最后一个内存堆结构对齐所消耗的内存。初始化完成,第一次分配内存空间时,可以分配最大4K的空间。初始化完成以后,第一个内存堆结构指针(StartPtr)、最后一个内存堆结构指针(EndPtr)分别指向堆(即数组)的开始和结束位置,如A部分所示;这时上层要求使用100 byte空间,实际需要给112 byte空间,即下图中的绿色部分(100 byte + 12 byte(内存堆结构占用的空间)),这时在堆中分配出112 byte空间,第一个内存堆结构被占用;原来第一个内存堆空间被占用后,第一个内存堆结构指针(StartPtr)进行偏移112 byte,如B部分所示,此时原有的4096 byte堆空间只剩下3996 byte空间可用。这里的100 byte不仅包含pbuf,还包含对应上层的附加信息,如果发送一帧以太网的有效负载是1500 byte,则在对上开辟的空间要大于1500 byte。						

关键词:

[ 相关文章 ]

[ 相关新闻 ]