1. 为什么嵌入式开发需要一套“AI协同范式”
1.1 嵌入式开发的真实痛点:重复、繁琐、低效
做嵌入式开发的朋友应该都有这种感觉:每天真正花在“思考业务逻辑”上的时间,其实远没有花在“伺候硬件”上的时间多。拿到一颗新的MCU,先花两天翻数据手册,搞清楚时钟树怎么配、GPIO复用怎么设、串口波特率误差能不能接受;好不容易点亮了LED,又要在中断服务程序里小心翼翼地维护那些flag;等板子跑起来,bug定位又变成玄学——是局部变量被优化了?是volatile漏加了?还是堆栈溢出了?
这些工作本身不难,但极其琐碎,而且一旦工程规模上来,牵一发动全身。我统计过自己过去接手的几个项目:一个常规的物联网传感器节点,协议栈移植占30%的时间,驱动调试占30%,真正的业务状态机只占20%,剩下20%全在跟编译器和链接脚本较劲。这种比例在嵌入式行业非常普遍。
所以当AI编程工具开始遍地开花的时候,嵌入式工程师几乎是第一批冲上去试用的人。大家太想把这些脏活累活丢给AI了。但现实很快给了所有人一记闷棍:Copilot补全的代码看着像模像样,一编译全是未定义的类型;让AI写个“UART初始化”,它给你生成一段看起来很标准、实际上寄存器和芯片手册对不上的代码。很多人试了两天就放弃了,得出一个结论:“AI不适合嵌入式。”
我的观点正好相反:不是AI不行,是我们还停留在“让AI帮我写代码”的旧范式里,而嵌入式软件需要的是另一套玩法——面向AI协同的嵌入式软件开发范式。这篇文章就是系列的第二篇,专门聊聊这件事。
1.2 “拿来主义”为什么在嵌入式行业行不通
先看清楚一个对比。在后端开发里,AI编程落地为什么相对顺利?因为后端的核心逻辑高度拟合在代码本身:框架是通用的、依赖是声明式的、运行环境是标准化的。AI学过的海量代码里,有大量和你项目场景几乎一致的模式,照着写大概率能跑通。
嵌入式开发的约束完全不在一个维度上。你的代码跑在什么型号的MCU上,决定了一系列事情:寄存器地址是多少、中断优先级怎么编排、SRAM只有几KB还是几十KB、Flash里能不能塞下printf这类重型库。这些约束从头到尾没有一条是标准化的。同一份“读温度传感器”的代码,在STM32上是I2C外设寄存器操作,在ESP32上可能是抽象的driver层API,在国产某款Cortex-M0内核芯片上又完全是另一套野路子。
更麻烦的是,嵌入式软件的核心复杂度往往不在“代码文本”里,而在系统的状态关系、时序约束、资源预算和硬件行为之间。你给AI一个函数,它可以生成得漂漂亮亮;你给AI一个完整的嵌入式系统,它连全局状态都梳理不清。传统嵌入式项目里,这种系统认知分散在项目负责人的脑子里、数据手册的几百页里、老工程师的注释里,从来没有人把它结构化地整理出来。AI读不到,自然也就理解不了。
所以问题的根源很明确:嵌入式场景下,缺的不是能写代码的AI,而是一套能把“隐性的系统约束”显式地交给AI的方法。没有这套方法,AI的生成就是无源之水、无本之木。而这套方法,本质上就是我们说的“开发范式”。
2. 范式核心:从状态建模开始,让AI理解系统
2.1 状态机为什么是AI协同的“通用语言”
在嵌入式软件开发里,有一个老生常谈但被严重低估的技巧:状态机。很多工程师觉得状态机是“小题大做”——一个按键消抖而已,一个通信协议解析而已,哪有必要画那么多圈圈箭头?但如果你认真用状态机去表达过一个功能模块,你会发现它的价值远超“避免代码混乱”本身。
状态机是嵌入式系统里最接近“数学表达”的一种抽象。一个状态、一个事件、一个迁移动作,边界清清楚楚,没有任何歧义。红绿灯就是最典型的例子:红灯遇到“倒计时结束”事件迁移到绿灯;绿灯遇到“倒计时结束”事件迁移到黄灯;黄灯遇到“倒计时结束”事件迁移回红灯。这个描述不需要任何代码知识,任何一个工程师——哪怕是刚入行的实习生——都能理解。
更重要的是,这种确定性极强的表达方式恰好是AI最擅长处理的。大语言模型本质上是学习海量文本和代码中的模式,而状态机的迁移表、事件表是一种高度结构化的文本,AI读起来“阻力极小”。你给它一大段描述性的需求文档,它可能会漏掉某些隐含分支;但你给它一张完整的状态迁移表,它能基本无遗漏地把逻辑翻译成代码。
在我实践下来,状态机就是人与AI之间最可靠的“通用语言”——人对系统建模,把模型喂给AI,AI基于模型生成代码。人和AI各做自己擅长的事:人擅长理解业务意图、定义系统边界;AI擅长把明确的结构化逻辑翻译成高质量代码。
2.2 构建可喂给AI的状态模型:步骤拆解
既然状态机这么重要,那具体怎么构建一个“可以喂给AI”的状态模型?我这里给出一个标准流程,也是我自己在每个项目启动阶段必做的步骤。
第一步,把系统可能处于的所有稳定状态列出来。以最简单的物联网传感器节点为例,它就可能有这么几个状态:休眠、采样、发送、等待ACK、异常处理。这一阶段只关心“系统停在哪儿”,不关心“怎么从一个状态到另一个”。
第二步,定义触发状态迁移的事件。事件可能是内部定时器、外部中断、通信数据到达、或者一个函数调用。在传感器节点的例子里,事件包括:定时唤醒、采样完成、数据发送完成、收到ACK、超时。
第三步,也是核心的一步:建立状态迁移表。表格的每一行是一对“当前状态+事件”,每一列是“动作”和“下一个状态”。这一步要求你回答一个关键问题:在状态A遇到事件E时,系统到底该做什么、然后去哪里?很多模棱两可的bug,本质上是这一步没想清楚。
第四步,明确每个状态进入时执行的动作、退出时执行的动作、以及状态内部持续做的动作。嵌入式里典型的例子:进入sleep状态前要关外设、进低功耗模式;进入发送状态时要组帧、启动DMA传输;退出发送状态时检查发送结果。
第五步,识别非法迁移和兜底行为。不可能出现的事件组合是什么?比如在休眠状态下收到“采样完成”事件——这本身就是错误。这时候系统的行为应该是进入异常处理,而不是直接忽略。这类边界情况,AI是最容易漏的,因为如果模型里没写,它根本不知道“这里应该处理异常”。
这个过程可能只需要半天到一天的时间,但在整个项目周期里回报极高。最直观的收益是:当你要让AI帮你写某一模块的代码时,你不需要用大段描述性的文字去解释业务逻辑,只需要把状态表发给它,它的生成准确率会有一个质的飞跃。
2.3 状态表与事件表:把约束写清楚
很多工程师也会说:“我项目里也用了状态机。”但他们的状态机是写在代码里的:一个enum定义状态,一个switch-case处理迁移,仅此而已。这样做,状态之间的约束关系是隐式地散落在代码逻辑里的,AI看了代码也不一定能真正理解系统意图。
我推荐的做法是:把状态模型独立成一份文档,然后把它作为AI的核心上下文。更具体一点,建议用两张表来承载。
第一张是状态总表,用表格列出每个状态的编号、名称和描述。第二张是核心的状态迁移表,内容至少包括这几列:当前状态、触发事件、动作/输出、迁移目标、异常/优先级说明。我贴一个简化示例:
| 当前状态 | 事件 | 动作 | 下一个状态 |
|---|---|---|---|
| 休眠 | 定时唤醒 | 初始化ADC外设,启动采样 | 采样 |
| 采样 | 采样完成 | 读取数据,组帧,启动DMA发送 | 发送 |
| 采样 | 采样超时 | 记录错误计数,关闭外设 | 异常处理 |
| 发送 | 发送完成 | 启动接收窗口等待ACK | 等待ACK |
| 发送 | DMA错误 | 重新初始化DMA | 发送 |
| 等待ACK | 收到正确ACK | 组装睡眠参数,关闭外设 | 休眠 |
| 等待ACK | 超时(3次内) | 重新进入发送状态 | 发送 |
| 等待ACK | 超时(超过3次) | 上报错误码 | 异常处理 |
| 异常处理 | 错误已处理 | 重置相关外设和变量 | 休眠 |
这张表一旦写出来,系统的所有行为路径就是显式的了。AI拿到这张表,基本不需要再去猜“什么时候该干什么”。而且这张表本身就是最清晰的代码注释:人看表可以理解系统,AI看表可以生成代码,后续维护者看表可以快速定位逻辑问题。
有些读者可能会觉得这种建模方式太重了。但对于任何状态数超过5个、状态间迁移超过10条的模块,这点建模成本是必须付出的。我实测过,状态表建模后交给AI生成代码,生成结果的逻辑错误率比直接让它“写一个状态机”要低至少一个数量级。这个差距,只有在真实项目中用过的工程师才能体会到。
3. 可落地的AI协同工作流设计
3.1 阶段一:目标结构化——写嵌入式友好的Prompt
把状态模型构建好,只是第一步。接下来要解决的是:怎么把一件开发任务清晰无误地交给AI执行。这里最大的坑在于,很多嵌入式工程师把Prompt当“百度搜索框”来用——输入一句话“帮我写个DHT11驱动”,然后指望AI输出可以直接用的代码。结果大家都知道,十有八九不能直接用。
我总结了一套针对嵌入式场景的Prompt结构化模板,核心是把一个任务拆成六个维度:芯片型号与编译环境、外设与接口、协议规格、代码风格约束、资源限制、验收标准。我举个例子对比一下。
低质量的Prompt是:帮我写一个I2C读温湿度传感器的驱动(DHT12)。
高质量的做法是,给AI提供这样的信息:
请为STM32G030F6P6(Cortex-M0+内核,主频64MHz)编写DHT12温湿度传感器的I2C驱动。 硬件连接:SCL->PA8,SDA->PA9,MCU作为主机,400kHz速率。 编译环境:AC6编译器,C99标准。 要求: 1. 提供初始化函数DHT12_Init、读取温湿度函数DHT12_Read(返回温度和小数部分)。 2. 使用阻塞式I2C时序,不依赖RTOS。 3. 函数内部允许局部静态变量,不允许动态内存分配。 4. 通信失败时返回错误码,并保证总线释放。 5. 代码需要注释关键步骤的寄存器操作意图。 验收标准:编译无警告,I2C时序符合DHT12数据手册。对比一下你会发现,高质量Prompt的核心价值在于“消除歧义”。芯片型号决定了寄存器操作方式,编译环境决定了语法特性,资源限制决定了不允许malloc,错误处理要求决定了代码健壮性。这些约束每一个都会显著影响AI生成代码的质量。目标越结构化,AI的生成就越接近你想要的结果。
3.2 阶段二:代码生成与审查——AI写码,人管边界
当Prompt足够清晰之后,AI生成的代码质量会大幅提升,但这并不意味着可以直接信任它。嵌入式代码不像Web代码,出错了顶多报个500,板子上出错了可能就是设备重启、数据丢失,甚至是硬件损伤。所以AI协同工作流里,“代码审查”这一步绝对不能省。
我自己实测下来,有几个高效的生成策略。一是“先骨架后细节”:先让AI生成模块的框架结构——头文件里的类型定义、函数声明、全局变量的组织方式,确认骨架合理后,再逐个函数填充实现。这么做的好处是,如果架构方向错了,改起来成本很低;如果让AI一口气生成整个模块,你会发现大概率要返工。二是“一次只生成一个模块”,不要同时让AI生成多个文件的代码。嵌入式项目里文件间耦合很常见,AI在生成文件A的时候不知道文件B里有什么,容易产生接口不一致的问题。
代码生成完,人工审查要带着几个固定问题去看:
- 资源消耗:这个实现需要用多少RAM和Flash?是否超出目标MCU的预算?
- 中断安全:函数里有没有共享变量?有没有在中断里调用非可重入函数?
- 类型宽度:int是16位还是32位?uint8_t会不会溢出?位域在大小端下的行为是否正确?
- 状态覆盖:每个状态迁移都覆盖了吗?异常输入会导致死循环吗?
我的经验是,AI生成代码里有一类“看着对、实际错”的典型:它知道某个外设寄存器应该配置,但配置值的计算方式可能完全错误;或者它知道要用volatile,但不知道该在什么地方加。这类问题只有读过数据手册、理解硬件行为的工程师才能发现。所以在AI协同的范式里,工程师的定位不是“写代码的人”,而是“把控边界的人”。
3.3 阶段三:测试与验证——让AI自己找bug
很多人以为AI协同就止步于代码生成,但实际上AI在测试阶段能发挥的价值,甚至比写代码阶段更大。嵌入式软件的测试困难是出了名的:交叉编译、目标板环境、硬件依赖,样样都让人头疼。AI恰好可以帮我们缓解一部分压力。
第一个AI可以承担的任务是生成单元测试用例。不要小看这一步,很多嵌入式工程师根本没有单元测试的习惯,一个重要原因就是“不知道测什么”。AI可以从状态迁移表出发,自动罗列出边界条件、非法输入、极端情况下函数应该表现的行为。比如让AI针对上面的传感器节点状态机生成测试用例,它会基于状态迁移表自动补全那些“你可能压根没想到要测”的分支——比如在发送状态收到一个恶意的ACK帧。
AI能做的第二件事是“逆向审查”——把现有的代码发给AI,让它指出潜在的运行时问题。这里有一个小技巧:不要只让它“review这段代码”,而是给它一个具体的审查角度。比如让AI重点检查“哪些变量需要加volatile”“哪些地方可能存在中断与主循环的竞争条件”“哪些函数可能造成栈溢出”。按角度审查,比笼统的“帮我看看这段代码有没有问题”有效得多。
此外,在交叉编译和测试环境搭建上,AI也能当半个“配置助手”。你告诉它你的MCU型号、编译器版本、调试器的类型,它可以帮你生成CMake交叉编译配置、OpenOCD的调试脚本模板、甚至CI流水线里编译固件的步骤。这些配置工作本身是有套路可循的,AI在这方面比人类翻文档要高效得多。
3.4 阶段四:硬件联调——AI的用武之地与边界
硬件联调是嵌入式开发里最刺激也最痛苦的阶段。板子一上电,串口打印出一堆乱码;或者干脆没有任何输出——这个时候,工程师的处境就像是在一个完全黑暗的房间里找一枚掉在地板上的针。传统的排查方式是靠示波器、万用表、逻辑分析仪,加上大量的经验判断。
AI在联调阶段能做的最实际的一件事,是帮你“分析日志、缩小范围”。我自己有一个坚持了很久的习惯:把串口打印的日志完整地粘给AI,并附上相关的配置代码和现象描述,让AI输出一个“可能原因列表+验证方法”。你别说,效果出奇地好。比如有一次,一块板子的I2C通信总是间歇性失败,日志里能看到随机出现的NACK。我把日志和I2C初始化代码丢给AI,它给出的可能性列表里第二条就是“SCL/SDA上拉电阻值偏大,加上总线电容,导致上升沿过缓”。后来用示波器一量,果真是这么回事。如果让我自己从数据手册和时序图入手,可能要多花两三个小时。
但这里必须说清楚AI的边界。硬件联调中有一类问题,是AI的“知识盲区”——比如电源纹波异常、PCB布线导致的信号串扰、外部电磁干扰。这些问题的根源根本就不在代码里,AI再强也无从判断。更危险的是,AI有一种“明显又自信的错误”倾向:它可能会把问题归因到一个看似合理但实际上无关紧要的方向上,误导排查方向。所以我的原则是:AI可以帮你压缩排查范围,但它给出的结论必须用示波器、万用表去验证,不能“AI说是什么就是什么”。
4. 工具选型与提示词工程实操
4.1 嵌入式场景AI工具怎么选
这个系列的第一篇里,我详细聊过主流AI编程工具的对比,这里再针对嵌入式场景做一些补充。因为嵌入式开发的项目结构和普通软件开发有明显差异,工具选型也就有不一样的侧重点。
嵌入式项目的特点之一,是代码强依赖全局宏定义、寄存器结构体、头文件里的类型声明。这意味着AI工具如果不能“读取整个工作区”的内容,它生成代码的时候就会失去参照系——不知道ROT_PIN是哪个引脚、不知道uart_handle_t是什么类型、不知道typedef了什么样的结构体。所以我个人的经验是:纯补全式的AI插件(比如最基本的代码补全工具)在嵌入式场景的效果上限很低,它们只能根据当前文件上下文做预测,而嵌入式代码的正确性往往依赖跨文件的信息。
更推荐的是那些能“感知整个工程”的工具,比如Cline、Continue这类支持完整项目上下文加载的方案,它们可以扫描工作区里的关键头文件、宏定义、编译配置,然后生成和你的工程风格一致的代码。我自己目前的主力方案是:VS Code + Cline,配合Claude的模型来跑嵌入式代码生成。实测下来,模型推理能力越强,对长上下文的理解越好,在嵌入式这种“信息分散、约束复杂”的场景里,代码质量差距非常明显。
另外一个选型建议是:关注AI插件的“交叉编译感知”能力。有些工具能读取你工程里的CMakeLists.txt或者Makefile,从而意识到目标平台不是PC而是某个ARM Cortex-M内核。这种感知会让AI在生成代码时自动避开那些有明显平台依赖的写法。这类能力不是所有工具都具备,选型的时候值得留意。
4.2 几个实测好用的提示词模板
工具选好之后,决定AI协同效果的下一个关键因素就是提示词。这里我把自己在日常项目中反复使用、验证有效的几类提示词模板分享出来,都是可以直接抄作业的级别。
第一类是寄存器级驱动生成模板,专门用于“对照数据手册生成初始化代码”这类任务:
我正在开发一个基于{MCU型号}的项目,需要初始化{外设名称}。 硬件连接说明:{引脚/接口连接情况}。 通信参数:{速率、模式、帧格式等}。 这是我从芯片参考手册中摘录的关键寄存器说明: {寄存器名1}:{功能说明},{关键位域说明} {寄存器名2}:{功能说明},{关键位域说明} 请生成初始化代码和收发函数。 要求: 1. 代码风格参照Linux内核驱动风格 2. 注释里说明每个寄存器配置的意图 3. 禁止使用未定义的库函数,禁止使用超过芯片资源限制的功能第二类是状态机代码生成模板,这在我构建完状态表之后配合使用:
下面是我的模块状态迁移表: | 当前状态 | 事件 | 动作 | 下一个状态 | {这里粘贴你的状态表} 请基于这张表生成C语言状态机代码。 要求: 1. 使用函数指针表 + switch-case 混合的方式 2. 每个状态的处理逻辑放在独立函数中 3. 状态机的触发接口是 process_event(event_id) 4. 代码中明确标注每个迁移对应的状态表行号第三类是日志排查模板,在联调阶段非常实用:
下面是我系统中出现故障时的串口日志: {粘贴日志} 故障现象:{描述实际现象,越具体越好} 相关代码:{粘贴相关模块的代码} 请分步骤推断可能的原因,按可能性从高到低排序。 每一步推断需要给出理由和验证方法。 注意: - 先检查日志本身的特征,再做代码层面的推测 - 不要给出无法在嵌入式环境中验证的建议这些模板的共同点是:把所有AI需要的上下文信息显式地给全,把验收标准写清楚,把约束条件明确说明。做到这三件事,AI的输出质量基本就能稳定在可用的水平。
4.3 上下文管理的细节与坑
关于上下文管理,有一个很多嵌入式工程师第一次接触AI编程时容易踩的大坑:以为把整本数据手册PDF丢给AI,它就能“懂”这颗芯片。以当前主流模型的上下文窗口来说,几百页的数据手册确实能塞进去,但实际效果往往很糟糕。原因有两个:一是PDF扫描版的排版混乱,模型解析效果极差;二是整本手册塞进去之后,token占用巨大,反而挤占了关键代码和需求描述的权重,AI的输出质量会明显下降。
我更推荐的做法是“先抽取、再投喂”。在让AI生成具体代码之前,先自己花几分钟,从数据手册里把当前外设相关的关键信息摘录出来——寄存器名、地址、关键位域含义、时序要求。把这些整理成一段精简的“迷你数据手册”,再作为上下文交给AI。这一步看似多做了些工作,但AI的生成准确率会提升非常多。
还有一个实操细节:如果你用Cline这类工具,尽量把关键头文件、板级配置文件的路径加入到“常驻上下文”中。这样AI在生成代码时,会先查看这些文件里的类型定义和宏定义,避免生成那些跟你的工程规范对不上的代码。实测下来,把这个文件的路径写进系统提示词里,比让AI自己去猜要可靠得多。
5. 常见问题与避坑实录
5.1 AI生成嵌入式代码的翻车现场
再好的范式也会有翻车的时候,这些翻车现场恰恰是最有价值的经验。我在过去半年多的实践里,积累了不少AI在嵌入式代码上的“翻车案例”,挑几个典型的说说。
第一个案例是生成CRC校验模块。我让AI生成一个CRC-16/MODBUS查表法实现,它生成的代码逻辑结构完全正确,但那张256字节的查找表里,有几个关键值算错了。查表法CRC有个特点:表错了,正常数据算出来的结果可能是错的,也可能是对的,取决于数据路径是否覆盖到错误表项。结果就是我的通信协议在发特定字节序列时错误率极高,排查了很久才发现整张表默认是CRC-16/IBM的经典表,而不是MODBUS的变体。这个案例给我的教训是:涉及查表法、多项式计算、位操作这类算法性强的代码,AI生成的常量表必须逐个校验,不能想当然。
第二个案例是UART波特率配置。我给AI提供的芯片是STM32F103,让它配置115200-8-N-1。它生成的代码里,USART_BRR寄存器的计算值是按72MHz主频算的,但我的项目实际配置的是外部8MHz晶振、PLL倍频到36MHz——因为低功耗需求。结果波特率完全不对,串口通信全是乱码。这个案例说明一个核心问题:AI默认的“参考设计”是和你的实际工程配置无关的,它只会按照最常见的配置去填写数字。防止这类问题的方法很简单:在Prompt里明确写出“当前系统主频是XX MHz”,并让AI根据这个值重新计算分频系数。
第三个案例是中断嵌套。我让AI生成一个GPIO外部中断处理函数,它直接在中断回调里加了一个delay_ms延时。这在Cortex-M上本身没什么大问题,但我的中断优先级配置得比较高,延时期间其他中断全部被阻塞,导致通信超时。这种问题就是典型的“AI只关注单点功能、不关注全局时序”的体现。处理方式是:在代码审查阶段带着“这个函数会被谁调用?调用时处于什么上下文?”这样的问题去逐一审视。
5.2 编译过但运行不行的“隐形雷”
比“编译不过”更阴险的是“编译全通过、一跑就崩溃”。这一类问题在AI生成的嵌入式代码里尤其常见,因为AI在生成代码时,优先保证的是语法正确、结构完整,而运行时的硬件特性它考虑得远不够多。
我遇到的第一个高频问题是volatile缺失。AI生成的代码里,如果一个变量既在中断里被修改、又主循环里被读取,它十有八九不会自动在变量声明前面加volatile。编译器的优化级别一开,主循环里就可能永远读不到中断更新后的新值。这个问题的隐蔽性在于:不开优化的时候程序完全正常;开了-O2之后表现全看心情,时而正常时而不正常。
第二个高频问题是位操作被优化掉。比如AI生成类似REG &= ~(1 << 3);的语句,如果REG被定义为某个结构体指针的位域成员,而AI没有考虑它和该寄存器其他位域的相互作用,就可能在优化后产生非预期的读写序列。这类问题排查起来非常费时间,因为代码看起来完全正常。
第三个高频问题是数组越界。AI生成通信协议解析代码时,经常对接收缓冲区的边界判断不够严格。比如它检查了帧头的起始字节,却没有检查后续数据长度是否真的在缓冲区内。在PC上这类问题通常表现为运行时报错,但在嵌入式平台上往往表现为“随机重启”“内存被踩坏”“数据莫名其妙出错”等更难排查的现象。
针对这些“隐形雷”,我的防御策略依然是:把AI当成一个“能力很强但经验不足的实习生”,代码生成只是起点,审查、测试、边界验证才是让代码真正能用的关键步骤。在AI协同范式里,工程师的核心价值不是“写代码的手”,而是“把关的脑”。
5.3 排查效率提升的个人技巧
最后分享几个我在实际工作中总结的、显著提升AI协同效率的小技巧。这些技巧不是从哪本书上看来的,都是自己在项目里踩坑踩出来的。
第一个技巧是“问答式排查”而非“一次定论”。很多人遇到bug,喜欢把日志和代码一次性全丢给AI,然后让AI“给出最终原因”。但嵌入式问题的根源往往不止一个可能,AI在信息不完整的情况下给出的唯一结论,大概率是错误的。我自己的做法是:先让AI基于现象给出“按可能性排序的排查假设”,然后像和同事讨论问题一样,逐步追问AI“如果是这个问题,你会看到什么现象”“这个假设可以通过什么手段验证”。这种问答式的交互,能充分调动AI的推理能力,把排查范围一步步收敛。
第二个技巧是“让AI生成你自己的排查工具箱”。这是一个很有价值的用法:不要让AI直接帮你修bug,而是让AI帮你写一个诊断工具。比如我遇到I2C偶发失败的问题,会让AI生成一段“扫描总线上所有设备地址并报告结果”的测试代码;遇到堆栈溢出的疑惑,会让AI生成一段“统计当前最大栈使用深度”的调试代码。这些工具代码逻辑简单、模式固定,AI生成起来又快又好,但能帮你在实际定位问题上节省大量时间。
第三个技巧是“把硬件工程师的反馈翻译成AI能理解的技术描述”。很多时候,硬件工程师反馈的是“板上某处有点热”“波形上有毛刺”“在这里碰一下就会复位”这类现象性描述。直接把这些描述丢给AI,效果很差。我的做法是:自己先做一轮技术翻译,把“板上有点热”转化成“该区域可能存在持续大电流通路,可能是GPIO灌电流或电源负载过大”,然后把这个转化后的技术假设交给AI去展开分析。这样的协作模式,让AI真正成了团队里的一员,而不是一个外部的提问机器人。
这篇文章从为什么嵌入式需要AI协同范式讲起,聊了状态机建模这个核心方法,讲了Four阶段的工作流,给了工具选型和提示词实操建议,最后盘点了一堆我自己踩过的坑。对我个人来说,这一套范式跑通之后,最大的收获其实不是“写代码变快了”,而是我的系统设计能力变强了——因为状态建模会逼着我把每个状态、每个迁移、每个约束都想清楚,想不清楚的地方根本写不出状态表。这种“先想明白再做”的习惯,可能才是AI协同带给我最宝贵的东西。