跳到主要内容

IO 读写抽象

本模块定义了通用的 ReadPortWritePort 接口类,用于跨平台封装异步、阻塞、轮询等多种 I/O 行为,并通过 Operation 模型绑定完成反馈机制。适配不同底层驱动时,只需实现对应的读写函数并赋值给端口对象,即可获得完整的异步 I/O 能力。

核心类型

ReadPort / WritePort

ReadPortWritePort 封装了读写操作的调用流程、缓存管理与同步机制。每次调用都会携带一个 Operation 实例,明确指定完成后的反馈方式(回调、阻塞、轮询或忽略)。

ReadOperation / WriteOperation

typedef Operation<ErrorCode> ReadOperation;
typedef Operation<ErrorCode> WriteOperation;

用于表示带有完成响应行为的异步 I/O 操作。可通过构造函数传入回调、信号量或轮询状态变量,详见 core-operation 页面。

ReadPort 接口

初始化

ReadPort(size_t buffer_size = 128);

构造函数分配接收缓冲区,默认大小为 128 字节。

设置读取函数

ReadPort &operator=(ReadFun fun);

设置读取函数指针,通常由底层驱动调用,用户无需关心。

发起读取请求

ErrorCode operator()(RawData data, ReadOperation &op);

请求读取 data.size_ 字节的数据,根据 op 的行为等待或回调。

状态检查

size_t Size();
size_t EmptySize();
bool Readable();

用于判断缓冲区状态和是否可读。

挂起数据处理

void ProcessPendingReads(bool in_isr);

主动检查并完成之前挂起的读操作,一般在数据到达后由驱动自行调用。

重置状态

void Reset();

清空缓存与状态。

WritePort 接口

初始化

WritePort(size_t queue_size = 3, size_t buffer_size = 128);

构造函数分配写入队列和缓存,支持多条写入请求排队。

设置写入函数

WritePort &operator=(WriteFun fun);

设置写入函数指针,通常由底层驱动调用,用户无需关心。

发起写入请求

ErrorCode operator()(ConstRawData data, WriteOperation &op);

将数据加入写入队列,并根据 op 的行为等待或回调。

状态检查

size_t Size();
size_t EmptySize();
bool Writable();

判断缓存空间与是否可写。

重置状态

void Reset();

清空写入队列与状态。

STDIO 接口

LibXR 提供了一个全局 STDIO 接口,可绑定 ReadPort / WritePort 实例并使用 Printf(...) 接口输出调试信息。

LibXR::STDIO::write_ = uart_cdc.write_port_;
LibXR::STDIO::Printf("Hello, %d", 123);

用例示例

// 阻塞写入串口,超时为 100ms (默认永远等待)
WriteOperation op_block(sem, 100);
uart.Write("Hello", op_block);

// 异步读取并回调处理
ReadOperation op_cb(callback);
uart.Read(buffer, op_cb);

ReadPortWritePort 是 LibXR IO 抽象层的核心接口,提供统一的数据缓冲与完成反馈机制,适用于串口、网络、文件系统等多种数据流场景。