7.11. LBUF
Overview
提供LBUF应用示例、常用相关 API 介绍和常见问题。
7.11.1. 应用示例
示例演示:
lbuf使用方法
example: 进入 apps/demo/demo_DevKitBoard/include/demo_config.h
,开启宏 USE_LBUF_TEST_DEMO
。
Note
lbuf 具有如下特点:
1.以链表的方式对读取和写入的数据进行管理;
2.数据先进先出;
3.在多次读写之后可能会产生碎片;
7.11.2. 常见问题
lbuf通过用于什么场合?
答:适合用于以数据以包/帧为单位读写的应用场合
7.11.3. API Reference
Functions
-
struct lbuff_head *lbuf_init(void *buf, u32 len, int align, int priv_head_len)
链表buf初始化
- Parameters
buf – [in] 需要lbuf进行管理的内存
len – [in] 内存长度
align – [in] 输入对管理的内存进行对齐的参数,避免后续使用因地址不对齐产生碎片
priv_head_len – [in] 要管理的一个数据包结构体的最小的长度
- Returns
lbuf操作句柄
-
void *lbuf_alloc(struct lbuff_head *head, u32 len)
分配内存空间进行存储数据包
- Parameters
head – [in] lbuf操作句柄
len – [in] 需要存入的数据包的长度
- Returns
成功则返回进行存储数据包的地址,调用时候需要用户把该块内存的类型初始化为数据包结构体的类型。失败则返回NULL。
-
void *lbuf_realloc(void *lbuf, int size)
重新分配lbuf_alloc()返回用于存储数据包的lbuf空间
- Parameters
lbuf – [in] lbuf_alloc()返回用于存储数据包的地址
size – [in] 需重新分配的空间的字节长度.注:size的大小只能比lbuf_alloc()中的len小,即只能重新分配更小的lbuf空间,不能扩大空间.
- Returns
重新分配后用于存储数据包的地址。失败则返回空指针。注:重新分配最好使用lbuf_real_size()获取lbuf空间的长度确认是否分配成功
-
int lbuf_empty(struct lbuff_head *head)
判断lbuf空间内的内容是否为空
- Parameters
head – [in] lbuf操作句柄
- Returns
返回1则为空,0则不为空
-
void lbuf_clear(struct lbuff_head *head)
清空lbuf空间内进行已经分配给数据包的空间
- Parameters
head – [in] lbuf操作句柄
-
void lbuf_push(void *lbuf, u8 channel_map)
把数据包写入分配好的lbuf区域
- Parameters
lbuf – [in] lbuf_alloc()返回用于存储数据包的地址
channel_map – [in] 选择映射到哪个通道,最多8个通道,使用位映射的方式进行通道对应.
-
void *lbuf_pop(struct lbuff_head *head, u8 channel)
读取对应的通道映射的lbuf区域存储的内容
- Parameters
head – [in] lbuf操作句柄
channel – [in] 需要读取的通道值,一般使用BIT(n),n为需要读取的通道
- Returns
成功则返回存储对应的通道映射的数据包的地址
-
int lbuf_free(void *lbuf)
释放存储数据包的lbuf空间
- Parameters
lbuf – [in] lbuf_alloc()返回用于存储数据包的地址
- Returns
0则释放失败,存在地址越界操作或者通道还没有被读完,ref-1,读完后才能完全释放。1则释放成功。
-
void lbuf_free_check(void *lbuf, u32 rets)
用于调试,检查是否可以释放存储数据包的lbuf空间
- Parameters
lbuf – [in] lbuf_alloc()返回用于存储数据包的地址
rets – [in] 调用lbuf_free_check()函数的返回地址rets,取值可参考lbuf_free()
-
u32 lbuf_free_space(struct lbuff_head *head)
返回可分配的用来存储数据包的最大lbuf内存空间
- Parameters
head – [in] lbuf操作句柄
- Returns
可分配的最大lbuf内存空间的字节长度
-
void lbuf_state(struct lbuff_head *head, struct lbuff_state *state)
获取lbuf空间的状态
- Parameters
head – [in] lbuf操作句柄
state – [out] lbuff_state结构体
-
void lbuf_dump(struct lbuff_head *head)
lbuf信息打印
- Parameters
head – [in] lbuf操作句柄
-
int lbuf_traversal(struct lbuff_head *head)
获取已经存入lbuf空间的数据包的数量
- Parameters
head – [in] lbuf操作句柄
- Returns
lbuf存储的数据包的数量
-
int lbuf_avaliable(struct lbuff_head *head, int size)
返回lbuf空间还可以被写入size大小数据包的数量
- Parameters
head – [in] lbuf操作句柄
size – [in] 欲检测写入数据包的大小
- Returns
可以写入的数量
-
int lbuf_real_size(void *lbuf)
返回给数据包分配的内存空间的大小
- Parameters
lbuf – [in] lbuf_alloc()返回用于存储数据包的地址
- Returns
实际占用空间的字节长度
-
int lbuf_remain_space(struct lbuff_head *head)
计算lbuf空间剩下多少剩余空间
- Parameters
head – [in] lbuf操作句柄
- Returns
剩余空间的字节长度
-
void lbuf_inc_ref(void *lbuf)
需要被重复释放的次数+1
- Parameters
lbuf – [in] lbuf_alloc()返回用于存储数据包的地址
-
struct lbuff_head
- #include <lbuf.h>
lbuf头部信息
-
struct lbuff_state
- #include <lbuf.h>
lbuf状态