诚实的出发点
AI 编程助手在嵌入式工作的某些地方很擅长,在另一些地方很危险,而危险的地方,恰恰是嵌入式和网页、应用开发不同的地方。助手读过大量的代码和数据手册,但它从没碰过你的板子。它不知道你用的是哪个硅片版本、适用哪些勘误、你的走线有多长、你的电源在负载下表现如何。不加小心地使用,它会写出能编译、看起来对、却在硬件上以一种要花几天才能找到的方式出错的代码。配上一套让硬件做最终裁判的工作流,它能节省大量时间。本文描述我们使用的工作流。
助手在哪里值回票价
- 样板和脚手架。工程结构、构建文件、驱动骨架、设备树节点、状态机框架、单元测试框架。这些有固定模式、容易检查,又很枯燥。
- 读懂已有的东西。解释一个不熟悉的厂商 SDK、总结一个模块、追踪一个请求在代码库里怎么流转、找出所有碰过某个共享变量的地方。
- 日志和崩溃分诊。一份很长的启动日志、一份硬故障寄存器转储或者一段协议抓包,本质上是文本问题。助手能很快找到关键的那一行,并提出假设,再由你去验证。可以看我们关于让助手访问串口的文章。
- 代码评审。多一位读者,专门找缺失的错误检查、整数溢出、不安全的中断用法、遗漏的 volatile 和不一致的加锁。它不能替代人工评审,但能很便宜地抓住那些乏味的错误。
- 测试和工具。针对解析和状态逻辑的主机端单元测试,烧录、日志分析和测试报告的脚本。
- 文档和迁移。把代码和笔记整理成可读的文档,在相近平台之间移植,跨多个文件更新一个接口。
它会在哪里失败,怎么失败
- 硬件事实。寄存器名、位位置、地址、时钟树数值、引脚复用功能、时序数字。助手会给出看起来合理、但对你这颗具体芯片是错的内容。凡是没有对照参考手册或厂商头文件核对过的寄存器事实,一律不要接受。
- 芯片的怪癖。勘误、未写明的行为、外设真正需要的操作顺序。这些存在于被坑过的人的经验里,不在它训练过的文本里。
- 时序和并发。单线程下正确、有了中断就错的代码。竞态、优先级反转和内存序是它的弱项。
- 版本漂移。接口会在 SDK 和内核版本之间变化。助手可能按旧接口写,而你的版本里已经没有了,或者凭空编出一个。
- 资源限制。它会很乐意在只有几 KB RAM 的设备上分配一个大缓冲区,或者用一个装不下的库。
- 过度自信。它很少说"我不知道"。它说的是一段流畅的话。
工作流
- 把事实给它,而不是让它去回忆。粘贴或附上相关的数据手册页面、寄存器描述、厂商头文件和勘误说明。要求它对每个硬件论断引用页码或寄存器定义。没有出处的论断,就是猜测。
- 在仓库里放一份项目指南文件,让助手在开始时读它:芯片和版本、工具链和版本、编码约定、内存限制、中断上下文里禁用的接口,以及怎样构建、烧录和测试。把你第一天会告诉新工程师的规矩写下来。
- 让它一小步一小步地来。一次一个函数、一个驱动功能、一个测试,每一步都评审。幻觉出来的细节,就藏在没有评审的大改动里。
- 用硬件把闭环闭上。构建、烧录、运行、读日志,与预期对比。最有效的做法,是让助手自己也能做这件事:通过命令行烧录工具和它能读的串口控制台,去测试自己做的改动。从只读开始,并且任何能驱动硬件的东西,都要有人盯着。
- 能在主机上测的就在主机上测。解析器、协议、状态机和计算,都可以做成普通程序,一秒钟运行几千次。让助手先写这些测试,再写代码。
- 像评审任何改动一样评审差异,尤其是配置、中断和 DMA 代码,以及任何碰时钟、电源或内存布局的东西。
- 把原因记下来。当助手和硬件不一致、而硬件才是对的时候,把教训写进项目指南,让下一次会话从它开始。
安全与保密
- 能给设备发命令的助手,也能发出有害的命令。不要把它接到一条意外指令就会损坏设备或伤人的硬件上。
- 除非你跑的是本地模型,否则日志和源代码是会分享给模型提供商的。不要让助手看到密钥、令牌、客户数据和未发布的设计,并核对你的合同和提供商的条款里,哪些内容会被保留。
- 检查任何生成或导入内容的许可证。生成的代码并不免除你的许可证规则。
- 明确谁来负责。合并这次改动的工程师就是它的负责人,不论初稿是谁写的。
该有什么预期
对常规的固件工作,收益是真实的,主要来自省掉那些枯燥的事:脚手架、日志、测试、读不熟悉的代码。对于处在硬件边缘的工作,比如新板子的点亮、边缘状态的总线或电源问题,助手是一个飞快的记录员和假设生成器,而最终做决定的,仍然是实验台、示波器和握着探头的那个人的经验。受益最多的团队,是本来就有良好的构建、测试和评审习惯的团队,因为上面的工作流只是它们的一个更快的版本,而不是替代品。
我们为此做的工具
对于闭环里的日志和控制台部分,我们做了 xtell-serial,一个开源的串口调试助手,它的窗口可以由你的助手通过 Model Context Protocol 来驱动,这样你和助手读的是同一份日志。我们自己的实验台工作也在用 AI 助手,而我们的嵌入式软件和固件开发服务,是由检查硬件、而不只是检查生成代码的工程师交付的。