资讯动态

嵌入式开发中的Vibe Coding:应用层可Vibe,驱动层需谨慎

发布时间:2026/9/29 22:49:50 来源:尧图企业网站定制
1. 当“感觉流”编程撞上寄存器一场关于效率与掌控的博弈“Vibe Coding”这个词最近在圈子里出现的频率越来越高大概意思就是跟着感觉走用自然语言描述意图让AI把代码补全开发者只负责把握大方向细节交给模型去“意会”。这种模式在应用层开发里确实很爽写个React组件、搭个CRUD接口甚至搞个爬虫脚本对着AI说几句代码就哗啦啦出来了。但如果你把同样的思路搬到嵌入式开发里尤其是那种资源受限、时序敏感、硬件行为诡异的场景事情就变得微妙起来了。我做了十多年嵌入式从8位机裸奔到LinuxQt5的复杂HMI都趟过。最近半年我也在尝试把Vibe Coding的一些习惯引入到日常开发中踩了不少坑也尝到了甜头。这篇文章不打算给你一个“行”或“不行”的结论而是想把我观察到的现象、实践中的取舍、以及那些AI不会告诉你的硬件潜规则掰开揉碎了聊一聊。如果你正在做嵌入式Linux应用开发、汽车电子或者单纯对“AI能不能帮我写驱动”这件事好奇那接下来的内容应该能帮你省下不少调试时间。嵌入式开发和纯软件最大的区别在于你的代码最终要跟物理世界打交道。一个GPIO翻转的时序错了可能电机就烧了一个I2C时钟拉伸没处理好传感器数据就全是0xFF。Vibe Coding那种“大概对就行”的哲学在这里很容易变成“大概炸就行”。但反过来如果你把AI当成一个记忆力超强、从不抱怨的实习生让它帮你处理那些重复性的、有固定模式的代码比如生成寄存器配置表、解析数据手册、写测试桩那效率提升是实打实的。所以我的核心观点是Vibe Coding在嵌入式领域不是能不能用的问题而是用在哪一层、怎么用、以及你作为工程师的底线在哪里。应用层可以Vibe驱动层要谨慎硬件抽象层最好自己动手。下面我会从几个具体维度展开包括工具选型、实操流程、常见坑点以及我个人的一些“土办法”。2. 拆解Vibe Coding在嵌入式语境下的真实含义2.1 从“写代码”到“描述意图”的转变传统嵌入式开发里你脑子里想的是“我要把PA6引脚拉高延时10微秒再拉低”手上写的是HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); delay_us(10); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);。Vibe Coding的思路是你直接跟AI说“帮我生成一个STM32的GPIO脉冲函数引脚PA6高电平持续10微秒用DWT做延时。”AI会给你一段代码可能还贴心地加了注释和错误处理。这个转变的本质是抽象层级的提升。你不再关心具体的寄存器操作而是描述行为。这在应用层开发里很常见比如你让AI“写一个登录页面带表单验证”它就能生成。但在嵌入式里问题在于行为描述和硬件行为之间往往存在鸿沟。你说“延时10微秒”AI给你用了HAL_Delay但那是毫秒级的而且依赖SysTick中断在中断上下文里直接卡死。这种“意图正确实现错误”的情况是Vibe Coding在嵌入式里最大的风险来源。2.2 为什么嵌入式工程师对Vibe Coding又爱又恨爱的是效率。我试过用AI生成一个Modbus RTU的从机协议栈框架包括CRC校验、寄存器映射、异常响应大概花了15分钟调试就能跑通。如果手写至少半天。恨的是不可控。同样的提示词AI可能这次给你用查表法算CRC下次给你用位移法再下次给你调用一个根本不存在的库函数。在资源受限的MCU上查表法占Flash位移法占CPU你得根据实际情况选但AI不会告诉你这些。还有一个更深层的原因嵌入式开发的知识壁垒很高但AI的训练数据里高质量的嵌入式代码占比很低。大部分开源代码是应用层的驱动层的代码往往和具体芯片强相关网上能找到的示例质量参差不齐。AI学了一堆“能跑但不够优雅”的代码生成出来的东西自然也是那个水平。所以你不能指望AI写出比你更懂硬件的代码它只能帮你写你本来就会写、但懒得写的代码。2.3 应用层开发是不是嵌入式这个问题的答案决定了你的Vibe策略热搜词里有个很有意思的问题“应用层开发是不是嵌入式”这个问题其实是在问我写Qt界面、写Python脚本处理传感器数据算不算嵌入式开发我的答案是算但属于嵌入式里的“上层建筑”。这部分工作确实可以大量使用Vibe Coding因为它的运行环境相对宽松有操作系统兜底内存和CPU没那么紧张出错了大不了重启进程。但如果你写的是BSP、驱动、RTOS任务调度、中断服务程序那Vibe Coding的适用性就急剧下降。我个人的划分标准是代码是否直接操作硬件寄存器、是否对时序有硬性要求、是否在中断上下文运行。如果三个都是“是”那最好自己写如果都是“否”那放心交给AI。3. 实操把Vibe Coding嵌入到嵌入式开发流程的四个切入点3.1 切入点一用AI生成寄存器配置和初始化代码这是我最推荐的Vibe Coding应用场景。芯片的数据手册动辄上千页寄存器几百个初始化序列又臭又长。以前我得对着手册一个个查现在我可以直接把手册里相关章节的文本贴给AI然后说“根据这段描述生成STM32F4的SPI1初始化代码主机模式时钟极性低相位第一边沿波特率预分频到4MHz数据宽度8位MSB先行。”AI生成的代码通常结构完整但有几个地方必须人工核对时钟使能顺序、引脚复用配置、以及中断优先级分组。我遇到过AI生成的代码里先配置了SPI参数再使能时钟结果寄存器写不进去。这种错误很隐蔽因为代码编译没问题运行起来就是没反应。所以我的习惯是AI生成后对照参考手册的“初始化流程”章节逐行检查重点看时钟和复位的顺序。提示给AI的数据手册文本最好是英文原版中文翻译版有时候会丢失关键细节。另外把芯片型号写清楚比如“STM32F407ZGT6”比“STM32F4”更准确。3.2 切入点二协议栈和状态机的骨架生成嵌入式开发里经常要写各种协议解析比如UART自定义帧、CAN报文处理、Modbus、MQTT。这些协议的结构都很固定非常适合让AI生成骨架。我通常会把协议格式用表格列出来然后让AI生成解析函数和状态机。举个例子我最近做一个汽车电子的项目需要解析一种自定义的CAN报文数据场8字节第一个字节是命令字第二个字节是长度后面是负载最后两个字节是CRC16。我把这个格式描述给AI它生成了一个状态机包括等待帧头、接收长度、接收负载、校验CRC四个状态。代码框架没问题但CRC16的多项式它默认用了CCITT而实际协议用的是IBM。这个细节如果我不说AI就按最常见的来。所以协议里的“非标准”参数一定要在提示词里明确写出来。3.3 切入点三单元测试和Mock函数的自动生成嵌入式代码难测试这是公认的。但如果你把硬件相关的部分抽象成接口就可以用AI生成Mock函数和单元测试。比如我有一个hal_i2c_read函数我让AI生成一个Mock版本可以模拟返回各种数据包括超时、NACK、数据错误。然后让AI生成测试用例覆盖正常读取、设备无响应、数据校验失败等场景。这个做法在Linux应用开发里很常见但在MCU开发里用的人不多。我试过在STM32项目里用Unity测试框架配合AI生成的Mock确实能在不接硬件的情况下跑通大部分逻辑。关键是要把硬件访问层隔离出来用函数指针或者弱符号实现可替换。这个架构设计本身就需要经验AI可以帮你写测试代码但架构得你自己定。3.4 切入点四文档生成和代码注释补全嵌入式代码的注释率普遍偏低尤其是寄存器操作部分。我现在的习惯是写完一个驱动后让AI根据代码生成注释和文档。比如我写了一个I2C温度传感器的驱动我把代码贴给AI说“给每个函数加上Doxygen风格的注释说明参数、返回值和注意事项。”AI生成的注释质量还不错至少比我团队里某些新人写得好。但要注意AI可能会“脑补”一些不存在的功能。比如我的代码里没有处理传感器掉线的情况AI在注释里写“本函数在传感器无响应时返回错误码”这就属于幻觉。所以注释生成后必须逐条核对确保描述和代码行为一致。4. 嵌入式Vibe Coding的避坑指南与实战经验4.1 时序敏感代码AI的“大概”和硬件的“必须”嵌入式开发里最要命的就是时序。I2C的建立时间、保持时间SPI的时钟相位单总线的复位脉冲这些都有严格的纳秒级要求。AI生成的代码往往用HAL_Delay或者空循环来凑但HAL_Delay的精度受中断影响空循环的周期受编译优化影响。我试过让AI生成一个DS18B20的复位脉冲它给了一个delay_us(480)但我的delay_us实现是基于SysTick的在中断里调用会死锁。我的做法是时序相关的代码AI可以生成框架但具体的延时实现必须自己写并且用示波器或者逻辑分析仪验证。我通常会写一个基于DWTData Watchpoint and Trace的微秒延时函数不依赖中断精度在几个时钟周期以内。这个函数我会让AI帮我生成但生成后我会用示波器测一下实际波形确认脉宽符合手册要求。注意不同编译器的优化等级会影响空循环的周期。-O0和-O3下同样的循环次数延时可能差十倍。所以不要依赖空循环做精确延时除非你用volatile修饰循环变量并且实测过。4.2 内存和堆栈AI不知道你的RAM只有20KB嵌入式系统里内存是稀缺资源。AI生成的代码往往默认你有无限的内存动不动就malloc或者定义一个巨大的局部数组。我见过AI生成的JSON解析代码在栈上开了4KB的缓冲区而我的MCU总共只有20KB RAM栈只有1KB。这种代码跑起来就是HardFault。我的经验是在提示词里明确告诉AI你的资源限制。比如“我的MCU只有20KB RAM栈大小1KB不要用动态内存分配所有缓冲区用静态数组大小不超过256字节。”这样AI生成的代码会收敛很多。另外生成后要用arm-none-eabi-size或者编译器的map文件检查一下内存占用特别是栈的使用情况可以用-fstack-usage编译选项生成每个函数的栈消耗。4.3 中断上下文AI最容易翻车的地方中断服务程序ISR里不能调用阻塞函数、不能使用非可重入函数、不能长时间占用CPU。但AI生成的代码经常在ISR里调用printf、malloc、甚至HAL_Delay。我试过让AI生成一个UART接收中断的处理函数它直接在ISR里解析协议并调用了一个可能阻塞的发送函数。这在实时性要求高的系统里是致命的。我的做法是ISR只做最少的操作比如把数据存入环形缓冲区然后设置一个标志位让主循环去处理。这个模式我会明确写在提示词里“生成一个UART中断处理函数只负责把接收到的字节存入环形缓冲区不要做任何解析或阻塞操作。”AI能理解这个要求生成的代码基本可用。但环形缓冲区的实现我建议自己写或者用经过验证的库因为AI写的环形缓冲区在边界条件下容易出错。4.4 工具链和编译选项AI的盲区嵌入式开发用的工具链五花八门GCC ARM、IAR、Keil、Clang每个的编译选项和扩展都不一样。AI生成的代码可能用了GCC的__attribute__但你在IAR里编译就报错。或者AI用了C99的特性但你的项目强制C89。这些细节AI不会主动问你得在提示词里说清楚。我通常会在项目开始时把工具链信息、C标准版本、编译选项写在一个“项目上下文”文档里每次让AI生成代码时把这段上下文一起贴进去。比如“使用GCC ARM 10.3C11标准编译选项-O2 -Wall -Wextra目标芯片STM32F407。”这样AI生成的代码兼容性会好很多。5. 常见问题速查与排查技巧实录5.1 AI生成的代码编译通过但运行异常怎么查这是最常见的问题。我的排查顺序是先看时钟再看引脚再看时序最后看中断。时钟没使能外设寄存器写不进去引脚复用没配置信号出不来时序不对通信失败中断优先级冲突程序跑飞。我整理了一个速查表放在下面。现象可能原因排查方法外设无响应时钟未使能检查RCC寄存器或__HAL_RCC_XXX_CLK_ENABLE()引脚无输出GPIO模式错误检查MODER、OTYPER、OSPEEDR配置通信数据错时序参数不对用逻辑分析仪抓波形对照手册程序卡死中断优先级冲突检查NVIC优先级分组和抢占优先级数据偶尔错未处理并发检查中断和主循环的共享变量是否加volatileHardFault栈溢出或空指针检查栈使用用HardFault_Handler打印LR和PC5.2 如何让AI生成更符合嵌入式规范的代码我的经验是提示词要具体、具体、再具体。不要只说“生成一个I2C驱动”要说“生成一个STM32F4的I2C1驱动主机模式标准模式100kHz7位地址使用中断方式发送超时时间10ms错误处理包括NACK和总线错误。”另外给AI一个代码风格示例比如“参考以下代码风格函数名用蛇形命名寄存器操作直接用指针不用HAL库。”AI会模仿你给的风格。还有一个技巧让AI先解释再写代码。我会说“先解释你打算怎么实现包括用哪些寄存器、中断怎么处理、错误怎么恢复然后再写代码。”这样我能在代码生成前就发现逻辑问题避免生成一大堆需要重构的代码。5.3 哪些嵌入式场景绝对不要用Vibe Coding根据我的经验以下几类代码最好自己写启动文件、链接脚本、中断向量表、时钟树配置、电源管理、安全关键功能如看门狗、刹车控制。这些代码要么和硬件强相关要么出错后果严重AI的“大概对”在这里不可接受。另外如果项目有功能安全认证要求如ISO 26262那所有代码都需要可追溯、可验证AI生成的代码很难满足认证要求。提示即使是用AI生成的代码也要当作“别人的代码”来审查。不要因为是自己让AI写的就放松警惕。我见过太多人直接复制AI代码连编译警告都不看最后出了问题查半天。5.4 嵌入式Linux应用开发中Vibe Coding的边界在哪里Linux应用开发和MCU开发不同有操作系统兜底Vibe Coding的适用范围更广。比如用Qt写界面你可以让AI生成布局代码、信号槽连接、甚至样式表。用Python处理传感器数据AI可以帮你写pandas分析脚本。但涉及内核驱动、设备树、实时补丁PREEMPT_RT的部分还是要谨慎。我最近在做一个LinuxQt5的嵌入式项目界面部分大量使用了AI生成效率提升很明显。但设备树配置和GPIO驱动我还是自己写的。因为设备树的语法虽然简单但和具体硬件的对应关系很容易搞错AI生成的设备树节点可能引脚号不对、时钟频率不对这些错误在系统启动时才会暴露调试成本很高。6. 我个人的一些“土办法”和心得6.1 建立自己的代码片段库让AI学习你的风格AI生成代码的质量很大程度上取决于你给它的上下文。我花了点时间把自己常用的驱动框架、工具函数、错误处理模式整理成一个代码片段库每次让AI生成新代码时把相关的片段一起贴进去。比如我要生成一个SPI驱动我会把之前写好的I2C驱动贴给AI说“参考这个风格写SPI驱动”。这样生成的代码风格统一后期维护也方便。这个片段库不需要很大我目前积累了大概20个文件覆盖GPIO、UART、I2C、SPI、定时器、中断管理、环形缓冲区、状态机框架。每个文件都有详细的注释说明设计意图和使用场景。AI看了这些例子后生成的代码明显更“懂我”。6.2 用AI做代码审查而不是代码生成有时候让AI审查代码比让它生成代码更有价值。我会把自己写的驱动代码贴给AI说“审查这段代码找出潜在的并发问题、内存问题和时序问题。”AI有时候能发现我忽略的细节比如某个变量在中断和主循环里都访问了但没加volatile或者某个函数在中断上下文里调用了非可重入函数。当然AI的审查意见不能全信它可能会误报。但作为一个“第二双眼睛”它确实能帮我发现一些低级错误。我通常会把AI的审查意见过一遍确认有问题的就改不确定的就查手册或者实测。6.3 保持对硬件的敬畏AI只是工具最后想说一点体会。Vibe Coding也好AI辅助也好本质上都是工具。工具能放大你的能力但不能替代你的判断。嵌入式开发的核心竞争力永远是对硬件的理解、对系统的把控、对细节的执着。AI可以帮你写代码但不能帮你选型、不能帮你调试硬件、不能帮你做架构决策。我见过一些新人过度依赖AI遇到问题就重新生成代码而不是去查手册、看波形、分析寄存器。这样下去能力很难提升。我的建议是把AI当成一个加速器而不是拐杖。该自己写的代码自己写该自己调的硬件自己调。AI省下来的时间用来学习新的芯片、新的协议、新的架构这才是正循环。这个领域变化很快新的芯片、新的工具、新的方法层出不穷。但底层的东西——时序、中断、内存、并发——这些不会变。把这些基础打牢再用AI提效你就能在Vibe Coding的时代里既享受效率的红利又保持对系统的掌控。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑