开场:同一个 OTA 需求,两种交付结果
“给采集终端加一个 OTA 功能。”这句话看起来只有下载固件、写入 Flash、重启三个动作。到了现场,采样任务还在运行,通信会中断,设备随时可能掉电,旧版本配置也必须保留。AI 很快能写出一条成功路径,但这些约束需要团队主动说清楚。
版本 A:直接生成升级代码
Agent 写好下载回调和烧录函数,开发板成功启动新版本,于是任务被标成“完成”。接下来的检查才发现:
- 进度先落盘、数据后写入,掉电后续传位置失真;
- 只检查 CRC,镜像来源与目标板型没有校验;
- Flash 擦写阻塞,采样任务错过截止时间;
- 新固件刚进入主函数就确认,故障回退失去机会;
- 配置已迁移,旧固件恢复后却读不懂。
编译通过、单次升级成功,只覆盖了这次演示发生的条件。
版本 B:先定义可交付的设备行为
- 确认下载、安装和重启各自允许的采样中断。
- 核验分区、启动方案和芯片擦写限制。
- 按正常升级、异常拒绝、故障恢复等行为拆任务。
- 每次修改都保留对应的构建与运行证据。
- 在目标板注入断电、超时和错误镜像。
- 带着发布包、恢复条件和交接记录分批发布。
每一步都明确:依据哪条规则,观察什么结果,什么情况必须退回修正。

嵌入式研发中的“完成”,需要把代码、硬件条件和现场恢复放在一起判断。
六阶段工作流的作用,是及时暴露不同类型的不确定性。AI 可以加快代码阅读、方案整理、测试构造与日志分析,工程团队则要让它的每个结论都有输入、有边界、有证据。
贯穿全文的案例:工业采集终端远程固件升级
设想一台使用 Cortex-M MCU 与 RTOS 的工业采集终端。它周期采集传感器数据,通过网关上报,现场人员依靠远程诊断维护设备。本次变更增加固件下载、受控安装、试启动确认和失败恢复。
已有业务仍要运行:采样任务负责时序,通信任务负责上报,配置区保存设备地址与校准参数。升级功能必须与这些路径共同工作,并适配实际板型及现有 Bootloader。
案例为教学设定,以上均为示例目标,不代表特定芯片的性能或已完成的测试。实际项目先核验 Flash 容量、擦写与读写限制、启动实现和现场条件,再决定可承诺的指标。
改动会穿过哪些模块

最危险的问题可能没有编译错误
一个持久化标志写错顺序,只在特定掉电点暴露。任务优先级与擦写方式不合适,可能只在通信和采样叠加负载时失效。配置迁移能够通过新版本测试,旧版本回退后却无法读取。这些问题需要跨越模块边界和实际运行条件来观察。
快速原型的适用边界
让 AI 快速搭起一个协议解析器、日志解码脚本或状态机原型,很适合探索问题。团队可以在开发板上缩短反馈周期,同时把原型结论与产品承诺分开记录。
| 场景 | 适合快速探索的部分 | 进入产品前需补齐的证据 |
|---|---|---|
| 工具与纯逻辑 | 日志处理、配置格式转换、状态迁移原型 | 输入边界、错误路径、接口约定 |
| 驱动与任务 | 参考现有 BSP 搭起最小通信或采样链路 | 引脚与时钟配置、并发、时序、资源占用 |
| 启动与持久化 | 用模拟存储验证升级流程 | 真实擦写、断电恢复、镜像验证与配置兼容 |
当修改涉及 Flash、启动链、看门狗或共享外设时,应当先写清楚失败行为和恢复入口。主机上能够运行的模型,为设计提供快速反馈;设备的物理约束仍由目标硬件验证。
先统一术语,再讨论工作流
| 术语 | 在本案例中的含义 |
|---|---|
| Skill / Artifact / Gate | AI 的行动规则 / 可复用的工程产物 / 进入下一步的放行条件。 |
| Spec / ADR | Spec 记录需求与验收约定;ADR 记录启动模式、分区等关键设计选择及原因。 |
| BSP / HAL / RTOS | 板级支持、硬件抽象与任务调度相关层。具体职责以项目现有结构为准。 |
| Bootloader / OTA | 启动引导程序 / 远程固件升级。下载完成、安装完成和健康确认是不同状态。 |
| 试启动 / 确认 / 回退 | 新镜像先运行健康检查,通过后确认;未确认且发生复位时,按已验证的启动方案恢复。 |
| HIL / 测试入口 | 硬件在环验证 / 观察行为的位置,例如状态日志、复位原因和 GPIO 时间戳。 |
| CRC / 哈希 / 签名 | CRC 用于差错检测;哈希用于内容摘要;签名在受信公钥与完整验证流程下校验镜像来源和完整性。 |
后文保留原文的六个 Skill 名称:grilling、to-spec、to-tickets、implement、code-review 和 handoff。配套指令均为本文针对嵌入式场景改写的示例,可按团队约束调整。名称与当前实现请查阅 Matt Pocock Skills 官方仓库。
把六阶段看成一张风险地图
每个阶段回答一个不同的问题,留下下一步能继续使用的材料。发现分区方案无法满足采样要求,就回到 Design;掉电用例暴露遗漏的需求,就回到 Brainstorm 补齐规则。
| 阶段 | 本案例要控制的风险 | 主要产物 | 放行条件 |
|---|---|---|---|
| 01 · Brainstorm | 升级边界与停机约定不清 | 需求规则、决策记录 | 关键取舍有负责人确认 |
| 02 · Design | 分区、状态与恢复责任不清 | 分区表、状态表、接口与测试入口 | 硬件约束和恢复路径可行 |
| 03 · Plan | 任务过大,无法独立验收 | 切片任务、依赖关系 | 每项任务都有完成证据 |
| 04 · Execute | 大批修改后才发现问题 | 小步修改、当次运行记录 | 当前切片取得有效证据 |
| 05 · Verify | 测试入口遗漏真实设备风险 | 真机报告、规范与需求审查 | 阻塞问题关闭或退回修复 |
| 06 · Ship | 发布后无法恢复或接手 | 发布包、恢复方案、交接 | 责任人与接续路径明确 |
Skill 规定怎样做,例如先查芯片手册再提出擦写方案。Artifact 保存已确认的事实,例如分区、状态表与真机日志。Gate 规定何时继续,例如掉电恢复用例未通过,本批次升级不得扩大。

第一站:把“加个 OTA”变成可检查的规则
核心问题:下载、安装和故障分别允许设备怎样表现?
收到“远程升级”后,Agent 可能默认:Flash 足够放两份镜像;擦写不会阻塞采样;任何复位都会回到旧版本;新旧固件共用一套配置;通信恢复后续传一定安全。这些假设必须从代码、芯片资料和产品约定中逐一核验。
事实先查,关键取舍明确到人
AI 应先阅读链接脚本、当前固件的 map 文件、BSP 与启动配置,查明镜像大小、存储布局、看门狗和配置写入路径。需要核对器件手册的内容,应记录型号与文档版本。
下载期间允许增加多少抖动、重启能否暂停采样、断网是否影响健康确认、现场失败由谁恢复,这些需要产品、固件和测试负责人共同确认。已经确认的决定进入记录,未知项保持显式状态。
为后续设计、任务和证据统一编号。同一条 R 编号会在任务单、测试矩阵和发布报告中反复出现。
| 编号 | 验收规则 | 怎样观察结果 |
|---|---|---|
| R1 | 只运行签名有效且匹配目标硬件、满足版本策略的镜像。 | 篡改镜像、错误签名或错误板型的包不得进入试启动。 |
| R2 | 在约定的下载与切换掉电场景下,仍有受信固件可恢复启动。 | 复位后核对启动版本、镜像状态与进度记录;覆盖关键持久化写入点。 |
| R3 | 下载期间继续按 10 ms 周期采样,新增调度抖动 ≤ 1 ms。 | 以约定基线、负载与测量窗口比较采样触发时间,并检查漏采与截止时间。 |
| R4 | 新固件完成健康检查后才能确认,确认窗口为 30 s。 | 超时未确认则触发复位;卡死时由独立监督机制复位,再验证启动层回退。 |
| R5 | 升级及允许的回退均保留有效配置与校准参数。 | 比对配置版本、校准值、迁移中断与回退后的读值。 |
R3 与维护窗口必须一起写。本案例要求下载期间保留采样;安装和重启允许在维护窗口暂停采样。如果硬件擦写限制使下载目标不可达,需要调整存储方案或重新约定行为,并将决定回写需求。
最小 Skill:grilling 的嵌入式用法
沿着决策依赖澄清:先确定设备和存储事实,再讨论采样与停机,最后确定健康条件和现场恢复。每个问题带上已有证据与建议,避免把代码检索工作转交给负责人。

先检查目标板、链接脚本、Bootloader、现有固件大小与配置路径。
区分:已证实的事实 / 待验证的假设 / 需要负责人的取舍。
按依赖顺序澄清下载时序、维护窗口、健康确认与恢复责任。
对每个尚未决定的关键取舍给出建议和依据,再等待对应负责人确认。
把结论写成带编号的可观察规则,保留未知项和范围外事项。
已有决策直接复用;关键取舍未解决的部分,不进入依赖它的实现。
本阶段产物需求 R1–R5、适用板型、维护窗口、健康条件、恢复责任人与待验证假设。
放行条件关键取舍已确认;每条规则都有可观察结果;未知硬件能力有验证安排。
第二站:把需求落实到分区、状态和责任
核心问题:谁决定启动,谁确认健康,掉电后从哪里恢复?
下载任务把 upgrade_ready 写成真,应用随后重启。启动层却不知道标志是否完整写入、候选区是否已经验证、旧镜像还在不在。下载成功和可以启动之间,缺了一份共同遵守的状态契约。
先核验平台,再决定升级模式
核对可用 Flash、擦写粒度、地址对齐、执行与读写限制,以及候选镜像的最大容量。分区预算必须覆盖镜像头、签名或校验元数据、状态尾部和实际算法需要的临时空间。检查链接脚本与打包工具是否使用同一份布局。
本案例选择已经验证支持试启动与失败回退的启动方案作为前提。双镜像存储本身不能证明具备回退能力,单纯覆盖原镜像的策略也不能凭空保留旧镜像。以 MCUboot 为参考时,应按实际模式核对试启动、确认和复位后的行为。见 MCUboot 启动与试启动设计。
| 模块 | 负责的行为 | 主要观察入口 |
|---|---|---|
| 传输与下载 | 分块接收、边界检查、重试、候选区写入与可校验的进度恢复 | 块序号、写入日志、候选镜像摘要 |
| OTA 状态机 | 协调下载状态、维护窗口与受控试启动请求 | 状态事件、错误码、复位原因 |
| Bootloader | 执行启动前验证与版本策略,处理切换、确认状态和故障恢复 | 启动日志、运行版本、镜像状态 |
| 采样与健康检查 | 监测采样时序、关键任务进展与存储状态,满足条件才确认 | GPIO 时间戳、错误计数、确认记录 |
| 配置存储 | 版本化读写、迁移恢复,保留允许回退版本能读取的有效配置 | 配置版本、校准值、迁移日志 |
板型判断需要自己的可信约定:把硬件标识纳入受签名保护的元数据,明确由哪一层强制核验。选择了某个 Bootloader,并不自动获得项目特有的板型、网关或配置兼容策略。
状态表必须写出复位后的行为
- 01 下载中写候选区
- 02 候选已验证等待维护窗口
- 03 待试启动受控切换
- 04 试运行健康检查
- 05 已确认正常运行
| 状态 | 允许的动作 | 复位或失败后的预期 |
|---|---|---|
| 下载中 | 写候选区,持久化可验证的进度;当前受信固件保持可用 | 启动原固件;重验已写区域后续传,无法确认时重新下载。 |
| 候选已验证 | 核对完整镜像、签名、板型与版本策略,等待维护窗口 | 保留当前固件;从持久化状态恢复并重新检查安装前提。 |
| 待试启动 | 记录受控安装请求,由启动层执行选定的切换流程 | 按启动层的持久化协议完成恢复;不得由应用猜测交换进度。 |
| 试运行 | 在约定窗口内检查健康,保留旧镜像与兼容配置 | 未确认且再次复位时,按已验证的恢复方案启动旧版本。 |
| 已确认 | 正常运行,并按兼容策略提交配置状态 | 后续问题通过受控修复版本处理;回退前重新检查安全策略和配置。 |
持久化顺序需要写清“写数据、验证数据、提交进度”的完成点,并考虑提交记录本身被掉电打断的情形。根据存储介质选择校验、版本号或冗余记录,启动时只相信可验证的状态。
健康检查也要有具体定义:关键采样任务是否持续推进,必需外设是否可用,配置是否能读写,必须的通信功能是否正常。是否要求远端在线属于产品决策,不能让一次普通断网无意中触发持续回退。
签名验证检查镜像是否可信;防恶意降级限制允许的版本;故障回退恢复未确认的试运行。需要同时设计三者,尤其要核对安全计数器的提交时机与旧版本是否仍被允许。参考 MCUboot 防降级说明。
最小 Skill:to-spec 的嵌入式用法

1. 目标与范围:R1–R5、板型、现有固件和明确不做的事项
2. 平台约束:Flash 布局、链接地址、擦写限制、RAM 与镜像预算
3. 模块与接口:责任、参数、错误码、任务/中断上下文
4. 状态与恢复:触发条件、持久化点、复位后的允许状态
5. 兼容策略:Bootloader、板型、配置版本与允许回退的组合
6. 测试入口:主机状态测试、构建检查、目标板与 HIL
7. 关键决策:方案依据、验证证据、未知项与负责人
从已经确认的需求综合设计,把尚未解决的选择列为待决项。为每条 R 规则标出负责模块和观察入口,后面的任务才能引用同一份契约。
本阶段产物分区表、接口契约、升级状态表、兼容矩阵、测试入口与关键 ADR。
放行条件平台约束有依据;恢复方案完成必要的最小验证;每条验收规则都能落到具体模块。
第三站:按设备行为拆成可验证的切片
核心问题:每个任务完成后,能在什么条件下演示什么?
把任务拆成“写下载”“写存储”“改启动”,容易让每个模块都到最后才与其他部分接上。字段意义、失败处理和分区配置的差异,在集成当天一起出现。
按行为拆分时,一个切片可以跨越多个文件,但它必须交付一个能观察的结果。先建立最小的正常升级链路,再沿着风险补齐异常路径,每个切片都关联验收规则。
| 任务 | 可验证的行为 | 依赖 | 完成证据 |
|---|---|---|---|
| T0 | 核验启动链、分区与升级模式 | 无 | 平台约束记录、最小启动与恢复验证 |
| T1 | 有效镜像完成下载、试启动和健康确认 | T0 | 目标板完整升级记录与新旧镜像标识 |
| T2 · R1 | 拒绝错误签名、错误板型与不允许的版本 | T1 | 异常包拒绝记录,原固件仍可用 |
| T3 · R2/R4 | 掉电或试启动失败后恢复运行 | T1 | 断电点矩阵、复位原因和恢复日志 |
| T4 · R3 | 下载叠加负载时满足采样时序 | T1 | 基线、测量条件与时间戳数据 |
| T5 · R5 | 升级与允许回退后配置正确 | T1 | 配置兼容矩阵与校准参数比对 |
T1 的演示只说明主路径已经接通。T2–T5 负责补齐产品验收,它们仍可能改动同一段状态逻辑。共享接口和配置结构变化时,要同步更新任务依赖。

一张能直接执行的任务单
T3 子任务示例 · 试启动失败后恢复旧固件输入
R2、R4,启动状态表,T1 的目标板验证记录。
范围
健康确认条件、启动接口适配、超时与复位诊断。
不包含生产公钥更换和硬件改版。
前置
旧固件有效,新镜像以“待试运行”方式安装。
场景
当新固件未完成健康检查,并由看门狗触发下一次复位,
应恢复到允许的旧固件,保留可读配置并记录复位原因。
证据
提交号、板卡编号、硬件版本、Bootloader 版本、固件哈希、
注入脚本、完整日志、结果断言,以及尚未覆盖的板型。
最小 Skill:to-tickets 的嵌入式用法
任务单应写明输入、修改边界、前置依赖、验证入口和完成标准。测试板、调试探针、电源控制器也是资源依赖:代码可以分开实现,共享硬件的烧录与断电实验需要预约和互斥。

每个任务交付一个可观察的设备行为,并引用 R 编号。
一个任务应能独立演示;若需要“等所有模块都写完”,继续拆分。
区分代码依赖、测试数据依赖与板卡资源依赖。
对涉及启动和持久化的任务,同时列出失败场景与恢复入口。
把完成标准写在实现前,把未覆盖条件留在任务单中。
本阶段产物T0–T5 任务单、依赖关系、硬件资源安排与各项验收证据要求。
放行条件每个切片都能独立演示;依赖和修改边界清楚;测试条件能够安排。
第四站:小步修改,让真机反馈及时进入实现
核心问题:当前改动有没有取得对应的新证据?
主机测试把 Flash 写入模拟为立即成功,真机擦写却有延迟和访问限制。一次大改同时调整任务、存储与升级状态,问题出现时已难以判断是哪一步引入。
围绕一个失败场景缩短反馈
- 先构造失败。让新固件在健康确认前停止推进,记录现有行为为何不满足 R4。
- 做最小修改。补齐确认条件与失败路径,只改当前任务需要的模块。
- 验证当前切片。先跑主机状态测试和构建,再到目标板核对启动与恢复。
- 保存当次证据。日志、测试条件和固件哈希关联同一个提交。修改后重新验证受影响的行为。
把“确认固件”的时机写成可审查的逻辑
以下为接口层伪代码,函数名和时间来源需要由平台适配。它表达确认条件,不包含具体 Bootloader API 或 Flash 实现。
C 风格伪代码 · 试运行确认条件void trial_health_step(void)
{
if (!boot_is_trial()) {
return;
}
if (trial_elapsed_ms() >= TRIAL_WINDOW_MS) { /* 示例:30000 ms */
record_fault(TRIAL_TIMEOUT);
request_system_reset();
return;
}
if (sampling_health_ok()
&& required_services_healthy()
&& rollback_config_ready()) {
int rc = boot_confirm_current();
if (rc != 0) {
record_fault(CONFIRM_WRITE_FAILED);
}
}
}
这段任务代码无法处理“自己已经卡死”的情况。因此还需要独立看门狗或等效监督路径,且喂狗条件应反映关键任务的真实进展。确认写入被掉电打断时,也必须由启动协议恢复到定义好的状态。
| 工程约束 | 执行时检查什么 | 留下什么证据 |
|---|---|---|
| 中断与任务 | 中断只做必要处理;任务交接、共享数据和同步方式符合上下文约束 | 中断耗时、任务唤醒、截止时间与并发复现记录 |
| Flash 擦写 | 查器件手册核验阻塞、对齐、跨区域访问和写入顺序 | 真实擦写耗时与采样负载下的抖动 |
| 内存与镜像 | 检查链接布局、栈堆预算、缓冲区边界与最终签名包大小 | map 文件、栈水位、镜像尺寸和压力运行记录 |
| 密钥与镜像 | 开发签名与生产签名分开;发布走受控流程 | 构建清单、验证结果与发布记录;不记录私钥 |
| 共享硬件 | 一次只有一个任务控制烧录、复位或断电;保留可用恢复入口 | 测试板预约、当前固件标识和恢复步骤 |
开发用密钥不能作为生产密钥使用;相关说明见 MCUboot imgtool 文档。这里要求的是发布材料可追溯,生产私钥应留在受控签名环境中。
最小 Skill:implement 的嵌入式用法

读取当前任务、Spec、ADR 和已确认的平台约束。
围绕当前切片构造可复现的失败,进行最小范围修改。
按项目约定执行主机测试、编译、静态检查与目标板验证。
记录实际运行的命令、版本、结果和没有执行的验证项。
出现分区、时序或兼容性假设失效时,返回对应设计或需求环节。
没有目标板证据时,只报告已完成的逻辑与构建范围。
本阶段产物当前提交的代码变更、构建产物、测试日志、板卡运行记录与未解决问题。
放行条件当前切片获得对应的新证据;范围变化已回写任务;未测项没有混入完成结论。
第五站:用正确的测试入口证明设备行为
核心问题:这些证据能覆盖 R1–R5,且对应待发布的版本吗?
状态迁移和镜像解析单测全部通过,升级包也成功构建。但测试从未打断一次真实 Flash 操作,仍无法证明 R2。验证时要检查证据来自哪里、覆盖什么条件,以及哪些结论超出了证据范围。
三层证据共同覆盖验收规则
| 验证层 | 重点验证什么 | 证据边界 |
|---|---|---|
| 主机与构建 | 状态迁移、解析边界、错误输入;编译、静态检查和镜像尺寸 | 不证明目标芯片的擦写时序、中断延迟和掉电行为。 |
| 目标板与 HIL | 真实存储、复位、断电、采样负载、Bootloader 和配置恢复 | 结论限于记录中的板型、硬件版本、固件与试验条件。 |
| 发布与现场 | 受控批次升级、失败阶段、设备版本、配置与运行趋势 | 需要约定观察周期、停发阈值和可执行的现场恢复安排。 |
真机故障注入矩阵
先固定可重现的边界用例,再按风险补充随机复位。断电时点、次数、负载、供电条件与覆盖板型都需要记录;仅写“断电测试通过”无法复核。
| 规则 | 故障或边界条件 | 必须检查的结果 |
|---|---|---|
| R1 | 篡改镜像、错误签名、错误板型或不允许的版本 | 拒绝候选镜像;受信旧固件仍可运行,拒绝原因可定位。 |
| R2 | 下载中断电、乱序或重复块、超边界数据 | 进度重新校验;允许的重试具有幂等性;没有越界写入。 |
| R2 | 启动切换的关键写入点断电 | 恢复到允许状态;受信固件可启动;镜像和状态记录一致。 |
| R4 | 新固件卡死、健康检查失败或确认写入中断 | 未确认路径经复位恢复旧固件;有复位原因与启动证据。 |
| R3 | 持续下载叠加最大约定采样、通信负载 | 按约定基线和窗口测量,满足 1 ms 新增抖动目标,无漏采。 |
| R5 | 配置迁移中复位,再执行允许的回退 | 旧有效配置可读,校准参数正确,无静默恢复为错误默认值。 |
R3 的报告需要定义时间零点、采样触发位置、最大迟到量和对照基线,并保留原始时间戳。用 GPIO 与逻辑分析仪观察时,要评估埋点开销;如果还要求 ADC 转换精度或端到端上报延迟,应另列对应指标。
两条审查轴:规范与需求
Standards · 实现质量
- 编码规范与接口约定是否一致?
- 缓冲区、资源释放与错误处理是否完整?
- 中断、任务与持久化访问是否有竞争?
- 测试能否稳定复现,有没有掩盖失败?
Spec · 需求符合度
- R1–R5 是否逐条有对应证据?
- 证据是否来自正确板型和测试入口?
- 异常条件与允许回退版本是否覆盖?
- 结论是否对应本次发布的镜像?
规范检查通过,主机测试通过。目标板在切换过程中掉电后无法恢复,R2 失败。
处理:回到 T3 修正持久化状态或恢复逻辑,重新构建并采集受影响的验证证据。其他检查通过不能覆盖这条失败。

最小 Skill:code-review 的嵌入式用法

固定基准提交与待审提交,并核对待发镜像哈希。
分别输出 Standards 与 Spec 两份结论,逐项保留依据。
每个缺陷给出:受影响规则、文件位置、触发条件和复现证据。
区分已通过、已失败、未测试和不适用;不把未测项写成通过。
核对板型、硬件版本、Bootloader、工具链和试验条件。
阻塞项修复后,对受影响规则重新取证并更新结论。
本阶段产物R1–R5 验证矩阵、主机与目标板日志、原始测量数据、两份审查结论。
放行条件约定的发布规则全部有有效证据;阻塞问题关闭;证据与待发布镜像一致。
第六站:让发布、恢复和接手都有依据
核心问题:现场出现问题时,谁能找到版本、定位阶段并恢复?
文件名相同的两个二进制来自不同提交。日志没有板型和启动版本,交接只写“OTA 已完成”。现场出现问题后,维护人员无法判断设备运行的镜像,也不知道哪条恢复路径仍然有效。
分批发布,每次扩大范围都有依据
| 发布阶段 | 放行依据 | 异常时的动作 |
|---|---|---|
| 实验室候选 | 验收矩阵通过;发布包、版本与证据匹配 | 停止发布,回到相关切片定位与修复。 |
| 受控试点 | 适用板型明确,设备可监测,现场有人负责恢复 | 暂停扩批,定位设备和失败阶段,按恢复预案处理。 |
| 扩大批次 | 试点观察完成;升级失败、复位和采样异常等阈值已经复核 | 触发既定停发条件时停止扩批,保留现场证据。 |
发布记录应保留设备版本、硬件版本、升级阶段、失败原因、复位趋势和关键业务状态。观察周期和停发阈值依据项目风险确定,不用一个脱离现场条件的成功率代替验收。
未确认的试运行
健康检查失败或超时后触发复位,由启动层执行已经验证的自动回退。保留旧固件及其可读配置,核对实际恢复结果。
已经确认的正式版本
优先通过受控修复镜像处理。若计划退回旧版本,先重新检查安全计数器、镜像策略和配置兼容性,并确认恢复步骤可执行。
发布包要能够追溯到同一次验证
| 产物 | 保存的内容 |
|---|---|
| 发布清单 | 固件文件、哈希、签名相关信息、目标板型、应用与 Bootloader 版本、工具链、构建参数和变更说明。 |
| 验证账本 | 需求编号、提交号、测试板、硬件版本、脚本、日志、结论、原始测量数据和未覆盖条件。 |
| 恢复方案 | 试启动恢复与正式版本修复各自的条件、负责人、现场入口、配置限制和操作顺序。 |
| 接续记录 | 已完成、待验证、阻塞项、下一步动作,以及 Spec、任务、构建和证据的稳定链接。 |
| 长期规范 | 掉电恢复经验、健康确认规则、配置兼容约定,以及可重复执行的故障用例。 |

最小 Skill:handoff 的嵌入式用法
交接写给没有参与本轮工作的人或新会话。用版本和证据链接定位事实,把“代码已改”与“哪些板型已验收”分别写清楚。

目标:完成 R2 / R4 的试启动失败恢复。
已完成:T3 逻辑与板型 A 的指定用例验证,记录见任务证据链接。
待验证:板型 B,以及配置迁移中的指定掉电点。
当前版本:填写真实提交号、板卡编号、Bootloader 版本和镜像哈希。
下一步:预约板型 B,按用例 P07 注入复位并比对运行版本与配置。
限制:未完成上述验证前,不扩大适用板型或发布批次。
恢复入口:引用已经核验的恢复操作说明及负责人。
敏感信息:只引用受控签名流程,不保存生产私钥或现场凭据。
本阶段产物可追溯发布包、验证账本、分批发布与恢复安排、handoff 和可复用规范。
放行条件适用范围与责任人明确;发布证据可找到;下一位接手者能继续验证或执行恢复。
六站连起来:问题应该退回哪里
流程允许往返。把问题送回能够解决它的阶段,比在实现里堆补丁更容易保持一致。
| 发现的问题 | 返回的阶段 | 需要更新的材料 |
|---|---|---|
| 下载时必须继续采样,但停机与抖动范围没有约定 | Brainstorm | 需求规则、维护窗口和负责人确认的决策 |
| 现有 Flash 模式无法满足容量或时序目标 | Design | 平台约束、分区、启动模式与可行性证据 |
| 一项任务无法独立演示,多个模块互相等待 | Plan | 切片范围、依赖和测试资源安排 |
| 目标板故障注入失败,已有定位线索 | Execute | 实现、复现用例和当前提交的运行记录 |
| 只有旧版本日志,待发布镜像没有对应证据 | Verify | 本次构建的验证矩阵与审查结论 |
| 技术验收完成,现场恢复责任与版本清单不全 | Ship | 发布清单、停发条件、恢复安排与交接 |
一旦规则或方案变化,沿着需求编号追踪受影响的任务与测试。跨会话、跨成员或跨板型工作时,随时补充 handoff,保持当前状态可接续。
理解阶段之后,再看六套工作流
工具选择应服务于团队最常失控的环节。下表沿用原文的六套工作流,并给出结合本案例的适配方向;这些方向是本文的工程判断,不是官方评级或对硬件能力的承诺。
| 工作流与官方资料 | 主要关注点 | 嵌入式项目中的适配方向 |
|---|---|---|
| OpenSpec | 变更规范与任务 | 将固件改动、兼容范围和验收规则先写成可审查材料。 |
| Superpowers | Skill 与执行纪律 | 为小步实现、测试反馈和审查设置清晰约束。 |
| Trellis | 项目规范与工作上下文 | 持续记录板卡状态、项目约定和跨会话的测试进展。 |
| GSD | 阶段规划与任务状态 | 分阶段推进较长的驱动、协议栈或升级功能开发。 |
| BMAD | 角色与研发产物 | 协调产品、固件、硬件和测试之间的输入与验收。 |
| OMC | 多 Agent 工作编排 | 组织可并行的分析与实现,同时单独管理共享硬件的互斥。 |
工作流工具能组织文档、任务与执行,板卡的真实能力仍要通过器件资料和测量确认。先补齐缺失的需求规则或验证入口,再判断是否需要更复杂的编排。
落地:嵌入式团队的一次最小试行
选择一个边界清楚、能够复现的固件变更,例如修复一次通信超时后的恢复,或增加一条可回归的配置校验路径。让一次小改动走完六阶段,观察哪些材料能帮助下一步继续。
- 确定目标板、当前版本、受影响行为与明确不做的事项。
- 写下可观察的验收规则,以及复位和失败后的行为。
- 记录接口、状态与观察入口,拆出一个可演示的切片。
- 小步实现,保存与当前固件对应的构建和运行证据。
- 在目标板执行相关异常用例,并分别审查代码质量与需求。
- 整理版本清单、恢复办法和下一步记录,再复盘遗漏。
按变更规模选择材料深度
| 变更范围 | 建议保留的最小材料 |
|---|---|
| 局部逻辑修复 | 明确的错误场景、相关代码修改、回归结果与交接说明。 |
| 驱动或协议功能 | 接口与状态约定、资源与时序约束、任务切片、目标板异常验证。 |
| 启动链、升级或持久化改造 | 完整平台约束、兼容与恢复设计、故障矩阵、版本证据和发布预案。 |
目标:为 [设备/板型] 修改 [可观察行为]。
已有材料:[仓库路径]、[需求]、[芯片资料]、[构建与烧录说明]。
先阅读现有实现,列出已经证实的事实与仍待确认的关键取舍。
给出可观察的验收规则、受影响模块和最小切片。
涉及时序、Flash 或启动链时,明确目标板验证与恢复入口。
执行后记录真实命令、版本、日志与未测项。
最终报告区分代码完成、构建通过、目标板验证和可发布状态。
复盘关注具体问题:哪里依赖了未经验证的假设,哪次测试缺少版本信息,哪个异常没有观察入口。把反复出现的约束加入项目规范,让下一次任务能够直接复用。
收尾:回到那句“加个 OTA”
走完这次教学案例,需求已经能落到采样与维护窗口,设计解释了分区和恢复责任,任务能够逐项演示,验证覆盖了真实设备的关键失败条件,发布材料也足以让下一位工程师接手。
同样的方法可以用于传感器驱动、RTOS 任务调整、串口与总线协议、功耗优化或产测功能:先明确设备行为,再让实现、验证与交付共享同一组工程约定。
让每个“已完成”,都能找到对应的固件、条件和证据。

