@@ -6,7 +6,9 @@ sidebar_position: 9
66
77# Operation 操作模型
88
9- 本模块定义了通用的 ` Operation<Args...> ` 模板类,用于描述具有完成反馈机制的异步操作。支持回调(Callback)、阻塞(Block)、轮询(Polling)三种模式,适用于嵌入式 I/O 操作中的统一完成处理。
9+ 本模块定义通用的 ` Operation<T> ` 模板类,用于描述具有完成反馈机制的异步操作。支持回调(Callback)、阻塞(Block)、轮询(Polling)三种模式,适用于嵌入式 I/O 操作中的统一完成处理。
10+
11+ 其中 ` ReadOperation ` / ` WriteOperation ` 是对 ` Operation<ErrorCode> ` 的别名,用于 I/O 完成时回传 ` ErrorCode ` 。
1012
1113## 操作模式
1214
@@ -16,7 +18,7 @@ sidebar_position: 9
1618enum class OperationType : uint8_t {
1719 CALLBACK, // 使用回调函数处理完成事件
1820 BLOCK, // 使用信号量阻塞等待
19- POLLING, // 轮询标志位
21+ POLLING, // 轮询状态变量
2022 NONE // 不处理完成
2123};
2224```
@@ -27,7 +29,8 @@ enum class OperationType : uint8_t {
2729enum class OperationPollingStatus : uint8_t {
2830 READY,
2931 RUNNING,
30- DONE
32+ DONE,
33+ ERROR
3134};
3235```
3336
@@ -40,23 +43,32 @@ Operation();
4043// 构造阻塞操作
4144Operation (Semaphore &sem, uint32_t timeout = UINT32_MAX);
4245
43- // 构造回调操作
44- Operation(Callback<Args... > &cb);
46+ // 构造回调操作(T 为回调参数类型)
47+ Operation(Callback<T > &cb);
4548
4649// 构造轮询操作
4750Operation(OperationPollingStatus &status);
4851```
4952
53+ 另外,`Operation` 支持从另一个 `Operation` 实例初始化(复制/移动语义等价于赋值)。
54+
5055## 状态更新
5156
5257```cpp
53- void UpdateStatus(bool in_isr, Args&&... args);
58+ template <typename Status>
59+ void UpdateStatus(bool in_isr, Status&& status);
60+
5461void MarkAsRunning();
5562```
5663
57- - ` UpdateStatus(...) ` 会根据操作类型触发回调、释放信号量或设置轮询状态。
58- - ` MarkAsRunning() ` 在 POLLING 模式下设置状态为 RUNNING。
59- - 这两个函数通常由驱动主动调用,用户无需关心。
64+ - ` UpdateStatus(...) ` 会根据操作类型触发回调、解除阻塞或更新轮询状态:
65+ - CALLBACK:调用 ` cb.Run(in_isr, status) ` ,其中 ` status ` 作为 ` T ` 类型的完成状态传递给回调。
66+ - BLOCK:调用信号量的 ` PostFromCallback(in_isr) ` 解除阻塞等待(完成状态本身不参与阻塞唤醒语义)。
67+ - POLLING:更新轮询状态变量 ` OperationPollingStatus ` :当 ` status ` 表示成功时置为 ` DONE ` ,否则置为 ` ERROR ` 。该规则对任意 ` T ` 一致;约定以 “0” 表示成功(例如 ` ErrorCode::OK == 0 ` 或其它状态类型的 0 值)。
68+ - ` MarkAsRunning() ` 在 POLLING 模式下设置状态为 ` RUNNING ` 。
69+ - 当 ` in_isr == true ` 且操作类型为 ` BLOCK ` 会主动断言失败。
70+ - 这两个函数通常由驱动/端口在合适的时机调用;用户侧只需选择合适的 ` OperationType ` 并传入即可。
71+
6072
6173## 示例用法
6274
@@ -68,7 +80,7 @@ WriteOperation op_block(sem, 100);
6880write_port(data, op_block);
6981```
7082
71- ### 回调方式读取数据
83+ ### 回调方式读取完成反馈
7284
7385```cpp
7486auto cb = Callback<ErrorCode>::Create([](bool in_isr, int context, ErrorCode ec) {
@@ -88,10 +100,12 @@ read_port(buffer, op_poll);
88100
89101// 后续通过 status 查询是否完成
90102if (status == LibXR::ReadOperation::OperationPollingStatus::DONE) {
91- // 数据已读取完成
103+ // 成功完成
104+ } else if (status == LibXR::ReadOperation::OperationPollingStatus::ERROR) {
105+ // 完成但发生错误
92106}
93107```
94108
95109---
96110
97- `Operation` 是 LibXR I/O 操作的基础机制,适用于串口、网络、定时器等模块,统一管理完成行为,确保线程、中断上下文均安全 。
111+ `Operation` 是 LibXR I/O 操作的基础机制,适用于串口、网络、定时器等模块,统一管理完成行为,确保线程与中断上下文均安全 。
0 commit comments