Pipe 单向管道
Pipe
将一个 WritePort
与一个 ReadPort
通过同一条无锁字节队列连接成单向数据通道:写端写入的字节可被读端直接读取,无需端口间的中间拷贝(仅有一次写入到共享队列的拷贝)。该类适用于在线程/任务/ISR 与任务之间进行高效的数据转发与环回测试。
特性概览
- 零额外拷贝:写端写入 → 直接进入共享队列 → 读端从同一队列取出。
- ISR 友好:可配置
in_isr
标志,使推进读端的过程遵循中断上下文限制。 - 语义与
ReadPort
/WritePort
一致:阻塞/回调/轮询等完成方式统一由Operation
控制。
公共接口
class Pipe {
public:
// 使用给定共享数据队列容量(字节)构造;in_isr = true 表示回调可能在中断上下文执行
Pipe(size_t buffer_size, bool in_isr = false);
// 非拷贝/非赋值
Pipe(const Pipe&) = delete;
Pipe& operator=(const Pipe&) = delete;
~Pipe() = default;
// 端口访问
ReadPort& GetReadPort();
WritePort& GetWritePort();
};
buffer_size
:共享队列总容量(字节),用于承载写入的数据。创建后不可更改。in_isr
:指 示WriteFun
推进读端时是否按 ISR 语义处理(例如避免阻塞/仅做必要推进)。
Pipe
不直接暴露 Size/Reset 等方法——请通过GetReadPort()
/GetWritePort()
使用对应端口接口。