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 在 嵌入式开发
每月 77 次下载
20KB
202 行
fring
("快速环形缓冲区") 是一个快速、轻量级的环形缓冲区,专为嵌入式系统和其他无std目标设计。其内存占用仅为缓冲区本身加上两个 usize
索引。该缓冲区允许单个生产者和单个消费者同时操作。内存安全和线程安全在编译时得到强制执行;在运行时,缓冲区是无锁的。缓冲区长度必须是2的幂,且缓冲区操作仅使用加/减和按位与运算。与其他Rust环形缓冲区(如 bbqueue)相比,fring
的灵活性较低,但提供了更低的存储和计算开销。
lib.rs
:
适用于无std目标的快速环形缓冲区。
fring
("快速环形缓冲区") 是一个快速且轻量级的环形缓冲区,专为嵌入式系统和其他无std目标设计。("环形缓冲区"意味着它是一个FIFO队列,以数组形式存储,数据在到达数组末尾时会回绕到数组的开始。) fring::Buffer
的内存占用仅为缓冲区本身加上两个 usize
索引。
缓冲区允许单个生产者和单个消费者同时操作。内存安全和线程安全在编译时得到强制执行;在运行时,缓冲区是无锁的。缓冲区长度必须是2的幂,且缓冲区操作仅使用加/减和按位与运算。
使用 Buffer
的唯一方法是将其拆分为 Producer
和 Consumer
。然后可以调用 Producer.write()
和 Consumer.read()
,或者由 Producer
和 Consumer
提供的其它各种方法。
安全线程使用示例
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);
}