ZYNQ-pbuf操作指南(一)

简介: ZYNQ-pbuf操作指南

在网口调试中比较重要的部分就是对pbuf的操作,本文主要针对pbuf的结构体、pbuf层和pbuf的相关函数的操作指南进行讲解说明。

pbuf结构体


struct pbuf {  
        struct pbuf *next;                                                                                                                       
        void *payload;   
        u16_t tot_len;    
        u16_t len;  
        u8_t /*pbuf_type*/  type;                                                           
        u8_t flags;  
        u16_t ref;  
} ;  

image.png

pbuf类型


PBUF_RAM


PBUF_RAM类型的pbuf是调用mem_malloc函数从内存堆分配得到的,分配的大小由三部分组成:数据存储空间length、pbuf管理结构体空间SIZEOF_STRUCT_PBUF和存储协议栈头的offset。分配内存成功之后,就是对pbuf管理结构体的初始化。Pbuf管理结构体位于分配的堆内存的开始,接着的存储协议头的offset空间,最后才是存储数据的空间。

此种类型的pbuf内存布局如下:

image.png

PBUF_ROM和PBUF_REF


上述两种类型的pbuf相似。代码调用memp_malloc从内存池分配MEMP_PBUF类型的内存池,仅仅分配pbuf结构体大内存,指向存储数据空间的payload指针置位NULL,此值由调用者设置为另外的一片内存空间。

PBUF_POOL


PBUF_POOL类型的pbuf是调用memp_malloc函数从内存池中分配内存的。PBUF_POOL类型pbuf是从MEMP_PBUF_POOL内存的内存池中分配内存的,每种类型的内存池大小时固定的,如果存储数据和协议头所需要的空间大于此种类型内存池大小,则需要分配多个此种类型的内存池,并将这些内存池通过pbuf->next指针连接起来。而PBUF_RAM类型的pbuf是从内存堆中分配内存,之用申请的内存空间有剩余的连续空闲空间满足要求,则一次分配成功。

PBUF_POOL类型的pbuf内存布局如下:

image.png

pbuf 层


pbuf层包括如下:PBUF_TRANSPORT、PBUF_IP、PBUF_LINK、PBUF_RAW_TX、PBUF_RAW。

image.png

pbuf相关函数


pbuf_alloc


分配给定类型的 pbuf(可能是 PBUF_POOL 类型的链)。

为 pbuf 分配的实际内存由分配 pbuf 的层和请求的大小决定。(由参数决定)

struct pbuf *
pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)

image.png

pbuf_alloced_custom


该函数用于初始化已分配的pbuf,相当于自定义pbuf。

struct pbuf* pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, void *payload_mem, u16_t payload_mem_len)

image.png

pbuf_realloc


该函数将 pbuf 链收缩到所需的长度。

void
pbuf_realloc(struct pbuf *p, u16_t new_len)

image.png

根据所需的长度,链中的前几个 pbuf 可能会被跳过并保持不变。新的链中最后一个 pbuf 将被调整大小,并且其他剩余的 pbuf 将被释放。

如果 pbuf 是 ROM/REF,则只调整 ->tot_len 和 ->len 字段 。 不能在数据包队列上调用。 pbuf_realloc 不能增加 pbuf(链)的大小。

pbuf_free


取消引用 pbuf 链或队列,并在此链或队列的头部释放任何不再使用的 pbuf。 减少 pbuf 引用计数。如果它达到零,则 pbuf 被释放。

对于 pbuf 链,这对链中的每个 pbuf 重复,直到第一个 pbuf 在递减后具有非零引用计数。因此,当所有引用计数为 1 时,整个链都被释放了。

u8_t
pbuf_free(struct pbuf *p)

image.png

假设现有链 a->b->c 具有以下引用计数,调用 pbuf_free(a) 结果:

 1->2->3 变成 free...1->3
 3->3->3 变成 2->3->3
 1->1->2 变成free...free...1
 2->1->1 变成 1->1->1
 1->1->1 变成free...free...free

pbuf_free对链操作的解释简单来说就是,当第一个被释放后才会对后面的脸引用计数进行释放,否者值对最前面的那个链进行释放操作。

pbuf_clen


计算链中 pbuf 的数量 。

u16_t pbuf_clen(const struct pbuf *p)

image.png

pbuf_ref


增加 pbuf 的引用计数 。

void pbuf_ref(struct pbuf *p)

image.png

pbuf_cat


该函数用于连接两个pbuf,每个pbuf都可能是一个pbuf链。

void pbuf_cat(struct pbuf *h, struct pbuf *t)

image.png

使用此函数后,我们仅需要操作头部的pbuf即可,表示我们后面再也不会引用尾部的pbuf。 pbuf_clen得到的连接后的pbuf链中有2个pbuf。

pbuf_chain


将两个 pbuf(或 pbuf 链)链接在一起。一旦停止使用,调用者必须调用 pbuf_free(t)。如果不再使用 t,请改用 pbuf_cat()。

void pbuf_chain(struct pbuf *h, struct pbuf *t)

image.png

使用该函数会调整链中所有pbuf的tot_len字段、头的最后一个pbuf的next字段、尾的第一个pbuf的ref字段。

目录
相关文章
|
6月前
|
缓存 人工智能 Windows
LabVIEW阿尔泰PCIE 5654 例程与相关资料
LabVIEW阿尔泰PCIE 5654 例程与相关资料
37 1
|
6月前
|
存储 芯片 SoC
ZYNQ程序固化
ZYNQ程序固化
|
6月前
|
传感器 开发工具 芯片
【ZYNQ】ZYNQ7000 XADC 及其驱动示例
【ZYNQ】ZYNQ7000 XADC 及其驱动示例
153 0
|
6月前
|
安全 测试技术
【ZYNQ】ZYNQ7000 全局定时器及其驱动示例
【ZYNQ】ZYNQ7000 全局定时器及其驱动示例
158 0
|
6月前
|
测试技术
【ZYNQ】ZYNQ7000 私有定时器及其驱动应用示例
【ZYNQ】ZYNQ7000 私有定时器及其驱动应用示例
142 0
|
6月前
|
测试技术 Perl
【ZYNQ】ZYNQ7000 UART 控制器及驱动应用示例
【ZYNQ】ZYNQ7000 UART 控制器及驱动应用示例
260 0
|
6月前
|
开发工具 芯片 Perl
【ZYNQ】裸机 PS + PL 双网口实现之 ZYNQ 配置
【ZYNQ】裸机 PS + PL 双网口实现之 ZYNQ 配置
851 0
|
11月前
|
供应链 芯片
一种LED驱动专用控制电路
一、基本概述 TM1620是一种LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存 器、LED驱动等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热 水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、智能电表等数码管或LED显示设备。 二、基本的特性说明 采用CMOS工艺 显示模式(8 段×6 位~10段×4位) 辉度调节电路(8 级占空比可调) 串行接口(CLK,STB,DIN) 振荡方式:内置RC振荡 内置上电复位电路 内置数据锁存电路 内置针对LED反偏漏电导致暗亮问题优化电路 抗干扰能力强 封装形式:S
|
编解码 Linux
基于瑞芯微RV1109 Linux串口驱动调试心得(给正点原子DS100示波器点赞!)
基于瑞芯微RV1109 Linux串口驱动调试心得(给正点原子DS100示波器点赞!)
292 0
|
存储 芯片
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
493 0
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)