
1. 当感觉流编程撞上寄存器一个嵌入式老兵的观察第一次听到Vibe Coding这个词我正蹲在实验室调一块STM32的I2C时序逻辑分析仪上波形死活对不上脑子里全是上拉电阻和时钟延展。当时朋友发来消息说现在流行跟着感觉写代码AI帮你补全你只管描述意图代码就出来了。我盯着屏幕愣了三秒第一反应是这玩意儿跟嵌入式有什么关系嵌入式开发里一个寄存器配错板子直接不亮哪来的感觉可言但后来我认真试了一段时间也看了不少同行在应用层开发里的实践想法变了。Vibe Coding不是让嵌入式工程师扔掉数据手册而是改变了我们和代码之间的交互方式——从逐行敲变成描述意图、审查结果、快速迭代。它在嵌入式Linux应用开发、Qt5界面、汽车电子上层逻辑这些场景里确实能省下大量重复劳动。可一旦下沉到驱动层、裸机时序、中断向量表它的边界就非常清晰了。这篇内容我想聊的不是Vibe Coding有多神而是一个干了十多年嵌入式的人怎么看待这套新工作流哪些环节能放心交给它哪些环节必须自己盯死以及应用层开发算不算嵌入式这个被热搜反复讨论的问题。适合正在做嵌入式Linux、Qt5、汽车电子或者刚入行被各种概念绕晕的朋友。我会把实操步骤、踩过的坑、以及我自己的判断标准都摊开讲尽量让你看完能直接上手试而不是只停留在概念层面。2. 先把概念掰开Vibe Coding到底改变了哪一环2.1 它不是什么黑魔法本质是意图到代码的压缩很多人把Vibe Coding理解成对着AI说句话代码就自动跑起来。这个理解在纯前端或者脚本场景里勉强成立但在嵌入式里会出大问题。我更愿意把它定义成用自然语言描述意图由AI生成候选代码人来负责验证和收敛。核心变化在于你不再从空白文件开始敲而是从一个差不多能用的草稿开始改。这个转变对嵌入式意味着什么举个例子你要写一个Linux下读取MPU6050的I2C应用传统流程是查设备节点、open、ioctl配置、read、解析。现在你可以直接描述用Linux i2c-dev接口读MPU6050的加速度寄存器输出三轴原始值AI会给你一份带错误处理的框架。你要做的是核对地址、核对寄存器、核对字节序。省掉的是查API和搭骨架的时间省不掉的是硬件相关的确认。注意AI生成的嵌入式代码最大的风险不是语法错而是看起来对但硬件行为不对。比如I2C地址写成了7位和8位混用编译能过板子就是没反应。2.2 为什么嵌入式对感觉流天然警惕软件工程里代码跑在通用CPU上错了大不了崩溃重启。嵌入式不一样代码直接跟物理世界打交道。PWM占空比写错电机可能烧看门狗喂错时机系统反复复位中断优先级配错实时性直接崩。这些后果不是重新部署一下能解决的可能要拆板子、换器件。所以嵌入式工程师对Vibe Coding的警惕是刻在职业习惯里的。但警惕不等于拒绝。我的做法是分层对待越靠近应用层、越靠近业务逻辑越可以放开用越靠近硬件、越靠近时序和寄存器越要自己掌控。这个分层思路后面会展开讲。2.3 热搜里那个问题应用层开发到底算不算嵌入式这个问题在热搜上被反复提我的答案很直接算但只是嵌入式的一部分而且是最软的那部分。嵌入式Linux应用开发、Qt5界面、汽车电子的上层诊断逻辑这些都属于嵌入式技术栈因为它们最终跑在资源受限的专用设备上要考虑交叉编译、要考虑启动时间、要考虑内存占用这些约束是通用应用开发没有的。但如果你只会写应用层完全不懂底层怎么起来的遇到问题就会卡死。比如Qt界面卡顿你以为是代码问题实际是内核调度或者DMA配置的问题。所以我的建议是应用层可以主攻但底层至少要能看懂、能排查。Vibe Coding在这个看懂环节其实很有用它可以帮你快速生成一段底层代码的注释和解释降低理解门槛。3. 嵌入式Linux应用开发Vibe Coding最能发力的战场3.1 从需求描述到可编译框架的完整流程嵌入式Linux应用开发是我认为Vibe Coding收益最高的场景。原因很简单这里大量使用标准POSIX接口、标准库、常见框架AI的训练数据覆盖充分生成的代码质量相对可靠。我拿一个真实需求走一遍读取温湿度传感器SHT30通过I2C每秒采集一次数据写入SQLite。第一步我会把需求拆成几个明确模块I2C通信、SHT30协议解析、定时采集、数据库写入。然后逐个让AI生成。比如I2C部分我描述Linux i2c-dev打开/dev/i2c-1SHT30地址0x44发送测量命令0x2C06延时后读6字节。AI给出的框架基本可用我只需要核对命令字和CRC校验。第二步交叉编译验证。这里有个关键点AI生成的代码默认是给x86 Linux的你要自己改成目标平台的交叉编译工具链。我通常先在PC上跑通逻辑再用arm-linux-gnueabihf-gcc编译到板子。这个过程中头文件路径、库依赖是最容易出问题的地方。# 典型的交叉编译命令注意sysroot和库路径 arm-linux-gnueabihf-gcc sht30_app.c -o sht30_app \ --sysroot/opt/toolchain/sysroot \ -lsqlite3 -lpthread第三步上板实测。这一步AI帮不了你必须自己看日志、看波形。我踩过的坑是AI生成的延时用了usleep但在某些内核配置下usleep精度不够导致读到的数据CRC一直错。后来改成nanosleep加轮询问题解决。这种细节只有实测才能发现。3.2 Qt5界面开发AI补全UI逻辑的甜区与雷区Qt5嵌入式开发是另一个Vibe Coding很舒服的场景。信号槽机制、布局管理、常用控件这些模式化程度高AI生成准确率不错。我做过一个车载中控的demo描述一个主界面顶部状态栏显示时间和信号中间三个功能按钮点击切换到不同页面AI给出的QStackedWidget加QButtonGroup结构基本可以直接用。甜区在于重复性的UI搭建、样式表编写、信号槽连接这些交给AI能省一半时间。比如QSS样式你描述深色主题按钮圆角悬停变色它生成的样式表改改就能用。雷区在于跨线程更新UI、资源释放、平台相关渲染。嵌入式Qt经常遇到性能问题AI生成的代码可能默认用了耗时的绘制方式。我遇到过一次界面滑动卡顿排查发现AI用了QGraphicsView的重绘策略不适合目标GPU。这种问题你得懂Qt的渲染机制才能改。还有一个实际经验嵌入式Qt的字体和图片资源要提前裁剪AI不会帮你考虑Flash空间。我一般会在AI生成后手动检查资源文件大小把不必要的字体和图标删掉。这个习惯帮我避免过好几次固件超大的尴尬。3.3 交叉编译与依赖管理AI最容易忽略的环节这是我要重点提醒的地方。AI生成代码时默认环境是标准Linux 完整依赖但嵌入式目标平台往往是裁剪过的。我见过太多人拿着AI生成的代码在PC上跑得好好的一交叉编译就报一堆找不到头文件的错。我的做法是建立一个目标平台约束清单每次让AI生成代码前先把约束告诉它目标架构、可用库、内核版本、根文件系统里有什么。比如我会明确说目标平台是ARMv7根文件系统只有busybox和基础libc没有systemd没有python。这样AI生成的代码会更贴近实际。依赖管理上我推荐用Buildroot或者Yocto来管理整个系统应用层用CMake组织。AI生成的CMakeLists.txt通常需要手动调整特别是交叉编译工具链的配置。下面是一个我常用的CMake交叉编译片段set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) set(CMAKE_FIND_ROOT_PATH /opt/toolchain/sysroot) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)提示每次AI生成涉及第三方库的代码先确认目标平台有没有这个库。没有的话要么自己交叉编译移植要么换方案。别等到上板才发现缺库。4. 汽车电子嵌入式Vibe Coding的合规红线与实用边界4.1 功能安全场景下AI生成代码为什么不能直接用汽车电子是我做得比较久的领域也是Vibe Coding最需要谨慎的地方。原因在于功能安全标准对代码有明确要求可追溯性、确定性、可验证性。AI生成的代码你很难说清楚它的每一行是怎么来的这在安全审计里是硬伤。我的原则是安全相关代码ASIL等级高的绝不直接用AI生成的结果但可以用AI做辅助理解、做测试用例生成、做文档整理。比如一个CAN报文解析逻辑我会自己写核心解析但让AI帮我生成边界测试用例覆盖各种异常报文。这样既保证了核心代码的可控性又利用了AI的效率。还有一个实际问题是代码风格一致性。汽车电子项目通常有严格的编码规范比如MISRA CAI生成的代码往往不符合。我一般会配置一个静态检查工具把AI生成的代码过一遍把违规项改掉。这个过程虽然麻烦但比后期审计被打回要好。4.2 用AI生成测试用例和诊断逻辑性价比很高虽然核心代码要自己写但汽车电子里大量重复性的工作可以交给AI。比如UDS诊断服务的请求响应处理模式非常固定AI生成准确率很高。我做过一个项目把22服务读数据和2E服务写数据的框架交给AI生成自己只补充DID映射和权限校验效率提升明显。测试用例生成是另一个甜区。你描述生成CAN报文解析的单元测试覆盖正常报文、长度错误、校验和错误、超时AI能给出比较完整的测试框架。我通常会把生成的测试跑一遍看覆盖率再补充AI没想到的边界情况。4.3 和底层驱动打交道时AI的幻觉最危险汽车电子里经常要碰CAN控制器、LIN、FlexRay这些底层驱动。这些领域AI的训练数据相对少而且不同芯片厂商的寄存器定义差异巨大AI很容易编出一个看起来合理但实际不存在的寄存器配置。我踩过一次坑让AI生成一段CAN控制器的初始化代码它给出的寄存器地址和位定义跟目标芯片手册对不上。如果我没核对直接烧进去轻则CAN不通重则影响总线。从那以后凡是涉及寄存器的代码我一律以芯片手册为准AI生成的只当参考逐位核对。注意AI在底层驱动领域的幻觉率明显高于应用层。判断标准很简单——如果这段代码涉及具体寄存器地址、位域、时序参数必须查手册确认不能信AI。5. 裸机与RTOS开发为什么这里感觉流基本失效5.1 时序、中断、寄存器三个AI很难替你负责的领域裸机和RTOS开发是Vibe Coding的禁区至少目前是这样。原因有三个时序要求精确到纳秒级、中断上下文有严格约束、寄存器操作直接决定硬件行为。这三点AI都无法可靠保证。时序方面比如软件模拟SPI时钟高低电平持续时间、建立保持时间这些要根据从机器件手册来算。AI生成的延时循环在不同主频、不同优化等级下实际延时完全不同。你不实测根本不知道对不对。中断方面中断服务程序里不能做阻塞操作、不能调用某些RTOS API、要尽量短。AI生成的代码经常忽略这些约束在中断里加printf或者malloc这在实时系统里是致命的。寄存器方面前面说过了AI容易编造不存在的位定义。裸机开发里一个寄存器配错可能整个外设都不工作而且现象往往很隐蔽。5.2 那AI在底层开发里就完全没用吗也不是。我的用法是用AI做代码解释、做框架生成、做调试辅助但核心逻辑自己写。比如拿到一段厂商提供的晦涩驱动代码让AI逐行解释理解起来快很多。或者让AI生成一个RTOS任务的基本框架自己再填充业务逻辑。还有一个实用场景调试。遇到HardFault把寄存器状态和调用栈贴给AI让它分析可能的原因往往能给出几个排查方向。虽然不一定准但能帮你打开思路。我遇到过几次AI提示检查栈溢出一查果然是任务栈给小了。5.3 一个真实的踩坑AI生成的延时函数差点让我误判硬件说个具体的。有次调一个单总线器件时序要求很严。我图省事让AI生成了一段微秒级延时函数。代码看起来没问题for循环空转。但实测发现器件时好时坏。我一开始怀疑硬件换了器件、换了板子问题依旧。后来用示波器量延时发现实际延时比预期长了近一倍。原因是编译器优化等级变了空循环被优化实际执行时间跟预期不符。AI生成的延时函数没有考虑编译优化和主频差异。最后我改用硬件定时器做延时问题解决。这个坑让我记住底层延时永远不要信软件循环用硬件定时器或者DWT计数器。6. 我实际在用的Vibe Coding工作流从描述到上板的完整链路6.1 需求拆解把感觉翻译成AI能懂的约束Vibe Coding用得好不好关键在需求拆解。我的习惯是拿到一个需求先拆成硬件相关和逻辑相关两部分。硬件相关的自己把控逻辑相关的交给AI。然后给AI的描述里必须包含约束条件目标平台、可用资源、性能要求、编码规范。举个例子需求是做一个数据采集网关采集4路串口数据汇总后通过网口上传。我会这样拆串口配置和读取硬件相关自己写核心、数据缓冲和协议封装逻辑相关AI生成、网络发送逻辑相关AI生成、主循环调度自己设计。给AI的描述会明确4路串口波特率115200数据帧格式自定义缓冲区大小4KB用select做多路复用。6.2 生成、审查、实测三步不能省AI生成代码后我固定走三步。第一步审查看逻辑对不对、看有没有硬件相关的硬编码、看错误处理全不全。第二步PC验证能在PC上跑的逻辑先在PC上跑通。第三步上板实测交叉编译、烧录、看日志、看波形。这三步里审查最容易被跳过也最容易出问题。我见过有人直接拿AI代码上板结果因为一个字节序问题调了一整天。审查时我重点关注数据类型特别是跨平台时的int长度、字节序、边界条件、资源释放。6.3 版本管理AI生成的代码也要进Git但commit要写清楚这点很重要。AI生成的代码也是代码必须进版本管理。但我的习惯是commit message里明确标注哪些是AI生成、哪些是手写、改了哪些地方。这样做的好处是后期出问题回溯时能快速定位是AI的问题还是自己的问题。我一般会这样写commitfeat: 添加SHT30采集模块AI生成框架手动修正CRC校验和延时。这样一看就知道这段代码的来源和修改点。团队协作时这个习惯能省很多沟通成本。7. 那些AI不会告诉你的嵌入式实操心得7.1 关于工具链AI默认的环境和你的环境可能差很远AI生成代码时默认你用gcc、用标准库、用最新内核。但嵌入式现场往往是老版本工具链、裁剪过的库、定制内核。我建议在项目开始前把工具链版本、内核版本、库版本整理成一个文档每次让AI生成代码时贴给它。这个习惯能显著减少编译错误。还有个小技巧如果AI生成的代码用了某个你用不了的库别急着放弃让它用标准C重写不依赖第三方库。很多时候AI能给出替代方案。7.2 关于调试AI能帮你分析日志但别让它替你下结论调试是嵌入式的日常。我的用法是把日志、寄存器状态、现象描述给AI让它给排查方向。但最终结论必须自己验证。AI有时候会给出看似合理但实际错误的方向如果你盲信会浪费更多时间。比如有次串口收不到数据AI分析说可能是波特率不匹配。我查了波特率没问题后来发现是引脚复用没配置。AI不知道你的具体硬件连接它的分析只能当参考。7.3 关于学习用AI解释底层代码比啃手册快对手册和厂商代码AI的解释能力其实很有价值。一段复杂的时钟树配置让AI逐行解释比你自己啃寄存器手册快得多。但解释完要对照手册验证因为AI可能解释错。我的学习路径是先让AI解释整体逻辑再对照手册看关键寄存器最后自己动手改一改验证理解。这个循环走几遍底层知识就扎实了。8. 回到那个问题嵌入式工程师该怎么和Vibe Coding共处我的结论是把Vibe Coding当成一个能力很强但不懂硬件的助手。它擅长模式化的、逻辑性的、有大量先例的工作它不擅长硬件相关的、时序敏感的、需要精确控制的工作。你的价值在于知道什么时候用它、什么时候不用它以及用它之后怎么验证。应用层开发可以大胆用效率提升肉眼可见。底层开发谨慎用核心逻辑自己写。汽车电子等安全相关场景用它的辅助能力不用它的生成结果。这个分层策略是我试下来最稳的。至于应用层算不算嵌入式我的看法是别纠结标签。能把产品做出来、能解决问题就是本事。Vibe Coding降低了应用层的门槛但底层的能力依然是护城河。两者结合才是这个时代嵌入式工程师的竞争力。最后分享一个我最近的小习惯每次用AI生成完代码我会问自己一句如果这段代码出问题我知道去哪查吗。如果答案是不知道那这段代码我就不敢用。这个自检帮我避开了不少潜在的坑。