AI agent 做固件,最难的不是写代码,是让它知道自己写对了没有。运行级证据(串口日志)能覆盖一部分,但很多物理事实——PWM 频率对不对、SPI 时序、总线上真实跑的字节——日志里看不到。逻辑分析仪就是补这一层的。

Firment 的 la 工具接的是 sigrok-cli。几个值得记的设计取舍:

1. 外部子进程,绝不链接 libsigrok

sigrok/libsigrok 是 GPL。链接进一个 MIT 程序会传染许可证。所以 la 把 sigrok-cli 当外部二进制用 argv 数组调用(和 probe-rs 同一模式),跨进程边界读 stdout,GPL 传染不到。代价是要自己处理进程生命周期,换来的是干净 + 覆盖面广(fx2lafw 克隆机、Saleae、几十种设备走同一驱动层)。

2. 频率只给区间,不给伪精确值

边沿只能定位到 ±1 个采样,所以周期带 ±2 采样的误差。报一个 1.33 Hz 是假精确。la measure 一律输出 hz_low .. hz_high 区间,且欠采样(每周期 <4 采样)时降到低置信度。

3. 读回设备真实采样率,而不是你请求的那个

fx2lafw 这类只支持离散采样率(6/12/24/48 MHz),你请求 8m 它可能跳到 12m。如果用请求值算频率会系统性偏差。所以采集后跑一次 --show 把真实采样率和通道数读回来写进元数据。

4. 通道名要按 sigrok 的现实来

sigrok-cli 按通道名匹配,主流驱动叫 D0..D7 不是 0..7。我一开始按索引写示例,真机上直接 unknown channel。这种坑只有对着 sigrok 源码或上板才发现得了。

5. 半截数据比报错更糟

采集导出成原始位流时,如果进程被超时/取消打断,可能留下一个写了一半的 .bin。测量层必须查 has_binary + 尺寸校验,宁可报错也不能拿截断波形算出一个自信的假频率。

6. 挂进证据阶梯

HIL 里 kind = "la" 步骤可以断言 expect_frequency_hz / expect_duty / expect_edges / expect_decoded,规则和其它物理观测一致:低置信度永远过不了断言,dry-run 强制 FAIL。

一句话:把「波形测出来」变成 agent 能消费、且不会说谎的证据。