11个版本

0.3.3 2023年8月28日
0.3.2 2023年8月22日
0.2.1 2023年8月20日
0.1.4 2023年8月19日

#442嵌入式开发

Download history 14/week @ 2024-03-15 49/week @ 2024-03-29 13/week @ 2024-04-05

每月 77 次下载

MIT 许可证

20KB
202

fring ("快速环形缓冲区") 是一个快速、轻量级的环形缓冲区,专为嵌入式系统和其他无std目标设计。其内存占用仅为缓冲区本身加上两个 usize 索引。该缓冲区允许单个生产者和单个消费者同时操作。内存安全和线程安全在编译时得到强制执行;在运行时,缓冲区是无锁的。缓冲区长度必须是2的幂,且缓冲区操作仅使用加/减和按位与运算。与其他Rust环形缓冲区(如 bbqueue)相比,fring 的灵活性较低,但提供了更低的存储和计算开销。


lib.rs:

适用于无std目标的快速环形缓冲区。

fring ("快速环形缓冲区") 是一个快速且轻量级的环形缓冲区,专为嵌入式系统和其他无std目标设计。("环形缓冲区"意味着它是一个FIFO队列,以数组形式存储,数据在到达数组末尾时会回绕到数组的开始。) fring::Buffer 的内存占用仅为缓冲区本身加上两个 usize 索引。

缓冲区允许单个生产者和单个消费者同时操作。内存安全和线程安全在编译时得到强制执行;在运行时,缓冲区是无锁的。缓冲区长度必须是2的幂,且缓冲区操作仅使用加/减和按位与运算。

使用 Buffer 的唯一方法是将其拆分为 ProducerConsumer。然后可以调用 Producer.write()Consumer.read(),或者由 ProducerConsumer 提供的其它各种方法。

安全线程使用示例

fn main() {
    let mut buffer = fring::Buffer::<N>::new();
    let (producer, consumer) = buffer.split();
    std::thread::scope(|s| {
        s.spawn(|| {
            make_data(producer);
        });
        use_data(consumer);
    });
}

静态使用示例(需要 unsafe

static BUFFER: fring::Buffer<N> = fring::Buffer::new();

fn interrupt_handler() {
    // UNSAFE: this is safe because this is the only place we ever
    // call BUFFER.producer(), and interrupt_handler() is not reentrant
    let producer = unsafe { BUFFER.producer() };
    write_data(producer);
}

fn main() {
    // UNSAFE: this is safe because this is the only place we ever
    // call BUFFER.consumer(), and main() is not reentrant
    let consumer = unsafe { BUFFER.consumer() };
    use_data(consumer);
}

无运行时依赖