环形块状缓冲区

优质
小牛编辑
169浏览
2023-12-01

环形块状缓冲区接口

结构体

struct  rt_rbb_blk
 rbb 中的块 更多...
 
struct  rt_rbb_blk_queue
 块队列。这些块在队列中,其 buffer 地址是连续的 更多...
 
struct  rt_rbb
 环形块状缓冲区,简称 rbb 更多...
 

枚举

函数

void rt_rbb_init (rt_rbb_t rbb, rt_uint8_t *buf, rt_size_t buf_size, rt_rbb_blk_t block_set, rt_size_t blk_max_num)
 环形块状缓冲区对象(rbb)初始化
 
rt_rbb_t rt_rbb_create (rt_size_t buf_size, rt_size_t blk_max_num)
 创建环形块状缓冲区(rbb)对象
 
void rt_rbb_destroy (rt_rbb_t rbb)
 销毁环形块状缓冲区(rbb)对象
 
rt_size_t rt_rbb_get_buf_size (rt_rbb_t rbb)
 获取环形块状缓冲区(rbb)中的缓冲区
 
rt_rbb_blk_t rt_rbb_blk_alloc (rt_rbb_t rbb, rt_size_t blk_size)
 从 rbb 中分一个块,当分配成功后,这个块将会加入到 blk_list 中
 
void rt_rbb_blk_put (rt_rbb_blk_t block)
 将一个块放入到 rbb 中
 
rt_rbb_blk_t rt_rbb_blk_get (rt_rbb_t rbb)
 从 rbb 中取出一个块
 
void rt_rbb_blk_free (rt_rbb_t rbb, rt_rbb_blk_t block)
 释放一个块
 
rt_size_t rt_rbb_blk_queue_get (rt_rbb_t rbb, rt_size_t queue_data_len, rt_rbb_blk_queue_t blk_queue)
 获取块队列,块队列中的块缓冲区地址连续
 
rt_size_t rt_rbb_blk_queue_len (rt_rbb_blk_queue_t blk_queue)
 获取块队列的数据长度
 
rt_uint8_trt_rbb_blk_queue_buf (rt_rbb_blk_queue_t blk_queue)
 返回块队列的缓冲区
 
void rt_rbb_blk_queue_free (rt_rbb_t rbb, rt_rbb_blk_queue_t blk_queue)
 释放块队列
 
rt_size_t rt_rbb_next_blk_queue_len (rt_rbb_t rbb)
 处于 put 状态并且是连续的块,可以组成块队列。 这个方法将会返回下一个可以组成块队列的总长度。
 

详细描述

环形块状缓冲区接口

环形块状缓冲区简称为:rbb。与传统的环形缓冲区不同的是,rbb 是一个由很多不定长度的块组成的环形缓冲区,而传统的环形缓冲区是由很多个单字节的 char 组成。

rbb 支持 零字节拷贝 。所以 rbb 非常适合用于生产者顺序 put 数据块,消费者顺序 get 数据块的场景,例如:DMA 传输,通信帧的接收与发送等等

枚举类型说明

enum rt_rbb_status

rbb 中的块状态

枚举值
RT_RBB_BLK_UNUSED 

未使用状态,当初始化完成或调用 blk_free() 之后的状态

RT_RBB_BLK_INITED 

初始化状态,调用了 blk_alloc() 后的状态

RT_RBB_BLK_PUT 

put 状态,调用了 blk_put() 后的状态

RT_RBB_BLK_GET 

get 状态,调用了 blk_get() 后的状态

函数说明

void rt_rbb_init(rt_rbb_t rbb,
rt_uint8_tbuf,
rt_size_t buf_size,
rt_rbb_blk_t block_set,
rt_size_t blk_max_num 
)

环形块状缓冲区对象(rbb)初始化

参数
rbb环形块状缓冲区对象
buf其内部所需的缓冲区
buf_size缓冲区的大小
block_set块的集合
blk_max_num块的最大数量
注解
当应用需要对齐访问 rbb 时,务必保证传入的 buf 地址已对齐。
rt_rbb_t rt_rbb_create(rt_size_t buf_size,
rt_size_t blk_max_num 
)

创建环形块状缓冲区(rbb)对象

参数
buf_size其内部所需的缓冲区大小
blk_max_num块的最大数量
返回
!= NULL: 创建成功,返回 rbb 对象 NULL: 创建失败
void rt_rbb_destroy(rt_rbb_t rbb)

销毁环形块状缓冲区(rbb)对象

参数
rbb待销毁的对象
rt_size_t rt_rbb_get_buf_size(rt_rbb_t rbb)

获取环形块状缓冲区(rbb)中的缓冲区

参数
rbb环形块状缓冲区对象
返回
缓冲区大小
rt_rbb_blk_t rt_rbb_blk_alloc(rt_rbb_t rbb,
rt_size_t blk_size 
)

从 rbb 中分一个块,当分配成功后,这个块将会加入到 blk_list 中

参数
rbbrbb 对象
blk_size块大小
返回
!= NULL: 分配成功,返回分配的块对象 NULL: 分配失败
注解
当应用需要对齐访问 rbb 时,务必保证传入的 blk_size 大小已对齐。
void rt_rbb_blk_put(rt_rbb_blk_t block)

将一个块放入到 rbb 中

参数
block块对象
rt_rbb_blk_t rt_rbb_blk_get(rt_rbb_t rbb)

从 rbb 中取出一个块

参数
rbbrbb 对象
返回
!= NULL: 取出成功,返回块 NULL: 取出失败
void rt_rbb_blk_free(rt_rbb_t rbb,
rt_rbb_blk_t block 
)

释放一个块

参数
rbbrbb 对象
block块对象
rt_size_t rt_rbb_blk_queue_get(rt_rbb_t rbb,
rt_size_t queue_data_len,
rt_rbb_blk_queue_t blk_queue 
)

获取块队列,块队列中的块缓冲区地址连续

1  tail head 2 +------------------+---------------+--------+----------+--------+ 3 | block3 | empty1 | block1 | block2 |fragment| 4 +------------------+------------------------+----------+--------+ 5  |<-- return_size -->| | 6  |<--- queue_data_len --->| 8  tail head 9 +------------------+---------------+--------+----------+--------+ 10 | block3 | empty1 | block1 | block2 |fragment| 11 +------------------+------------------------+----------+--------+ 12  |<-- return_size -->| out of len(b1+b2+b3) | 13  |<-------------------- queue_data_len -------------------->|
参数
rbbrbb 对象
queue_data_len块队列中数据的最大长度,返回的长度必须小于它
blk_queue块队列
返回
块队列中的数据总长度
rt_size_t rt_rbb_blk_queue_len(rt_rbb_blk_queue_t blk_queue)

获取块队列的数据长度

参数
blk_queue块队列对象
返回
数据总长度
rt_uint8_t* rt_rbb_blk_queue_buf(rt_rbb_blk_queue_t blk_queue)

返回块队列的缓冲区

参数
blk_queue块队列对象
返回
缓冲区
void rt_rbb_blk_queue_free(rt_rbb_t rbb,
rt_rbb_blk_queue_t blk_queue 
)

释放块队列

参数
rbbrbb 对象
blk_queue块队列对象
rt_size_t rt_rbb_next_blk_queue_len(rt_rbb_t rbb)

处于 put 状态并且是连续的块,可以组成块队列。 这个方法将会返回下一个可以组成块队列的总长度。

参数
rbbrbb 对象
返回
下一个可以组成块队列的总长度