#thread-safe #queue #lockless #spsc #atomic #operations

no-std bbqueue-ng

基于BipBuffers的SPSC、无锁、no_std、线程安全的队列

5个不稳定版本

0.101.1 2021年1月2日
0.101.0 2021年1月2日
0.100.1 2020年12月28日
0.100.0 2020年12月28日
0.4.11 2020年11月26日

#912 in 嵌入式开发

MIT/Apache

63KB
689

BBQueue(-ng)

实验性通知

注意:这是bbqueue的实验性下一代版本。这个版本通常不遵循semver,并且可能有错误的文档。如果您需要更稳定的版本,请使用bbqueue的常规版本!

可能过时的文档

BBQueue,全称“双缓冲队列”,是一种单生产者单消费者、无锁、no_std、线程安全的队列,基于双缓冲。有关bbqueue使用的无锁算法的更多信息,请参阅这篇博客文章

您还可以在YouTube上观看这个90分钟的BBQueue指南:指南

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_ng::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使用大多数平台都有的原子操作。然而,在某些平台(主要是嵌入式平台)上,原子支持有限,并且使用默认特性时,您将收到有关缺少原子方法的编译器错误。

此crate包含对具有thumbv6特性的Cortex-M0(+)目标的特殊支持。通过启用该功能,不支持的原子操作将被通过禁用中断实现的临界区替换。临界区非常短,最多只有几条指令,因此它们对大多数应用程序应该没有影响。

许可证

许可协议为以下之一

由您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,任何有意提交以包含在作品中的贡献,均应双许可如上所述,不附加任何额外条款或条件。

依赖项

~175KB