v4.0.0 · Apache-2.0 · 内核仅 Python 标准库

ELAB

ELAB·FLOW · 给 agent 用的嵌入式开发工具链

把嵌入式开发流程,托管给你的 agent 与 DSH。 体检 → 编译 → 烧录 → 调试校验 → 串口判据,五段合成一条 elab loop。 退出码说话、证据落盘;业务代码留在原地,换芯片只改一行 chip:。

Python ≥ 3.10 · 零第三方依赖 前端产物已入仓 · 运行时不需要 Node Windows / Linux
127.0.0.1:8333 · elab cockpit 串口后端就绪
elab cockpit 实机:ESP32-S31-Korvo 五阶段全绿 + 串口心跳
烧录校验 Verified OK
boot + app 双镜像
串口闭环 ok · 1.68s
[alive] tick=11 toggles=22
RAM 16.29% · FLASH 9.39%
实机跑通
STM32F103C8T6 STM32F411CEU6 · OTA 双槽 AT32F421G8U7 ESP32-S31-Korvo
为什么需要它

让 agent 接管你的嵌入式开发

模型能写驱动、能读手册,却卡在最后一步——编译要开 IDE、烧录点鼠标、验证盯串口,它插不进手。
ELAB-Flow 把五段流程托管给 agent:业务代码留在原工程,每一步都有工具调用。

pain · 01

工具关在 GUI 里

建工程靠 CubeMX 点出来,编译烧录靠 IDE 按钮,工具版本靠 PATH 运气 —— 没有稳定入口,agent 第一步就卡死。

pain · 02

结论靠肉眼

烧完盯着串口日志,「好像跑起来了」就算过;没有判据、没有退出码,agent 判断不了这一步成没成,也进不了 CI。

elab · 做法

流程即工具

每个阶段都是一条带退出码、带证据行的命令。agent 一次 tool call 跑完,读同一份事件流再决定下一步 —— 不需要有人守在屏幕前。

五个阶段 = 五个 agent 工具 外骨骼式接入 · 业务代码零改动
  1. 01体检elab doctor
  2. 02编译elab build
  3. 03烧录elab flash
  4. 04调试校验elab debug
  5. 05串口判据elab monitor
elab loop 顺序跑完五段,任一段失败即停并把证据回传给 agent;面板、CLI、agent 读的是同一份事件流。
产品功能

四个入口,同一条证据链

从「给目录」到「拿到结论」,每一步都留下可 grep 的证据行;面板、CLI、agent 看到的是同一份事件流。

01 / 闭环编排

一条命令跑完五个阶段,
每一步都留下可 grep 的证据

体检 → 编译 → 烧录 → 调试校验 → 串口闭环。串口判据给出三态结论,能开但没收到约定关键字就报 inconclusive —— 不会把「没验证」冒充成成功。

  • 单步可跑:elab run --steps build,不必每次全量
  • 退出码即结论:0 ok / 1 failed / 2 inconclusive,CI 直接用
  • 构建产物、内存占位、守卫快照同屏落账
五阶段全绿:RAM 16.29% · FLASH 9.39%,产物与零改动守卫同屏 STM32F411CEU6 · 真机
// A-07 · 五阶段全绿,产物 4 个 / 守卫 untouched
02 / 调试工作区

从一次真实 HardFault
一路收网到源码行

会话式调试器:开始 / 继续 / 暂停 / 单步 / 步入 / 步出 / 复位 / 关闭,十一个页签从调用栈一直看到 RTOS 栈水位。断点与监视持久化到项目文件,带 rev 乐观锁。

  • 调用栈直接指出 #2 0x54535250 非法地址 → heartbeat_pack_buggy
  • CMSIS-SVD 外设字段解码,读写都可留审计
  • 关闭会话固定 monitor reset run,不会把板子留在 halt
调试工作区:HardFault 调用栈与阶段轨同屏 HardFault · 实机
// 调用栈 #0 HardFault_Handler → #3 heartbeat_pack_buggy
03 / 串口与波形

字节为真值,
文本只是投影

每个字节批次都带 seq / dir / t / len / gap,方向过滤、搜索、换表示全在客户端做,切视图不丢游标。四个视图:行 / 字节 / 终端 / 波形。

  • 帧解码 18,253 帧/秒,64B 批 p95 0.6ms(8× 余量)
  • 多面板独立缩放、游标联动、冻结与导出
  • 解码器是会话属性:面板与 agent 读同一份帧环
波形页:FireWater 协议双通道正弦,多面板独立缩放 FireWater · 双通道
// 4593 帧 · 2 通道 · 跳过 57 —— 同一份帧环的投影
04 / Agent 原生

不认识的协议,
抓一段字节就会解

给 agent 一段没人告诉过它的抓包,它自己推出帧头、帧长、校验、消息 ID 与字段切分。学习只产草稿、不写文件:证据链与置信度一起返回,人复核后才落盘。

  • 置信度 0.99,回放 168/168;解 → 重编 → 比对 177/177 全等
  • codegen 产出 generated/*.h,-Wall -Werror 干净编译
  • 15 个 elab_* 混合门面工具,写硬件受 allowAgentWrite 门控
帧协议自学习草稿:置信度 99% 与证据链 私有协议 · 自学
// learn 只产草稿:帧头 / 长度 / 校验 / id 全部带证据

自动接入工程

给一个目录就探测芯片、框架、构建入口与置信度;只读在前,落盘在后,人工接管过的文件绝不覆盖。

自动适配写入报告

Modbus RTU 主站

点表驱动,31 个点 / 5 组合并成 8 条读;写保护缺 confirm 直接拒,越界被从站异常码 02 挡回。

Modbus 主站面板

DSH 右栏面板

agent 在跑,你在旁边看:阶梯进度、日志尾、四通道与串口页挤在窄栏里,插件首启自动补齐工具链。

DSH 右栏面板三连全绿

适配包与社区市场

骨架仓零芯片,厂商支持全在数据层;elab pkg index 重生成索引,CI 用 --check 拦漂移。

市场搜索安装芯片包
怎么接进来

工程接入只写差异

芯片参数在适配包,主机路径在 elab.host.yaml,命令模板在 provider —— 工程 YAML 只声明「我是谁、怎么接」。下面这份是 elab adapt 真实生成的文件节选。

实测数据

不靠感觉,看数字

下面每个数字都来自仓库里的真机记录与基准脚本,跑一次就能复现。

0阶段
体检 → 编译 → 烧录 → 调试校验 → 串口
0个工具
elab_* 混合门面,写操作受门控
0页签
调试工作区,从调用栈到 RTOS 栈
0视图
行 / 字节 / 终端 / 波形 共用游标
0帧/秒
单批 64B 解码 p95 0.606 ms
0/ 177
解 → 重编 → 线上字节逐字全等

真机实测

一个内核 · 三种入口

同一份事件流,区别只在谁在看

CLI · 脚本与 CI

终端分色输出,退出码即结论。适合脚本、CI、无人值守与 agent 直接调用。

./elab loop -p f411 -v

独立驾驶舱 · 桌面前盯全程

工程轨 / 阶段轨 / 证据轨三列全屏,双击即起,幂等不重复起服务。

cockpit.cmd → 127.0.0.1:8333

DSH 右栏 · agent 在跑你在看

窄栏阶梯 + 日志尾 + 串口页;插件首次打开自动下载内核并补齐工具链。

dsh plugin add …#path:/packages/dsh-elab-cockpit
快速开始

六步,从克隆到实机全绿

需要 Python ≥ 3.10(无第三方依赖);上板另需 CMake + Ninja + ARM GCC + OpenOCD。没有探针时 doctor / build / ci 照样能跑。

01

克隆仓库

$ git clone git@github.com:xkk6663/elab-flow.git
02

装内置芯片包

$ ./elab pkg bootstrap
03

体检环境

$ ./elab setup && ./elab doctor
04

接入自己的工程

先不加 --write 看只读报告,确认后再落盘。

$ ./elab adapt ../my-project --write
05

跑闭环

$ ./elab loop -p my-project -v
06

打开驾驶舱

$ python -m cockpit.server
● elab · bash — 132×34
$ ./elab setup
[elab] 环境自检 · pack st/stm32@0.1.0 · kernel_api >=1 <2
  ✓ 芯片包      st/stm32 (stm32f103xb / stm32f411ceux)
  ✓ 工具链      arm-none-eabi-gcc 13.3.1 · cmake 3.28.1 · ninja 1.11.1
  ✓ 调试器      openocd 0.12.0-3 (probe: atlink)
  ✓ 串口        COM10 @115200 (auto)

$ ./elab loop -p stm32f411ceu6 -v
[1/5] 体检        ✓ 0.14s   工具链 / 探针 / 串口
[2/5] 编译        ✓ 7.46s   RAM 16.29% · FLASH 9.39% · 守卫 untouched
[3/5] 烧录        ✓ ** Programming Started **
[4/5] 调试校验    ✓ 6.03s   Breakpoint 1 at Core/Src/main.c:84
[5/5] 串口闭环    ✓ 1.68s   命中 regex:^\[(boot|alive)\] within_s=10

结论 ok · 7.46s · exit 0      # 1=failed  2=inconclusive

喜欢这个项目?点一下 Star

芯片适配包、协议模板与实机验收报告都在开源仓库里。你的一次 star,是下一颗芯片适配的动力。