嵌入式研发实践 · 六阶段工作流

从 AI 写固件
到 嵌入式 AI 工作流

一次远程升级需求的两种走法。以工业采集终端为例,走过需求澄清、方案设计、任务规划、实现执行、验证审查与交付沉淀,把每个“已完成”落实到可复核的工程证据。

面向固件、驱动与测试工程师工业采集终端 OTA 教学案例深度阅读 · 约 25 分钟
嵌入式 AI 协作开发六阶段
嵌入式 AI 协作开发六阶段· 点击查看大图

开场:同一个 OTA 需求,两种交付结果

“给采集终端加一个 OTA 功能。”这句话看起来只有下载固件、写入 Flash、重启三个动作。到了现场,采样任务还在运行,通信会中断,设备随时可能掉电,旧版本配置也必须保留。AI 很快能写出一条成功路径,但这些约束需要团队主动说清楚。

版本 A:直接生成升级代码

Agent 写好下载回调和烧录函数,开发板成功启动新版本,于是任务被标成“完成”。接下来的检查才发现:

  • 进度先落盘、数据后写入,掉电后续传位置失真;
  • 只检查 CRC,镜像来源与目标板型没有校验;
  • Flash 擦写阻塞,采样任务错过截止时间;
  • 新固件刚进入主函数就确认,故障回退失去机会;
  • 配置已迁移,旧固件恢复后却读不懂。

编译通过、单次升级成功,只覆盖了这次演示发生的条件。

版本 B:先定义可交付的设备行为

  1. 确认下载、安装和重启各自允许的采样中断。
  2. 核验分区、启动方案和芯片擦写限制。
  3. 按正常升级、异常拒绝、故障恢复等行为拆任务。
  4. 每次修改都保留对应的构建与运行证据。
  5. 在目标板注入断电、超时和错误镜像。
  6. 带着发布包、恢复条件和交接记录分批发布。

每一步都明确:依据哪条规则,观察什么结果,什么情况必须退回修正。

同一个 OTA 需求的两种交付结果
同一个 OTA 需求的两种交付结果· 点击查看大图

嵌入式研发中的“完成”,需要把代码、硬件条件和现场恢复放在一起判断。

六阶段工作流的作用,是及时暴露不同类型的不确定性。AI 可以加快代码阅读、方案整理、测试构造与日志分析,工程团队则要让它的每个结论都有输入、有边界、有证据。


贯穿全文的案例:工业采集终端远程固件升级

设想一台使用 Cortex-M MCU 与 RTOS 的工业采集终端。它周期采集传感器数据,通过网关上报,现场人员依靠远程诊断维护设备。本次变更增加固件下载、受控安装、试启动确认和失败恢复。

已有业务仍要运行:采样任务负责时序,通信任务负责上报,配置区保存设备地址与校准参数。升级功能必须与这些路径共同工作,并适配实际板型及现有 Bootloader。

10 ms周期采样间隔
≤ 1 ms下载期间新增调度抖动
30 s试运行健康确认窗口
维护窗口安装与重启允许暂停采样

案例为教学设定,以上均为示例目标,不代表特定芯片的性能或已完成的测试。实际项目先核验 Flash 容量、擦写与读写限制、启动实现和现场条件,再决定可承诺的指标。

改动会穿过哪些模块

工业采集终端 OTA 系统结构
工业采集终端 OTA 系统结构· 点击查看大图

最危险的问题可能没有编译错误

一个持久化标志写错顺序,只在特定掉电点暴露。任务优先级与擦写方式不合适,可能只在通信和采样叠加负载时失效。配置迁移能够通过新版本测试,旧版本回退后却无法读取。这些问题需要跨越模块边界和实际运行条件来观察。


快速原型的适用边界

让 AI 快速搭起一个协议解析器、日志解码脚本或状态机原型,很适合探索问题。团队可以在开发板上缩短反馈周期,同时把原型结论与产品承诺分开记录。

原型验证与产品验收的范围
场景适合快速探索的部分进入产品前需补齐的证据
工具与纯逻辑日志处理、配置格式转换、状态迁移原型输入边界、错误路径、接口约定
驱动与任务参考现有 BSP 搭起最小通信或采样链路引脚与时钟配置、并发、时序、资源占用
启动与持久化用模拟存储验证升级流程真实擦写、断电恢复、镜像验证与配置兼容

当修改涉及 Flash、启动链、看门狗或共享外设时,应当先写清楚失败行为和恢复入口。主机上能够运行的模型,为设计提供快速反馈;设备的物理约束仍由目标硬件验证。


先统一术语,再讨论工作流

本文常用术语
术语在本案例中的含义
Skill / Artifact / GateAI 的行动规则 / 可复用的工程产物 / 进入下一步的放行条件。
Spec / ADRSpec 记录需求与验收约定;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 规定何时继续,例如掉电恢复用例未通过,本批次升级不得扩大。

嵌入式六阶段风险地图
嵌入式六阶段风险地图· 点击查看大图

01BRAINSTORM · 需求澄清

第一站:把“加个 OTA”变成可检查的规则

核心问题:下载、安装和故障分别允许设备怎样表现?

翻车现场:一句话需求,默认了整套硬件能力

收到“远程升级”后,Agent 可能默认:Flash 足够放两份镜像;擦写不会阻塞采样;任何复位都会回到旧版本;新旧固件共用一套配置;通信恢复后续传一定安全。这些假设必须从代码、芯片资料和产品约定中逐一核验。

事实先查,关键取舍明确到人

AI 应先阅读链接脚本、当前固件的 map 文件、BSP 与启动配置,查明镜像大小、存储布局、看门狗和配置写入路径。需要核对器件手册的内容,应记录型号与文档版本。

下载期间允许增加多少抖动、重启能否暂停采样、断网是否影响健康确认、现场失败由谁恢复,这些需要产品、固件和测试负责人共同确认。已经确认的决定进入记录,未知项保持显式状态。

案例落地:五条可追踪的验收规则

为后续设计、任务和证据统一编号。同一条 R 编号会在任务单、测试矩阵和发布报告中反复出现。

教学案例验收规则 R1–R5;时间数值为示例目标
编号验收规则怎样观察结果
R1只运行签名有效且匹配目标硬件、满足版本策略的镜像。篡改镜像、错误签名或错误板型的包不得进入试启动。
R2在约定的下载与切换掉电场景下,仍有受信固件可恢复启动。复位后核对启动版本、镜像状态与进度记录;覆盖关键持久化写入点。
R3下载期间继续按 10 ms 周期采样,新增调度抖动 ≤ 1 ms。以约定基线、负载与测量窗口比较采样触发时间,并检查漏采与截止时间。
R4新固件完成健康检查后才能确认,确认窗口为 30 s。超时未确认则触发复位;卡死时由独立监督机制复位,再验证启动层回退。
R5升级及允许的回退均保留有效配置与校准参数。比对配置版本、校准值、迁移中断与回退后的读值。

R3 与维护窗口必须一起写。本案例要求下载期间保留采样;安装和重启允许在维护窗口暂停采样。如果硬件擦写限制使下载目标不可达,需要调整存储方案或重新约定行为,并将决定回写需求。

最小 Skill:grilling 的嵌入式用法

沿着决策依赖澄清:先确定设备和存储事实,再讨论采样与停机,最后确定健康条件和现场恢复。每个问题带上已有证据与建议,避免把代码检索工作转交给负责人。

grilling:硬件事实与产品取舍
grilling:硬件事实与产品取舍· 点击查看大图
嵌入式指令示例 · 需求澄清
先检查目标板、链接脚本、Bootloader、现有固件大小与配置路径。
区分:已证实的事实 / 待验证的假设 / 需要负责人的取舍。
按依赖顺序澄清下载时序、维护窗口、健康确认与恢复责任。
对每个尚未决定的关键取舍给出建议和依据,再等待对应负责人确认。
把结论写成带编号的可观察规则,保留未知项和范围外事项。
已有决策直接复用;关键取舍未解决的部分,不进入依赖它的实现。

本阶段产物需求 R1–R5、适用板型、维护窗口、健康条件、恢复责任人与待验证假设。

放行条件关键取舍已确认;每条规则都有可观察结果;未知硬件能力有验证安排。


02DESIGN · 方案设计

第二站:把需求落实到分区、状态和责任

核心问题:谁决定启动,谁确认健康,掉电后从哪里恢复?

翻车现场:应用里的一个标志,承担了整个启动协议

下载任务把 upgrade_ready 写成真,应用随后重启。启动层却不知道标志是否完整写入、候选区是否已经验证、旧镜像还在不在。下载成功和可以启动之间,缺了一份共同遵守的状态契约。

先核验平台,再决定升级模式

核对可用 Flash、擦写粒度、地址对齐、执行与读写限制,以及候选镜像的最大容量。分区预算必须覆盖镜像头、签名或校验元数据、状态尾部和实际算法需要的临时空间。检查链接脚本与打包工具是否使用同一份布局。

本案例选择已经验证支持试启动与失败回退的启动方案作为前提。双镜像存储本身不能证明具备回退能力,单纯覆盖原镜像的策略也不能凭空保留旧镜像。以 MCUboot 为参考时,应按实际模式核对试启动、确认和复位后的行为。见 MCUboot 启动与试启动设计。

设计中的模块责任与测试入口
模块负责的行为主要观察入口
传输与下载分块接收、边界检查、重试、候选区写入与可校验的进度恢复块序号、写入日志、候选镜像摘要
OTA 状态机协调下载状态、维护窗口与受控试启动请求状态事件、错误码、复位原因
Bootloader执行启动前验证与版本策略,处理切换、确认状态和故障恢复启动日志、运行版本、镜像状态
采样与健康检查监测采样时序、关键任务进展与存储状态,满足条件才确认GPIO 时间戳、错误计数、确认记录
配置存储版本化读写、迁移恢复,保留允许回退版本能读取的有效配置配置版本、校准值、迁移日志

板型判断需要自己的可信约定:把硬件标识纳入受签名保护的元数据,明确由哪一层强制核验。选择了某个 Bootloader,并不自动获得项目特有的板型、网关或配置兼容策略。

状态表必须写出复位后的行为

  1. 01 下载中写候选区
  2. 02 候选已验证等待维护窗口
  3. 03 待试启动受控切换
  4. 04 试运行健康检查
  5. 05 已确认正常运行
状态与恢复契约;行为依赖所选启动实现
状态允许的动作复位或失败后的预期
下载中写候选区,持久化可验证的进度;当前受信固件保持可用启动原固件;重验已写区域后续传,无法确认时重新下载。
候选已验证核对完整镜像、签名、板型与版本策略,等待维护窗口保留当前固件;从持久化状态恢复并重新检查安装前提。
待试启动记录受控安装请求,由启动层执行选定的切换流程按启动层的持久化协议完成恢复;不得由应用猜测交换进度。
试运行在约定窗口内检查健康,保留旧镜像与兼容配置未确认且再次复位时,按已验证的恢复方案启动旧版本。
已确认正常运行,并按兼容策略提交配置状态后续问题通过受控修复版本处理;回退前重新检查安全策略和配置。

持久化顺序需要写清“写数据、验证数据、提交进度”的完成点,并考虑提交记录本身被掉电打断的情形。根据存储介质选择校验、版本号或冗余记录,启动时只相信可验证的状态。

健康检查也要有具体定义:关键采样任务是否持续推进,必需外设是否可用,配置是否能读写,必须的通信功能是否正常。是否要求远端在线属于产品决策,不能让一次普通断网无意中触发持续回退。

三个不同的约束

签名验证检查镜像是否可信;防恶意降级限制允许的版本;故障回退恢复未确认的试运行。需要同时设计三者,尤其要核对安全计数器的提交时机与旧版本是否仍被允许。参考 MCUboot 防降级说明。

最小 Skill:to-spec 的嵌入式用法

to-spec:平台、状态、接口与测试入口
to-spec:平台、状态、接口与测试入口· 点击查看大图
嵌入式 Spec 结构示例
1. 目标与范围:R1–R5、板型、现有固件和明确不做的事项
2. 平台约束:Flash 布局、链接地址、擦写限制、RAM 与镜像预算
3. 模块与接口:责任、参数、错误码、任务/中断上下文
4. 状态与恢复:触发条件、持久化点、复位后的允许状态
5. 兼容策略:Bootloader、板型、配置版本与允许回退的组合
6. 测试入口:主机状态测试、构建检查、目标板与 HIL
7. 关键决策:方案依据、验证证据、未知项与负责人

从已经确认的需求综合设计,把尚未解决的选择列为待决项。为每条 R 规则标出负责模块和观察入口,后面的任务才能引用同一份契约。

本阶段产物分区表、接口契约、升级状态表、兼容矩阵、测试入口与关键 ADR。

放行条件平台约束有依据;恢复方案完成必要的最小验证;每条验收规则都能落到具体模块。


03PLAN · 任务规划

第三站:按设备行为拆成可验证的切片

核心问题:每个任务完成后,能在什么条件下演示什么?

翻车现场:驱动、协议、Bootloader 都“写完了”

把任务拆成“写下载”“写存储”“改启动”,容易让每个模块都到最后才与其他部分接上。字段意义、失败处理和分区配置的差异,在集成当天一起出现。

按行为拆分时,一个切片可以跨越多个文件,但它必须交付一个能观察的结果。先建立最小的正常升级链路,再沿着风险补齐异常路径,每个切片都关联验收规则。

任务拆分示例;全部发布规则通过后才能对外交付
任务可验证的行为依赖完成证据
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 的嵌入式用法

任务单应写明输入、修改边界、前置依赖、验证入口和完成标准。测试板、调试探针、电源控制器也是资源依赖:代码可以分开实现,共享硬件的烧录与断电实验需要预约和互斥。

to-tickets:设备行为与共享硬件依赖
to-tickets:设备行为与共享硬件依赖· 点击查看大图
切片检查规则示例
每个任务交付一个可观察的设备行为,并引用 R 编号。
一个任务应能独立演示;若需要“等所有模块都写完”,继续拆分。
区分代码依赖、测试数据依赖与板卡资源依赖。
对涉及启动和持久化的任务,同时列出失败场景与恢复入口。
把完成标准写在实现前,把未覆盖条件留在任务单中。

本阶段产物T0–T5 任务单、依赖关系、硬件资源安排与各项验收证据要求。

放行条件每个切片都能独立演示;依赖和修改边界清楚;测试条件能够安排。


04EXECUTE · 实现执行

第四站:小步修改,让真机反馈及时进入实现

核心问题:当前改动有没有取得对应的新证据?

翻车现场:状态机测试通过,上板后采样超时

主机测试把 Flash 写入模拟为立即成功,真机擦写却有延迟和访问限制。一次大改同时调整任务、存储与升级状态,问题出现时已难以判断是哪一步引入。

围绕一个失败场景缩短反馈

  1. 先构造失败。让新固件在健康确认前停止推进,记录现有行为为何不满足 R4。
  2. 做最小修改。补齐确认条件与失败路径,只改当前任务需要的模块。
  3. 验证当前切片。先跑主机状态测试和构建,再到目标板核对启动与恢复。
  4. 保存当次证据。日志、测试条件和固件哈希关联同一个提交。修改后重新验证受影响的行为。

把“确认固件”的时机写成可审查的逻辑

以下为接口层伪代码,函数名和时间来源需要由平台适配。它表达确认条件,不包含具体 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 的嵌入式用法

implement:小步修改与真机反馈(示意)
implement:小步修改与真机反馈(示意)· 点击查看大图
执行指令示例
读取当前任务、Spec、ADR 和已确认的平台约束。
围绕当前切片构造可复现的失败,进行最小范围修改。
按项目约定执行主机测试、编译、静态检查与目标板验证。
记录实际运行的命令、版本、结果和没有执行的验证项。
出现分区、时序或兼容性假设失效时,返回对应设计或需求环节。
没有目标板证据时,只报告已完成的逻辑与构建范围。

本阶段产物当前提交的代码变更、构建产物、测试日志、板卡运行记录与未解决问题。

放行条件当前切片获得对应的新证据;范围变化已回写任务;未测项没有混入完成结论。


05VERIFY · 验证审查

第五站:用正确的测试入口证明设备行为

核心问题:这些证据能覆盖 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 的嵌入式用法

code-review:版本固定、双轴审查与证据状态
code-review:版本固定、双轴审查与证据状态· 点击查看大图
审查指令示例
固定基准提交与待审提交,并核对待发镜像哈希。
分别输出 Standards 与 Spec 两份结论,逐项保留依据。
每个缺陷给出:受影响规则、文件位置、触发条件和复现证据。
区分已通过、已失败、未测试和不适用;不把未测项写成通过。
核对板型、硬件版本、Bootloader、工具链和试验条件。
阻塞项修复后,对受影响规则重新取证并更新结论。

本阶段产物R1–R5 验证矩阵、主机与目标板日志、原始测量数据、两份审查结论。

放行条件约定的发布规则全部有有效证据;阻塞问题关闭;证据与待发布镜像一致。


06SHIP · 交付沉淀

第六站:让发布、恢复和接手都有依据

核心问题:现场出现问题时,谁能找到版本、定位阶段并恢复?

翻车现场:留下一个 firmware.bin,现场无法继续

文件名相同的两个二进制来自不同提交。日志没有板型和启动版本,交接只写“OTA 已完成”。现场出现问题后,维护人员无法判断设备运行的镜像,也不知道哪条恢复路径仍然有效。

分批发布,每次扩大范围都有依据

发布步骤与恢复责任
发布阶段放行依据异常时的动作
实验室候选验收矩阵通过;发布包、版本与证据匹配停止发布,回到相关切片定位与修复。
受控试点适用板型明确,设备可监测,现场有人负责恢复暂停扩批,定位设备和失败阶段,按恢复预案处理。
扩大批次试点观察完成;升级失败、复位和采样异常等阈值已经复核触发既定停发条件时停止扩批,保留现场证据。

发布记录应保留设备版本、硬件版本、升级阶段、失败原因、复位趋势和关键业务状态。观察周期和停发阈值依据项目风险确定,不用一个脱离现场条件的成功率代替验收。

未确认的试运行

健康检查失败或超时后触发复位,由启动层执行已经验证的自动回退。保留旧固件及其可读配置,核对实际恢复结果。

已经确认的正式版本

优先通过受控修复镜像处理。若计划退回旧版本,先重新检查安全计数器、镜像策略和配置兼容性,并确认恢复步骤可执行。

发布包要能够追溯到同一次验证

发布与交接材料
产物保存的内容
发布清单固件文件、哈希、签名相关信息、目标板型、应用与 Bootloader 版本、工具链、构建参数和变更说明。
验证账本需求编号、提交号、测试板、硬件版本、脚本、日志、结论、原始测量数据和未覆盖条件。
恢复方案试启动恢复与正式版本修复各自的条件、负责人、现场入口、配置限制和操作顺序。
接续记录已完成、待验证、阻塞项、下一步动作,以及 Spec、任务、构建和证据的稳定链接。
长期规范掉电恢复经验、健康确认规则、配置兼容约定,以及可重复执行的故障用例。
固件交付三件套
固件交付三件套· 点击查看大图

最小 Skill:handoff 的嵌入式用法

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

handoff:板卡、版本、验证范围与恢复步骤
handoff:板卡、版本、验证范围与恢复步骤· 点击查看大图
交接摘录示例 · 非实际项目状态
目标:完成 R2 / R4 的试启动失败恢复。
已完成:T3 逻辑与板型 A 的指定用例验证,记录见任务证据链接。
待验证:板型 B,以及配置迁移中的指定掉电点。
当前版本:填写真实提交号、板卡编号、Bootloader 版本和镜像哈希。
下一步:预约板型 B,按用例 P07 注入复位并比对运行版本与配置。
限制:未完成上述验证前,不扩大适用板型或发布批次。
恢复入口:引用已经核验的恢复操作说明及负责人。
敏感信息:只引用受控签名流程,不保存生产私钥或现场凭据。

本阶段产物可追溯发布包、验证账本、分批发布与恢复安排、handoff 和可复用规范。

放行条件适用范围与责任人明确;发布证据可找到;下一位接手者能继续验证或执行恢复。


六站连起来:问题应该退回哪里

流程允许往返。把问题送回能够解决它的阶段,比在实现里堆补丁更容易保持一致。

问题回流与工程材料的同步
发现的问题返回的阶段需要更新的材料
下载时必须继续采样,但停机与抖动范围没有约定Brainstorm需求规则、维护窗口和负责人确认的决策
现有 Flash 模式无法满足容量或时序目标Design平台约束、分区、启动模式与可行性证据
一项任务无法独立演示,多个模块互相等待Plan切片范围、依赖和测试资源安排
目标板故障注入失败,已有定位线索Execute实现、复现用例和当前提交的运行记录
只有旧版本日志,待发布镜像没有对应证据Verify本次构建的验证矩阵与审查结论
技术验收完成,现场恢复责任与版本清单不全Ship发布清单、停发条件、恢复安排与交接

一旦规则或方案变化,沿着需求编号追踪受影响的任务与测试。跨会话、跨成员或跨板型工作时,随时补充 handoff,保持当前状态可接续。


理解阶段之后,再看六套工作流

工具选择应服务于团队最常失控的环节。下表沿用原文的六套工作流,并给出结合本案例的适配方向;这些方向是本文的工程判断,不是官方评级或对硬件能力的承诺。

工具索引与场景适配;采用前核对当前版本及项目约束
工作流与官方资料主要关注点嵌入式项目中的适配方向
OpenSpec变更规范与任务将固件改动、兼容范围和验收规则先写成可审查材料。
SuperpowersSkill 与执行纪律为小步实现、测试反馈和审查设置清晰约束。
Trellis项目规范与工作上下文持续记录板卡状态、项目约定和跨会话的测试进展。
GSD阶段规划与任务状态分阶段推进较长的驱动、协议栈或升级功能开发。
BMAD角色与研发产物协调产品、固件、硬件和测试之间的输入与验收。
OMC多 Agent 工作编排组织可并行的分析与实现,同时单独管理共享硬件的互斥。

工作流工具能组织文档、任务与执行,板卡的真实能力仍要通过器件资料和测量确认。先补齐缺失的需求规则或验证入口,再判断是否需要更复杂的编排。


落地:嵌入式团队的一次最小试行

选择一个边界清楚、能够复现的固件变更,例如修复一次通信超时后的恢复,或增加一条可回归的配置校验路径。让一次小改动走完六阶段,观察哪些材料能帮助下一步继续。

  1. 确定目标板、当前版本、受影响行为与明确不做的事项。
  2. 写下可观察的验收规则,以及复位和失败后的行为。
  3. 记录接口、状态与观察入口,拆出一个可演示的切片。
  4. 小步实现,保存与当前固件对应的构建和运行证据。
  5. 在目标板执行相关异常用例,并分别审查代码质量与需求。
  6. 整理版本清单、恢复办法和下一步记录,再复盘遗漏。

按变更规模选择材料深度

材料随风险与影响范围扩展
变更范围建议保留的最小材料
局部逻辑修复明确的错误场景、相关代码修改、回归结果与交接说明。
驱动或协议功能接口与状态约定、资源与时序约束、任务切片、目标板异常验证。
启动链、升级或持久化改造完整平台约束、兼容与恢复设计、故障矩阵、版本证据和发布预案。
可直接使用的嵌入式任务开场模板
目标:为 [设备/板型] 修改 [可观察行为]。
已有材料:[仓库路径]、[需求]、[芯片资料]、[构建与烧录说明]。
先阅读现有实现,列出已经证实的事实与仍待确认的关键取舍。
给出可观察的验收规则、受影响模块和最小切片。
涉及时序、Flash 或启动链时,明确目标板验证与恢复入口。
执行后记录真实命令、版本、日志与未测项。
最终报告区分代码完成、构建通过、目标板验证和可发布状态。

复盘关注具体问题:哪里依赖了未经验证的假设,哪次测试缺少版本信息,哪个异常没有观察入口。把反复出现的约束加入项目规范,让下一次任务能够直接复用。


收尾:回到那句“加个 OTA”

走完这次教学案例,需求已经能落到采样与维护窗口,设计解释了分区和恢复责任,任务能够逐项演示,验证覆盖了真实设备的关键失败条件,发布材料也足以让下一位工程师接手。

同样的方法可以用于传感器驱动、RTOS 任务调整、串口与总线协议、功耗优化或产测功能:先明确设备行为,再让实现、验证与交付共享同一组工程约定。

让每个“已完成”,都能找到对应的固件、条件和证据。

围绕 OTA 升级的六阶段工程闭环
围绕 OTA 升级的六阶段工程闭环· 点击查看大图