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 嵌入式开发
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(《LICENSE-APACHE》或http://www.apache.org/licenses/LICENSE-2.0)
由您选择。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,任何有意提交以包含在作品中的贡献,均应双许可如上所述,不附加任何额外条款或条件。
依赖项
~175KB