pbuf的结构
| next | 指向链表上的下一个pbuf
| payload | 指向pbuf管理的数据的起始地址,可以是紧跟在pbuf后的RAM,也可以是ROM上的某个地址,取决于pbuf是什么类型
| len | 当前pbuf中的有效数据长度
| tot_len | 当前pbuf和其后所有pbuf的有效数据长度
| flags | ref | flags(4位)表示pbuf的类型, ref(4位)表示被引用的次数
| Room for packet headers |
| data |
LwIP根据分配的位置定义了pbuf的三种类型:
1.PBUF_POOL -->内存池分配,
2.PBUF_RAM -->动态分配,之前讲过的通过内存堆,也就是Heap分配。
3.PBUF_ROM -->没有内存空间给user loader使用,只能在发送常量时被使用(it can be used only for sending constant data)
主要区别:
在接收数据包时,合适的pbuf类型是PBUF_POOL,在极短的时间内可以分配到。
在发送数据包时,一般采用PBUF_RAM。
PBUF_ROM在申请的时候只分配相应的pbuf的包头,而不申请数据区空间。
PBUF_POOL和PBUF_ROM删除用memp_free( )
PBUF_RAM删除使用mem_free( )
pbuf形成了链表,只有当ref=1的时候,该pbuf才能被删除。在pbuf创建的时候ref被初始化为1,所以在中间的pbuf是不能被删除的,也就是只有链首的Pbuf能被删除。