跳转至

TinyOrch 设计说明

设计动机

嵌入式 SHM 节点的典型处理流程是一系列有序操作:

采集 → 滤波 → FFT → 系统识别 → 损伤检测 → 输出结果

传统做法是把这些操作硬编码在 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 个状态,不存在中间态:

DEFINED → (go 执行中) → DONE
                       → ERROR

不引入 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 自动跳过