TinyOrch 设计说明¶
设计动机¶
嵌入式 SHM 节点的典型处理流程是一系列有序操作:
传统做法是把这些操作硬编码在 app_main() 里。TinyOrch 将这个过程数据化——流程定义本身是数据(步骤序列),可以被外部 Agent 或用户通过 MQTT 远程创建、修改和执行。
核心设计决策¶
编译时类型校验 vs 运行时¶
TinyOrch 在 tiny_orch_step() 定义时做校验:
tiny_orch_step(flow, 0, "raw_0", "butterworth", "filtered")
↓
1. bench_get("raw_0") → 类型 TINY_TYPE_F32_ARR
2. bench_get_tool_fn("butterworth") → in_type = TINY_TYPE_F32_ARR
3. TINY_TYPE_F32_ARR == TINY_TYPE_F32_ARR → ✅
4. 保存步骤定义
错误在定义阶段暴露,不在执行时崩溃。
执行引擎¶
tiny_orch_go() 按序遍历步骤:
for each step in flow.steps:
1. bench_get(step.src) → 取数据指针
2. bench_get_tool_fn(step.tool) → 取函数指针
3. fn(in_ptr, out_ptr) → 执行工具
4. bench_put(step.dst, ...) → 放回工作台
- 串行执行,每步完成才下一步
- 某步失败立即终止流程,状态置为
ERROR - 不拷贝数据,全程零拷贝
流程 vs 临时单步¶
go(flow) | run(src, tool, dst) | |
|---|---|---|
| 定义 | 需先 create + step | 无需定义 |
| 类型校验 | 定义时 | 每次调用时 |
| 适用 | 反复执行的固定流程 | 一次性调试或Agent临时操作 |
状态机简单可靠¶
流程只有 4 个状态,不存在中间态:
不引入 RUNNING 中断态(MVP 不做异步执行)。
MQTT 远程编排模式¶
Agent 的典型交互:
1. BENCH,TOOLS → 发现有什么工具
2. BENCH,DATA → 发现有什么数据
3. ORCH,CREATE,flow → 创建流程
4. ORCH,STEP,... ×N → 定义步骤
5. ORCH,GO,flow → 执行
6. ORCH,STATUS,flow → 检查状态
7. BENCH,DATA → 查看结果
这种模式下,Agent 不需要知道 C API,只发 MQTT 命令即可控制整个处理流程。
设计约束¶
- 线性串行:MVP 不做分支/并行/循环。步骤严格按 index 顺序执行
- 同步阻塞:
go()返回时所有步骤已完成或出错 - 无堆分配:流程表和步骤表在
tiny_orch_init()时静态分配 - 步骤可稀疏:step index 不必连续,未用的 index 自动跳过