环形块状缓冲区
优质
小牛编辑
169浏览
2023-12-01
环形块状缓冲区接口
结构体 | |
struct | rt_rbb_blk |
rbb 中的块 更多... | |
struct | rt_rbb_blk_queue |
块队列。这些块在队列中,其 buffer 地址是连续的 更多... | |
struct | rt_rbb |
环形块状缓冲区,简称 rbb 更多... | |
枚举 |
详细描述
环形块状缓冲区接口
环形块状缓冲区简称为: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_t * | buf, | ||
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 中
- 参数
rbb rbb 对象 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 中取出一个块
- 参数
rbb rbb 对象
- 返回
- != NULL: 取出成功,返回块 NULL: 取出失败
void rt_rbb_blk_free | ( | rt_rbb_t | rbb, |
rt_rbb_blk_t | block | ||
) |
释放一个块
- 参数
rbb rbb 对象 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 --->| 7 8 tail head 9 +------------------+---------------+--------+----------+--------+ 10 | block3 | empty1 | block1 | block2 |fragment| 11 +------------------+------------------------+----------+--------+ 12 |<-- return_size -->| out of len(b1+b2+b3) | 13 |<-------------------- queue_data_len -------------------->|- 参数
rbb rbb 对象 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 | ||
) |
释放块队列
- 参数
rbb rbb 对象 blk_queue 块队列对象
rt_size_t rt_rbb_next_blk_queue_len | ( | rt_rbb_t | rbb | ) |
处于 put 状态并且是连续的块,可以组成块队列。 这个方法将会返回下一个可以组成块队列的总长度。
- 参数
rbb rbb 对象
- 返回
- 下一个可以组成块队列的总长度