固件任务按 Brainstorm → Design → Plan → Execute → Verify → Ship 六个阶段组织。小改动简化流程;涉及中断、DMA、存储或低功耗时,逐项检查硬件依据和验证结果。
SKILL.md 元数据
---
name: embedded-six-stage-workflow
description: >-
[Scope: global] 嵌入式固件研发六阶段门禁工作流(Brainstorm → Design → Plan → Execute → Verify → Ship)与高风险硬件改动审查清单。
当用户进行涉及中断(ISR)、DMA、时钟树、看门狗(IWDG/WDT)、通信协议、Flash/EEPROM擦写、低功耗休眠唤醒或跨模块架构修改时使用此技能。
---
1. 按改动风险选择流程
- 低风险小改:目标明确、不涉及硬件时序、对外协议或跨模块共享状态时,简化为:
调查事实 → 最小修改 → 编译/静态检查 → 汇报。 - 普通功能:完成需求边界确认、简短设计、可独立验收的垂直任务切片、实现验证与交付说明。
- 高风险改动:涉及 中断(ISR)、DMA、并发竞态、系统/外设时钟、看门狗、无线/总线通信协议、Flash/EEPROM 擦写、掉电恢复、低功耗唤醒、安全电平、启动文件/链接脚本或芯片厂商库 时,必须完整执行以下六阶段 Gate,并逐项核对 硬件与并发安全检查清单。
2. 六阶段门禁(Stage Gates)
Stage 1: Brainstorm(需求澄清与依据核查)
- 事实自查 vs 用户决策:源码、工程文件(
.uvprojx/.scw/CMakeLists.txt)、已有文档和git status能回答的事实由 Agent 自行检索;产品行为、未定义参数、硬件取舍、存储格式提交用户确认。 - 提示词缺失反馈(最多 3 项):当缺少芯片型号、原理图/引脚连接、协议定义或数据手册依据时,最多列出 3 个最关键缺失信息,说明原因并给出可复制的补充提示词。
- Gate 通过条件:目标、范围、明确不做项、验收口径一致;无未确认的硬件假设。
Stage 2: Design(方案设计)
- 分层边界:严守
APP(业务/状态机/UI,禁止直接操作寄存器)与DRV(器件协议/时序/超时恢复,禁止包含业务策略)分层。 - 高风险设计必含项:
- DMA/中断:通道归属、抢占优先级关系、缓冲区所有权与生命周期、启动/完成/超时取消路径。
- Flash/EEPROM:数据版本、边界与 CRC 校验、写入原子性、磨损评估、掉电中断与启动恢复策略。
- Gate 通过条件:模块职责、数据流/时序、异常恢复路径和验证观察点明确,且有数据手册/原理图依据。
Stage 3: Plan(垂直切片规划)
- 垂直切片:按“可独立演示或验证的行为”拆分小任务,不把顺手重构或格式化混入功能切片。
- 主机回归计划:按键、状态机、协议、算法或存储恢复等可脱离硬件验证的修改,按需使用 embedded-host-regression 选择相关已有测试、故障模型及必要新增用例;纯文档或无逻辑变化的小改不因此新增测试。项目具体命令留在项目 AGENTS.md/测试文档。
- 验收判据:使用“给定……当……那么……”描述正常、边界与异常场景;硬件任务写明需观测的引脚、波形、频率或寄存器。
- Gate 通过条件:每个切片均可独立编译、独立验证、独立回退。
Stage 4: Execute(最小实现与短反馈循环)
- 工作区保护:动手前检查
git status --short,保护用户已有改动;保持原文件编码(UTF-8 或历史 GBK)与换行符,不擅自更换编译器版本或重构厂商驱动库。 - 修改与检查顺序:
读取切片 → 确认验证入口 → 最小修改 → 立即构建/检查 → 审查 Diff。 - Gate 通过条件:完成最小代码修改,且取得当前切片的编译或静态检查证据。
Stage 5: Verify(双维独立审查)
- Standards Review(规范审查):对照 硬件与并发安全检查清单 检查实时性、RAM/Flash 增量、并发原子性、超时退出与看门狗安全。
- Spec Review(需求审查):从原始需求与协议定义反查正常、边界(如数组首尾、通道边界、计数器回绕)与异常恢复路径。
- 主机回归证据:执行计划中相关回归,确认读取当前生产源码并记录命令、结果和模型范围;可复现的缺陷尽量检查旧逻辑失败、修复后通过。主机逻辑不能替代原工具链构建及实板验证,断言数不是固定门槛或设备数,细节按需查阅 主机回归技能。
- 诚实报告验证层级:严格区分 静态审查 / 编译通过 / 仿真验证 / 上板实测 / 示波器与逻辑分析仪验证 / 掉电注入。未执行的层级必须明确标注“未验证”及建议测试方法,绝不把“编译通过”等同于“硬件功能通过”。
Stage 6: Ship(交付与文档同步)
- 交付报告:包含修改内容与原因、对协议/时序/存储/资源占用的影响、已执行的验证结果、未验证风险及回退方式。
- 测试报告:功能/版本交付或用户要求时,按需采用 主机回归报告方法,关联实际被测源码、用例、执行证据与遗留问题;自动汇总事实,人工确认验收结论,不为每次小改强制生成长报告。
- Git 提交规范:仅在用户明确要求时创建 Commit。按“可独立审查、独立回退的单一目的”划分提交粒度;使用简洁明确的中文标题(如
修复DMX短帧发布条件),排除Objects/、*.hex、*.axf、*.map等构建产物。
参考文档:嵌入式硬件与并发安全检查清单 (references/hardware-safety-checklist.md)
在设计(Design)、执行(Execute)与验证(Verify)阶段,针对以下高风险场景逐项核对:
1. 中断 (ISR) 与并发共享数据
- ISR 短小确定:ISR 仅执行状态读取、标志清除、时间敏感位操作或最小数据搬运;严禁在 ISR 中调用阻塞延时、Flash 擦写、动态内存分配、长循环或耗时日志(如
printf)。 volatile与原子性:主循环、ISR、DMA 共享的标志与计数器必须声明volatile;但volatile不保证复合操作(读-改-写)或多字节数据的原子性,需采用单生产者/单消费者双缓冲发布协议或极短临界区。- 抢占优先级明确:新增中断需核对 NVIC 分组(如
NVIC_PriorityGroup_4)及与最高优先级采样/定时中断的抢占关系。
2. DMA 与外设总线安全
- 缓冲区生命周期:DMA 缓冲区严禁分配在栈(Stack)上,必须使用静态内存并满足对齐与数据宽度要求;在
IsBusy() == false前,调用方绝不可覆写该缓冲区。 - DMA 完成 != 外设发送完成:如 SPI DMA TX/RX 完成中断触发时,移位寄存器可能仍在发送最后一位;在拉高 CS 片选、切换 SPI 数据宽度或关闭外设前,必须在主循环确认外设
BUSY标志已清除。 - 外设单一所有者:运行期间禁止用另一套初始化覆盖正在工作的 SPI/I2C/UART 的时钟极性、字长、DMA 映射或复用引脚。
3. 定时器、延时与看门狗 (IWDG/WDT)
- 无符号 Tick 回绕安全:所有超时与非阻塞延时均使用无符号差值
(uint32_t)(now_tick - start_tick) >= timeout_ticks,禁止使用now_tick >= target_tick以防溢出死等。 - 看门狗喂狗纪律:仅在主循环唯一调度点喂狗,严禁在定时器 ISR 或底层驱动死等循环中喂狗。
- 看门狗窗口约束:
IWDG_Init()置于所有阻塞初始化之后;运行期的耗时操作(如大块擦写、刷屏)必须拆分为非阻塞状态机,确保主循环单轮耗时远小于看门狗超时窗口。
4. GPIO、低功耗与复用引脚
- 上电防误动作:GPIO 输出初始化时,必须先写入安全电平数据寄存器,再配置方向为输出模式,防止驱动功放、电机或发热器件产生上电毛刺。
- 分时复用引脚恢复:若同一引脚分时复用(如按键
KEY与射频CSN共用),每次通信或扫描后必须恢复端口方向寄存器(如TRISx/输入输出模式)与默认电平。 - 休眠与唤醒顺序:进入低功耗前关闭外设功耗(如功放、射频芯片掉电、PWM 关闭)、清理未完成帧状态并清除唤醒中断标志;唤醒后按严格时序恢复时钟与外设接收态。
5. 资源受限与工具链约束(ARMCC 5 / XC8 / 8 位机)
- 零动态分配:禁止使用
malloc/free、变长数组(VLA)及递归调用;字库与只读查找表必须加const放入 Flash/ROM。 - 旧编译器兼容:在 Keil ARMCC 5 中注意 UTF-8 中文字符串字面量转义;在 XC8 / C90 8 位机编译器中局部变量须声明在代码块开头,并严格核算 Flash(words)与 RAM(bytes)余量。
- 防越界与防除零:所有通信帧载荷长度、通道位移(如
1U << ch)、数组下标、ADC 换算必须显式做范围与边界检查。