news 2026/9/30 1:18:35

嵌入式开发中的Vibe Coding:边界、实践与AI辅助工作流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式开发中的Vibe Coding:边界、实践与AI辅助工作流

1. 当“感觉流”编程撞上寄存器:一个嵌入式老兵的观察

“Vibe Coding”这个词最近在圈子里出现的频率越来越高。第一次听到的时候,我正在调一块STM32的I2C时序,逻辑分析仪上的波形死活对不上,脑子里全是上拉电阻和时钟延展的问题。有人跟我说,现在流行“跟着感觉写代码”,把需求描述清楚,让AI把代码生成出来,跑通就行,不用太纠结底层细节。我当时的第一反应是:这套东西放到嵌入式领域,怕是要出大事。

但冷静下来想了几天,又动手试了几轮之后,我的看法有了变化。Vibe Coding不是洪水猛兽,它也不是万能灵药。它更像是一把电动螺丝刀——拧机箱螺丝确实快,但你拿它去拧M2的沉头螺丝,扭矩一大就把螺纹拧滑了。嵌入式开发这个领域,恰好就是那种“螺丝规格特别多、扭矩要求特别细”的场景。

这篇文章想聊的,就是一个干了十多年嵌入式的人,在Vibe Coding这波浪潮里实际踩过的坑、试出来的有效路径,以及我对“哪些环节可以交给感觉流、哪些环节必须回到寄存器手册”这件事的思考。不管你是刚入行的嵌入式新人,还是做了几年应用层想往底层走的开发者,或者是对AI辅助编程好奇但不敢在硬件项目里用的老手,下面这些内容应该都能给你一些参考。

2. Vibe Coding在嵌入式场景下的真实边界

2.1 为什么“跑通就行”在嵌入式里经常不成立

应用层开发里,代码跑通了基本就完事了。接口返回200,页面渲染正常,业务逻辑对得上,上线。但嵌入式不一样。嵌入式系统有一个非常残酷的特点:代码跑通和系统可靠之间,隔着一条巨大的鸿沟。

我举个例子。你用Vibe Coding的方式让AI生成一段STM32的GPIO初始化代码,编译烧录,LED亮了。看起来没问题。但你可能没注意到,AI生成的代码里把GPIO速度配置成了最高档,而你的板子上这根线走线很长,高速翻转带来了振铃,短期内看不出问题,批量生产之后EMI测试直接挂掉。又比如,AI给你生成了一段I2C读取传感器的代码,逻辑上完全正确,但它没有处理总线锁死的情况——一旦从设备在传输中途掉电,SCL被拉低,整个I2C总线就挂了,你的系统看门狗如果不喂,直接死机。

这些问题的共同点是:它们不会在“跑通”的那一刻暴露出来。它们会在高温老化测试的第72小时出现,会在电磁兼容实验室里出现,会在客户现场连续运行三个月之后出现。Vibe Coding的“快速迭代、跑通即可”的哲学,和嵌入式系统对确定性的要求,在根子上是有张力的。

2.2 哪些嵌入式环节适合“感觉流”,哪些绝对不行

我自己的划分标准是这样的:

环节是否适合Vibe Coding原因
应用层业务逻辑非常适合纯软件逻辑,AI生成质量高,测试反馈快
通信协议解析比较适合有明确规范,AI能生成结构化代码,但需人工校验边界
驱动框架搭建部分适合初始化流程可生成,但时序和寄存器配置需人工确认
中断服务程序谨慎使用对实时性要求极高,AI容易忽略优先级和嵌套问题
底层寄存器操作不建议每个芯片手册不同,AI幻觉风险极高
硬件时序控制绝对不行纳秒级时序,必须对照手册逐位确认
低功耗管理不建议涉及多模块协同,AI很难理解全局功耗状态机
Bootloader谨慎使用涉及Flash操作和跳转,出错直接变砖

这张表不是拍脑袋来的。我拿一个真实的项目做过对照实验:用Vibe Coding的方式让AI生成一个基于FreeRTOS的温度采集任务,包括队列通信、看门狗喂狗、异常上报。生成出来的代码框架确实能用,任务创建、队列收发这些模板化的东西写得比我手敲快得多。但问题出在细节上——AI把看门狗的喂狗操作放在了任务循环的末尾,而这个任务在等待队列的时候是阻塞的,如果队列一直没数据,任务就卡在阻塞态,看门狗超时直接复位。这个bug在功能测试阶段完全看不出来,因为测试的时候队列一直有数据。

所以我的结论是:Vibe Coding在嵌入式领域的价值,不在于替代底层开发,而在于加速上层逻辑和框架代码的产出。你得清楚哪些代码是“业务逻辑”,哪些代码是“和硬件打交道”,然后把前者交给AI,后者自己盯着。

2.3 一个让我改变看法的实际案例

说一个让我对Vibe Coding态度转变的案例。去年我做一个工业网关项目,需要在Linux上跑一个Modbus RTU转MQTT的服务。这个服务的核心逻辑是:从串口读Modbus帧,解析后打包成JSON,通过MQTT发出去。同时要支持配置热加载、断线重连、数据缓存。

如果按传统方式写,光是Modbus协议解析和MQTT客户端封装就得花两三天。我试着用Vibe Coding的方式,把需求拆成几个模块,让AI分别生成:Modbus帧解析函数、MQTT发布封装、环形缓冲区实现、配置文件解析。生成出来的代码质量出乎意料地好——Modbus的CRC校验、功能码处理、异常响应都写对了,MQTT的QoS处理和重连逻辑也基本可用。

我花了半天时间做代码审查和边界测试,改了几个地方:一个是环形缓冲区的溢出处理,AI写的版本在缓冲区满的时候直接丢弃新数据,我改成了覆盖最旧数据;另一个是串口读取的超时处理,AI用的阻塞读,我改成了带超时的select。改完之后,整个服务跑了一周的压力测试,没出问题。

这个案例让我意识到,Vibe Coding在嵌入式Linux应用层开发中,确实能显著提升效率。关键在于你要有能力判断AI生成的代码哪里可能有问题,并且知道怎么验证。

3. 从寄存器手册到AI提示词:嵌入式开发工作流的重构

3.1 传统嵌入式开发流程的瓶颈在哪里

传统的嵌入式开发流程大概是这样的:看芯片手册,理解外设工作原理,配置寄存器,写驱动,测试,调试,再测试。这个流程里最耗时的环节往往不是写代码本身,而是理解手册和调试硬件。

我统计过自己过去几个项目的工时分布:读手册和查寄存器定义占30%,写代码占25%,调试和测试占35%,剩下10%是文档和沟通。也就是说,真正“写代码”的时间只有四分之一。Vibe Coding能压缩的是写代码那25%里的重复劳动部分,但它压缩不了读手册和调试的时间——甚至可能增加调试时间,如果AI生成的代码引入了隐蔽的bug。

所以工作流重构的核心思路不是“让AI写更多代码”,而是让AI帮你更快地理解手册、生成测试用例、分析调试数据。这三个方向才是嵌入式开发者真正应该用AI提效的地方。

3.2 我现在的嵌入式项目工作流拆解

经过几个项目的磨合,我现在的工作流大致是这样的:

第一阶段:需求拆解和架构设计(人工为主)

这个阶段AI基本帮不上忙,因为嵌入式项目的架构设计高度依赖硬件选型、成本约束、实时性要求、功耗预算这些因素。我会自己画框图,确定任务划分和通信机制。但我会用AI做一件事:让它帮我列出某个架构方案可能的风险点。比如我告诉它“我要用STM32F4跑FreeRTOS,三个任务通过队列通信,其中一个任务要操作SD卡”,它会提醒我SD卡操作可能阻塞任务、队列深度需要根据最坏情况估算、栈空间要留足。这些提醒不一定全对,但能帮我查漏补缺。

第二阶段:驱动和底层代码(人工为主,AI辅助查错)

这个阶段我基本自己写,但会用AI做代码审查。比如我写完一段SPI驱动,会把代码贴给AI,问它“这段SPI配置有没有问题”。它有时候能发现我忽略的地方,比如CPOL和CPHA的配置和从设备手册不匹配、时钟分频系数算错、DMA通道和别的外设冲突。但前提是我得把从设备的手册关键页也贴给它,否则它只能基于通用知识判断。

第三阶段:应用层逻辑(AI为主,人工审查)

这是Vibe Coding发挥最大价值的环节。我会把业务逻辑用自然语言描述清楚,包括输入输出、异常处理、边界条件,让AI生成代码。生成之后我重点审查几个地方:内存分配是否合理、是否有死循环风险、错误处理是否完整、是否有竞态条件。

第四阶段:测试和调试(AI辅助分析)

这个阶段我会用AI帮我生成测试用例,特别是边界测试和异常注入测试。比如我告诉它“这是一个Modbus解析函数,帮我生成测试用例,覆盖功能码异常、CRC错误、长度异常、超时等情况”,它能生成一套比较完整的测试向量。调试的时候,我会把逻辑分析仪抓到的波形描述给AI,让它帮我分析可能的时序问题。

3.3 提示词怎么写才能让AI生成可用的嵌入式代码

这是我这几个月摸索出来的经验。给AI写嵌入式相关的提示词,和写应用层提示词完全不一样。应用层你可以说“帮我写一个用户登录接口”,AI就能给你一个像样的东西。但嵌入式不行,你得把约束条件说清楚。

我总结了一个模板,基本上包含这几个要素:

硬件平台:[具体型号,如STM32F407VGT6] 外设配置:[用到了哪些外设,如SPI1、DMA2、GPIOE] 软件框架:[裸机/FreeRTOS/Linux,如FreeRTOS 10.4.3] 功能描述:[要做什么,如通过SPI1读取ADXL345加速度数据] 约束条件:[实时性要求、内存限制、功耗要求] 异常处理:[需要处理哪些异常情况] 输出要求:[代码风格、注释语言、是否需要单元测试]

举个例子,我实际用过的提示词:

硬件平台:STM32F407VGT6,主频168MHz 外设配置:SPI1,SCK=PA5,MISO=PA6,MOSI=PA7,CS=PE3 软件框架:FreeRTOS 10.4.3,任务栈大小1024字 功能描述:通过SPI1以1MHz时钟读取ADXL345三轴加速度数据, 每10ms读取一次,数据通过队列发送给处理任务 约束条件:SPI传输不能阻塞超过100us,队列深度8 异常处理:SPI超时返回错误码,连续3次错误上报故障 输出要求:C99标准,寄存器操作使用HAL库,注释用中文

这样写出来的提示词,AI生成的代码可用度会高很多。但即便如此,我仍然会逐行审查SPI的初始化配置和DMA设置,因为这两个地方AI最容易出错。

4. 嵌入式Linux与RTOS场景下的Vibe Coding实操

4.1 Linux驱动开发中AI能帮到什么程度

嵌入式Linux驱动开发是很多人的痛点。字符设备驱动、平台设备驱动、设备树配置、内核模块编译——这一套东西入门门槛不低。我试过用Vibe Coding的方式让AI生成一个简单的GPIO字符设备驱动,包括file_operations结构体、open/release/read/write实现、设备树匹配表。

生成出来的代码框架是对的,但有几个典型问题:

第一,AI生成的代码里用了copy_to_user和copy_from_user,但没检查返回值。在内核空间,用户空间指针可能无效,不检查返回值直接操作会导致内核崩溃。第二,AI没有处理并发访问,多个进程同时打开设备时会有竞态条件。第三,设备树节点的compatible字符串和驱动里的匹配表对不上,导致probe函数根本不被调用。

这三个问题都是嵌入式Linux驱动开发的经典坑,AI踩进去一点都不意外。但好消息是,框架代码确实省了我不少时间。我只需要在AI生成的骨架上补上错误处理、并发控制和设备树配置,比从零开始写快得多。

我的建议是:用AI生成驱动框架,但必须自己补全错误处理、并发控制、资源管理这三块。这三块是驱动稳定性的核心,AI目前还理解不了内核空间的这些约束。

4.2 FreeRTOS任务设计:AI容易忽略的优先级反转和栈溢出

FreeRTOS的任务设计看起来简单,实际上有很多微妙的地方。我让AI生成过一个“三个任务通过队列通信”的示例,代码逻辑没问题,但有几个隐患:

  • 任务优先级设置不合理,高优先级任务等待低优先级任务持有的互斥量,导致优先级反转
  • 栈大小估算不足,AI按默认值给了128字,实际运行中深度递归调用直接栈溢出
  • 队列深度没有根据最坏情况计算,突发数据来的时候队列满,数据丢失

这些问题在功能测试阶段很难发现,因为测试环境的负载远低于实际运行环境。我的做法是:AI生成任务框架之后,用FreeRTOS自带的水位线API检查每个任务的实际栈使用量,然后留50%余量。队列深度按“最坏情况下1秒内最大数据量”来算,而不是拍脑袋给个值。

4.3 用AI辅助调试:从逻辑分析仪波形到问题定位

调试是嵌入式开发中最耗时的环节。我最近发现AI在这个环节能帮上大忙。具体做法是:把逻辑分析仪抓到的波形用文字描述出来,让AI帮我分析可能的时序问题。

比如有一次我调一个SPI通信,从设备偶尔返回错误数据。我把波形描述给AI:“SPI模式0,时钟1MHz,CS拉低后第一个时钟沿数据建立时间约50ns,从设备手册要求最小20ns。但在连续传输时,每帧之间CS拉高时间只有100ns,从设备手册要求最小500ns。”AI很快就指出问题:CS拉高时间不足,从设备没有足够时间完成内部状态复位。

这种问题如果靠人工翻手册,可能要花半天。但把关键参数描述给AI,它几秒钟就能给出方向。当然,最终确认还是得自己对照手册和实测波形。

5. 那些AI不会告诉你的嵌入式暗坑

5.1 编译器优化带来的“灵异事件”

嵌入式开发里有一类bug特别恶心:代码在Debug模式下跑得好好的,切到Release模式就出问题。这类问题十有八九和编译器优化有关。AI生成的代码往往不会考虑这些,因为它不知道你的编译器选项和硬件特性。

我踩过的一个典型坑:AI生成了一段等待标志位的循环,变量没有加volatile修饰。Debug模式下编译器不优化,每次循环都从内存读变量,没问题。Release模式下编译器把变量缓存到寄存器里,循环变成死循环。这个问题AI不会主动提醒你,因为它不知道这段代码会被优化。

类似的还有:中断服务程序和主程序共享的变量必须加volatile;编译器可能会重排内存访问顺序,需要用内存屏障;某些编译器对未对齐访问的处理方式不同。这些都需要你自己有意识地去检查。

5.2 硬件勘误手册里那些AI不可能知道的事

每个芯片都有勘误手册(Errata Sheet),里面记录了芯片设计上的已知问题。这些问题在数据手册里不会写,但实际使用中会碰到。比如某个型号的STM32在特定条件下DMA和SPI同时使用会丢数据,某个型号的GD32在低功耗模式下RTC唤醒会延迟,某个型号的NXP芯片在高温下ADC精度下降。

AI的训练数据里可能有这些勘误信息,但它不会主动告诉你。你必须在项目开始前自己查阅勘误手册,把和自己用到的外设相关的条目列出来,逐条确认是否影响你的设计。这个工作AI替代不了。

5.3 电磁兼容和温度漂移:实验室里测不出来的问题

Vibe Coding的快速迭代哲学,和电磁兼容测试的慢节奏是矛盾的。EMC测试要跑暗室,要测辐射发射、传导发射、静电抗扰度、浪涌抗扰度,一轮下来少则几天多则几周。AI生成的代码如果引入了高速开关信号、不合理的时钟配置、缺少滤波处理,这些问题在实验室的功能测试中完全看不出来,但EMC测试直接挂掉。

温度漂移也是类似。AI生成的ADC采样代码可能没有考虑温度对基准电压的影响,没有做温度补偿。在常温下精度够用,到了高温或低温环境,采样值直接偏出规格。

我的经验是:涉及模拟信号采集、高速数字接口、电源管理的代码,不要完全交给AI生成。这些地方对硬件特性依赖太强,AI的通用知识覆盖不了。

6. 嵌入式开发者在新范式下的能力锚点

6.1 哪些能力在贬值,哪些在升值

Vibe Coding这波浪潮里,嵌入式开发者的一些能力确实在贬值。比如:记住某个外设的寄存器地址、手写标准的外设初始化代码、背诵通信协议的帧格式。这些知识AI都有,而且比你记得准。

但另一些能力在升值:

  • 硬件调试能力:示波器、逻辑分析仪、频谱仪的使用,这些AI替代不了
  • 系统架构能力:怎么划分任务、怎么分配资源、怎么设计容错,这些需要工程判断
  • 手册解读能力:从几百页的芯片手册里快速找到关键信息,理解时序图和状态机
  • 边界思维:知道什么地方容易出问题,知道怎么设计测试用例覆盖边界
  • 跨领域知识:懂一点射频、懂一点电源、懂一点机械,这些在系统级问题定位时非常关键

简单说,AI替代的是“知道怎么做”的能力,替代不了“知道为什么这样做”和“知道哪里会出问题”的能力。

6.2 我给自己团队定的AI使用规范

我带过几个嵌入式团队,今年开始推行AI辅助开发。我定的规矩是这样的:

第一,底层驱动代码可以AI生成,但必须经过至少一轮人工审查,重点看时序配置、错误处理、并发控制。第二,应用层代码可以AI为主,但必须有单元测试覆盖,测试用例也要AI生成,人工补充边界用例。第三,涉及安全相关的代码(看门狗、故障处理、OTA升级)必须人工编写,AI只能做代码审查。第四,所有AI生成的代码必须标注来源,方便追溯问题。

这套规矩运行了几个月,效果还不错。开发效率大概提升了30%左右,主要是应用层代码和测试用例的生成省了时间。但底层调试的时间没有明显减少,因为硬件问题AI帮不上忙。

6.3 给不同阶段嵌入式开发者的建议

如果你是刚入行的嵌入式新人,我的建议是:不要跳过底层直接依赖AI。你得先自己写过GPIO驱动、自己调过I2C时序、自己看过逻辑分析仪波形,才能判断AI生成的代码对不对。Vibe Coding可以帮你更快地完成项目,但不能帮你建立对硬件的直觉。

如果你是有几年经验的应用层开发者想往底层走,AI可以帮你快速理解驱动框架和内核机制。让AI解释一段驱动代码、生成一个简单的字符设备驱动、分析一个内核oops信息,这些都是很好的学习方式。但最终你还是得自己动手调硬件。

如果你是资深嵌入式工程师,AI最大的价值是帮你从重复劳动中解放出来,让你有更多时间做架构设计和疑难问题攻关。但你要承担起代码审查的责任,因为AI生成的代码最终是你签字负责的。

7. 我现在的真实做法

说了这么多,最后分享一下我现在的真实工作状态。我并没有完全拥抱Vibe Coding,也没有完全排斥它。我的做法是:把AI当成一个知识面很广但经验不足的助手。

它知道很多我不知道的API和库,能快速生成模板代码,能帮我查漏补缺。但它不知道我的板子上那根SPI线走了多长、不知道我的电源纹波有多大、不知道我的客户现场环境温度有多高。这些只有我知道。

所以我的工作流是:AI生成,我审查;AI建议,我判断;AI加速,我把关。该看手册的时候看手册,该调波形的时候调波形,该做EMC测试的时候做EMC测试。Vibe Coding让我写代码更快了,但没有让我变懒——反而让我有更多时间去做那些AI做不了的事情。

如果你也在嵌入式领域尝试Vibe Coding,我的建议就一句话:让AI帮你写代码,但别让AI替你做决定。硬件不会骗人,寄存器不会骗人,逻辑分析仪上的波形不会骗人。这些才是嵌入式开发的根基。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 1:18:13

KVM虚拟机直挂物理硬盘分区:从virtio-blk配置到权限与迁移实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:18:00

Jupyter Notebook安装指南:Python环境、conda配置与常见问题排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:17:38

C语言内存四区详解:栈、堆、全局区、代码区原理与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:17:38

企业AI大模型数字底座设计方案与落地避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 1:17:04

从原生到 Promise:手写一个实用的 Ajax 封装指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华