当用 Vibecoding 的方式来做嵌入式开发时,AI 像是“一个只懂理论、从没下过车间”的实习生,可能会遇到以下问题:
1. AI 摸不到真实的硬件(没法排查 Bug) 网页出错了会弹出一长串错误提示,AI 一看就懂。但硬件写错代码后,结果通常是死机、没反应、或者板子发烫。AI 没有眼睛和手,看不到这些物理现象,也就没法帮你找问题。
2. 芯片五花八门,AI 容易“张冠李戴” 做网页的标准很统一,但市面上有成千上万种单片机,每种都有厚厚的专属说明书。AI 很容易记错,把 A 芯片的控制方法错写成 B 芯片的。
3. 硬件容量太小,AI 的代码太“胖” AI 习惯了电脑上用不完的内存,写代码比较大手大脚。但硬件的内存极其可怜,AI 写的代码塞进去很容易就把内存撑爆了。
4. 硬件要求反应极快,AI 掌握不好“节奏” 控制硬件时,时间往往要精确到微秒,慢一点点就会出大问题。AI 写代码时喜欢加一些“常规操作”(比如打印一条日志),这在硬件里会导致严重的卡顿或死锁。
在上篇文章里,我已经试图构建一套workflow,试图解决1和4问题,并取得了还不错的效果。(
上篇文章中提到在开发之前,要使用skill让AI可以使用常规嵌入式开发软件进行编译,排查问题并烧录进硬件,并且可以读串口和调试。但是还是会出现芯片控制方法张冠李戴的问题,虽然现在顶尖模型会使用websearch查阅官方文档,但是一般只会查找最常见通用的芯片,对于一些小众芯片是无可奈何的。这时候在开发前严格约束就显得尤为重要,我之前想过用RAG的办法让AI严格遵守芯片的datesheet,但是这样会很麻烦,而且传统的 RAG 是基于“语义相似度”做切块(Chunking)的。而嵌入式开发中,配置一个外设(比如 I2C 或 DMA)往往需要绝对精确的寄存器地址、位掩码(Bitmask)和严格的初始化顺序。传统 RAG 很容易把寄存器 A 的高 16 位和寄存器 B 的低 16 位缝合在一起,导致芯片直接 Hard Fault;哪怕是Agentic RAG也无法解决。所以我想到了另一种简单有效的办法:使用Sysetm Prompt+伪SEO(给索引做索引)的办法严格约束AI。
例如当我们使用Claude Code的时候,在CLAUDE.md(其他例如Cursor也会有例如.cursorrules的文件)里面直接加入强制的“检索前置”步骤,并且写入类似”当接到涉及特定外设(如 I2C)的开发任务时,第一步必须读取 doc/rules_i2c.md,严格遵循其中的初始化顺序和状态机流转逻辑,绝对禁止跳过任何官方步骤。在编写具体的 C/C++/Rust 代码时,遇到需要操作的寄存器(如 I2C_CR1),第二步必须在 hardware/ 目录下的系统文件中检索其精确的位定义和宏,禁止自己捏造十六进制数值。“的强制性指令。
有了这个步骤之后,我们就可以着手开始整理检索文档了,首先可以将SVD文件和.h头文件归类作为基石原封不动放入仓库;然后找到Datesheet,这时候我们要进行一步清理。首先将Datasheet拆成独立的章节,例如I2C.pdf,DMA.pdf等等。然后将其喂给AI整理为Markdown,这时候要用极其苛刻的Prompt逼迫它输出标准化的SOP。
Sample:
角色:你是一个严谨的嵌入式高级工程师。 任务:阅读这份 [如:I2C 模块] 的数据手册章节,提取并在 Markdown 中输出标准的开发约束文档。
输出规范(请严格按以下结构输出,不要遗漏条件分支):
# [外设名称] 开发约束规范
## 1. 核心特性限制 (例如:最大时钟频率、支持的主从模式、硬件 Bug 或勘误表提到的 Workaround)
## 2. 严格初始化流程 (Initialization Sequence) (用有序列表 1, 2, 3... 提取官方手册要求的初始化步骤。例如:"1. 设置 I2C_CR1 寄存器的 PE 位为 0 以禁用 I2C。" 地址 0x4000...)
## 3. 中断与状态机处理 (提取标志位清除顺序:例如 "读取 SR1 后必须读取 SR2 才能清除 ADDR 标志")
在整理完全部的Markdown文档后,当前项目结构应该类似:
project_root/
├── .cursorrules (或 CLAUDE.md)
├── hardware/
│ └── mcu_registers.svd (或.h头文件,负责提供绝对精确的地址)
└── doc/
├── rules_i2c.md (负责提供绝对精确的初始化流程)
├── rules_spi.md
└── rules_adc.md完成这些后,再设立“索引的索引”: 在项目根目录放一个极其简短的 ARCHITECTURE.md,里面只写一件事:“做 A 去看路径 X,做 B 去看路径 Y”。让AI在出现幻觉的时候扫一眼这个文件,找到底层规范。
完成以上全部后,再结合上篇文章的skill,快乐地进行嵌入式Vibecoding吧。
评论交流
欢迎留下你的想法