19个版本
0.5.1 | 2021年12月17日 |
---|---|
0.5.0 | 2021年9月13日 |
0.4.12 | 2020年12月11日 |
0.4.11 |
|
0.3.2 | 2019年1月13日 |
#110 in 嵌入式开发
每月下载量 4,482次
用于 27 个包 (16 个直接使用)
63KB
694 行
BBQueue
BBQueue,即“双缓冲队列”,是一种单生产者单消费者、无锁、no_std、线程安全的队列,基于BipBuffers。有关bbqueue使用的无锁算法的设计信息,请参阅此博客文章。
您还可以观看这个YouTube指南,了解BBQueue的90分钟引导教程。
BBQueue设计(主要是)用于作为嵌入式系统上DMA使用的第一入先出队列。
虽然循环/环形缓冲区允许您在两个线程之间发送数据(或将中断代码发送到主代码),但您必须逐块推送数据。使用BBQueue,您将获得一块连续的内存,该内存可以由DMA引擎填充(或清空)。
本地使用
// Create a buffer with six elements
let bb: BBBuffer<6> = BBBuffer::new();
let (mut prod, mut cons) = bb.try_split().unwrap();
// Request space for one byte
let mut wgr = prod.grant_exact(1).unwrap();
// Set the data
wgr[0] = 123;
assert_eq!(wgr.len(), 1);
// Make the data ready for consuming
wgr.commit(1);
// Read all available bytes
let rgr = cons.read().unwrap();
assert_eq!(rgr[0], 123);
// Release the space for later writes
rgr.release(1);
静态使用
use bbqueue::BBBuffer;
// Create a buffer with six elements
static BB: BBBuffer<6> = BBBuffer::new();
fn main() {
// Split the bbqueue into producer and consumer halves.
// These halves can be sent to different threads or to
// an interrupt handler for thread safe SPSC usage
let (mut prod, mut cons) = BB.try_split().unwrap();
// Request space for one byte
let mut wgr = prod.grant_exact(1).unwrap();
// Set the data
wgr[0] = 123;
assert_eq!(wgr.len(), 1);
// Make the data ready for consuming
wgr.commit(1);
// Read all available bytes
let rgr = cons.read().unwrap();
assert_eq!(rgr[0], 123);
// Release the space for later writes
rgr.release(1);
// The buffer cannot be split twice
assert!(BB.try_split().is_err());
}
bbqueue包位于core/
,测试位于bbqtest/
。
功能
默认情况下,BBQueue使用大多数平台都有的原子操作。然而,在某些(主要是嵌入式)平台上,原子支持有限,并且使用默认功能时,您将收到有关缺少原子方法的编译器错误。
许可证
以下任一许可证下授权
-
Apache许可证,版本2.0 (LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
-
MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您提交的任何贡献,根据Apache-2.0许可证定义,均应按上述方式双授权,不附加任何额外条款或条件。
依赖关系
~0-340KB