#thread-safe #single-consumer #queue #lock-free-queue #producer-consumer #memory #spsc

no-std bbqueue

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

19个版本

0.5.1 2021年12月17日
0.5.0 2021年9月13日
0.4.12 2020年12月11日
0.4.11 2020年11月26日
0.3.2 2019年1月13日

#110 in 嵌入式开发

Download history 815/week @ 2024-03-13 945/week @ 2024-03-20 802/week @ 2024-03-27 826/week @ 2024-04-03 1289/week @ 2024-04-10 1292/week @ 2024-04-17 1056/week @ 2024-04-24 1037/week @ 2024-05-01 1206/week @ 2024-05-08 834/week @ 2024-05-15 1295/week @ 2024-05-22 1209/week @ 2024-05-29 1242/week @ 2024-06-05 1082/week @ 2024-06-12 1193/week @ 2024-06-19 733/week @ 2024-06-26

每月下载量 4,482次
用于 27 个包 (16 个直接使用)

MIT/Apache

63KB
694

BBQueue

Documentation

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许可证定义,均应按上述方式双授权,不附加任何额外条款或条件。

依赖关系

~0-340KB