RT-Thread API参考手册  3.1.1
嵌入式实时操作系统
环形块状缓冲区

环形块状缓冲区接口 更多...

结构体

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 传输,通信帧的接收与发送等等

枚举类型说明

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 中

参数
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 --->|
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 -------------------->|
参数
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 对象
返回
下一个可以组成块队列的总长度