AI这波浪潮涌进嵌入式领域之后,圈子里聊得最多的就是“C++工程师会不会被替代”。我做了这么多年嵌入式,从裸机到RTOS再到嵌入式Linux,一路写C和C++过来,我的判断很明确:AI会给这个行业带来效率革命,但它替代不了软件工程师——尤其是那些真正理解硬件、懂系统、能设计架构的人。相反,AI让我更清醒地意识到一件事:我的价值不在写每一行代码,而在持续走在架构的路上。
这个标题不是喊口号,是我最近一年实际工作里的真实感受。AI辅助写代码、查文档、生成单元测试,这些能力确实强,强到有时候让我觉得“写代码”这个动作本身正在变得廉价。但恰恰因为如此,从需求到代码之间的那段鸿沟——怎么拆模块、怎么定接口、怎么选协议、怎么平衡实时性与扩展性——才是工程师真正的护城河。今天这篇文章,我想把我在这条路上看到的东西、踩过的坑,以及我对嵌入式架构的一些思考,原原本本分享出来。
1. AI进入嵌入式研发之后,到底改变了什么
1.1 先说结论:AI替代的是“打字”,不是“思考”
很多人一听到AI能写代码,第一反应是程序员要失业了。我得说,这种焦虑多半来自对嵌入式开发复杂度的低估。嵌入式项目里,代码好不好写是一回事,代码能不能跑、跑得稳不稳、功耗高不高、实时性达不达标,是另一回事。AI目前最强的地方在于给定明确上下文后的生成能力,但嵌入式开发的上下文恰恰是最难给定的——它藏在硬件手册里、芯片勘误表里、示波器的波形里、现场偶发的bug里。
我上个月做一个基于ARM Cortex-A7的平台适配,让AI帮我生成某个外设驱动的初始化代码。它输出的框架是漂亮的,注释齐全,风格规范,但一放到实际硬件上,中断处理函数的时序就是不满足要求。为什么?因为AI不理解我们的硬件设计里那个外设挂在了哪个总线域,也不理解我们的实时任务对中断延迟的容忍上限。它把“通用的C代码”写对了,但把“这个系统的C代码”写错了。
我给这种状态起个名字:AI是效率放大器,不是替代引擎。它放大的是你已经具备的思维能力。如果你清楚架构该怎么拆、约束在哪里、边界在哪里,AI能帮你把想法快速变成可编译的代码。如果你不清楚这些,AI只会把错误的想法更快地变成能编译的代码。编译通过离系统正确运行,隔着十万八千里。
1.2 AI工具在嵌入式日常研发中的实际用法
说几个我实际在用、且确实见效的AI使用场景,给还在观望的同学一个参考。
第一,芯片手册问答化。一个新芯片的参考手册动辄几千页,过去查一个寄存器配置要来回翻好几章,现在我可以把手册喂给AI工具,直接问“这个外设的DMA请求线接到哪个中断控制器”。注意,AI给的答案我不会直接信,但它的索引能力帮我节省了至少一半的查证时间。
第二,遗留代码解释。接手一个十年前的老项目是嵌入式工程师的家常便饭。那种祖传代码里充斥着让人抓狂的宏定义和全局变量,AI能做逐行解释、画调用关系,帮我快速锁定“这玩意儿到底在干什么”。这个场景下AI的价值非常大,因为它的解释不涉及时序正确性,只涉及语法和逻辑梳理,正好是AI的舒适区。
第三,单元测试与边界检查。让AI根据接口定义生成边界测试用例,比我手写要全面得多。尤其是枚举值、非法指针、缓冲区溢出这类场景,AI覆盖得很全。但生成完我会自己过一遍,剔除那些与硬件行为不符的用例——比如有些寄存器写入本身就有副作用,不能随意反复测试。
说实话,AI真正替代掉的是我过去花在“敲代码”上的时间,而不是花在“想代码”上的时间。省出来的时间,我全拿来思考架构问题了。这正好接上了我下面要聊的核心:架构,才是嵌入式研发里不可替代的部分。
2. 架构思维,才是嵌入式工程师的长期价值
2.1 从“实现功能”到“设计系统”的认知升级
大多数嵌入式工程师的职业起点是写驱动、调bug、解问题,这些能力都很重要。但如果不往上走一层,工作十年和三年没有本质区别——同样的套路,更快的速度。我见过太多C++写得飞起的同事,一到模块划分就没了主意,接口设计全凭感觉,最后系统耦合得像一团意大利面。
架构思维不是抽象的概念,它是一套非常具体的决策方式。简单说,就是你拿到一个需求之后,不是先想代码怎么写,而是先想这一堆功能要怎么拆成模块、模块之间怎么通信、每一层要承担什么职责、哪些东西必须隔离、哪些东西可以复用。这不是锦上添花,这是嵌入式系统品质的根基。
举个例子。一个典型的产品需求:设备需要采集传感器数据、做本地预处理、通过某种通信协议上传到网关、同时支持OTA升级、还要满足低功耗要求。如果只盯着实现,你很快就能写出一版能用的代码。但这一版代码会面临什么问题?传感器驱动换成新款,要改几处?通信协议从串口改成CAN,影响面多大?OTA升级和业务逻辑耦合在一起,升级失败怎么回滚?这些问题,都是实现阶段“看不见”的,但都是架构阶段必须想清楚的。
架构设计的本质是预判变化。你不可能预判所有变化,但你要在设计之初给“可能发生变化的点”留好位置。这就是我常跟团队说的:接口设计得好不好,不看现在,看半年后需求变的时候谁改起来想摔键盘。
2.2 嵌入式架构设计的四个核心考量
这些年做嵌入式Linux、做过RTOS低功耗系统、也做过裸机状态机,我总结出嵌入式架构设计必须优先考量的四件事。每个做嵌入式架构的人,都应该把这四点刻在脑子里。
一,资源边界。MCU的RAM以KB计,Flash以MB计,CPU主频几百MHz,这就是物理约束。架构设计必须在这些约束下展开。你不可能在Cortex-M0上跑一个复杂的应用层框架,就像你不可能在出租屋里开宴会——空间就那么大,设计必须适配场地。我见过一个项目,架构师照着Linux下的分层思想在MCU上堆了五层抽象,结果每一层调用都在消耗栈空间,最后系统跑起来就溢出。好的嵌入式架构,是对资源极度敏感的架构。
二,实时性保障。嵌入式系统里大量任务具有时间约束:中断响应要在多少微秒内完成,控制循环必须在多少毫秒内跑一次。架构设计时就要给这些实时任务规划好“专用通道”,不能允许低优先级任务阻塞它们。比如用队列解耦时,要评估队列操作的阻塞时间;用互斥锁保护共享资源时,要考虑优先级反转问题。这些细节不是代码层面的小事,是架构层面的生死大事。
三,可维护性。硬件产品的生命周期比互联网App长得多,一个产品可能卖五年、十年。架构好不好,直接影响产品生命周期内的维护成本。可维护性从哪儿来?模块职责单一、接口稳定、依赖方向清晰、配置集中管理。代码写得飘逸,维护的人想骂娘——这句话在嵌入式行业更加成立,因为一旦硬件定板,软件就要在有限的资源里持续演进,架构不给演进留余地,后面每一步都是坑。
四,可测试性。嵌入式系统天生难测试,因为依赖硬件环境。架构设计时要尽量把纯逻辑和硬件操作剥离开——协议解析不应该依赖具体的串口驱动,业务状态机不应该直接操作GPIO。剥离得越干净,能做的自动化测试就越多,出问题的概率也就越小。
这四个考量不是选择题,是每一个架构决策都要反复对照的标准。AI能帮你写代码,但它不会告诉你这个模块应该放在哪个抽象层、那个消息队列该用多深的缓冲、中断服务程序里哪些事绝对不能做。这些判断来自经验,来自对系统的整体理解——这就是架构师的价值。
3. 嵌入式通信架构的实战拆解
3.1 五种常用通信协议怎么选
“嵌入式 5种通信协议”这个热词最近討論度很高,我把嵌入式系统里最常用的几种通信协议拉出来,从架构视角聊聊它们各自的定位,以及选型时真正需要考虑的因素。
| 协议 | 典型场景 | 速率量级 | 架构设计关注点 |
|---|---|---|---|
| UART串口 | 调试、低速传感器、GPS模块 | 115.2kbps~几Mbps | 流控、缓冲设计、协议帧格式 |
| I2C | 板内传感器、EEPROM、RTC | 100kbps~3.4Mbps | 总线仲裁、设备地址管理、时序 |
| SPI | Flash、显示屏、高速ADC | 几十Mbps | 片选管理、DMA配合、时钟极性 |
| CAN | 车载、工业控制、设备互联 | 最高8Mbps(CAN FD) | 报文ID规划、优先级仲裁、实时性 |
| Ethernet/TCP-IP | 网关、上位机通信、远程运维 | 百兆/千兆 | 协议栈资源占用、并发连接、安全 |
这张表只能让你快速定位场景,真正落地时架构层面的考量远不止这些。以我在项目中常遇到的选型场景展开说。
板级通信优先I2C/SPI,关键看带宽与实时性。I2C只有两根线,接线简单,器件地址可配置,适合挂在同一总线上挂多个传感器的场景。但I2C没有硬件流控,速度上不去,而且主从模式下从机无法主动发起通信,做事件通知很别扭。SPI速率高、可全双工,但每个从机需要一根独立片选线,资源占用多。我的经验是:传感器多就I2C,要求高吞吐就SPI,拿不定主意就看器件支持什么协议。
CAN总线是工业嵌入式绕不开的选择。它解决了多节点可靠通信的核心痛点,尤其在噪声大、节点多的场景下,CAN总线的差分信号和仲裁机制非常可靠。但从架构角度讲,CAN最需要用心设计的是报文ID的规划——ID不只是地址,它直接决定总线仲裁优先级。我们曾经有过一个惨痛教训:将高频率低优先级的报文分配了低ID,结果高负载下紧急报警报文总被阻塞,差点酿成事故。报文ID规划必须先从系统层面定义优先级矩阵,再映射到标识符分配策略。
以太网/TCP-IP接入是嵌入式系统走向智能化的必经之路。但要注意,产品级嵌入式设备接入网络时,协议栈选型会影响整个软件架构:lwIP轻量但功能有限,复杂应用需要考虑性能和多播支持;Linux平台则用标准Socket接口,开发和调试都更顺畅。这一层的架构决策还要考虑异常处理——网络断线重连、数据缓存、远端的连接管理,都要有清晰的设计。
3.2 一个实际案例:设备通信架构的重构
我去年参与的一个项目,设备原本用串口透传和上位机通信,但随着产品升级,一个设备要同时对接多个平台,上报多种数据格式。原来的代码是直接在业务逻辑里处理串口收发,接口改了,整个应用层都跟着改。这明显是架构欠账。
我做的第一件事是引入一个独立的通信中间层,把协议解析、组帧、收发控制全部收拢到这一层,对上层暴露统一的数据接口。业务层不再关心数据是怎么传的——走串口也好,走以太网也好,对上层都是“发数据”,“收数据”。通信层内部再按实际物理通道拆分适配器模块:串口适配器、以太网适配器、将来可能的无线适配器。
这个改造做完,收益立竿见影。新的通信协议接入只需要新增一个适配器,写对应的解析和组帧逻辑,业务层一行不改。更关键的是,调试和测试变得容易了:通信中间层可以脱离硬件在PC上单独测试,用模拟数据源验证协议解析逻辑,回归效率提高了一倍不止。
这个案例说出来不新鲜,但它点透了架构的核心工作——识别变化方向,在变化点设置隔离层。AI帮不了这种决策,它需要你深刻理解业务走向、硬件能力、开发团队的技术栈,然后做一个面向未来的选择。
4. 从C++工程师到嵌入式架构师的成长路线
4.1 重新规划嵌入式学习路线
AI时代的信息获取变得太容易了,“嵌入式学习路线”这个搜索热词背后,其实藏着很多人的焦虑。我结合自己的成长经验,给出一条经过验证的路线,但我想先说清楚:学习路线的终点不是掌握某个具体工具,而是建立一套完整的系统认知。
第一阶段是扎实的语言和硬件基础。C语言必须熟练掌握到能理解指针与内存关系的程度,这是嵌入式开发的基本功。汇编不要求精通,但要能看懂反汇编,这能帮你搞清楚C代码在底层到底做了什么。C++对于嵌入式来说,重点在RAII、移动语义、constexpr这些现代特性上,因为嵌入式开发经常需要精确控制资源生命周期。
第二阶段是RTOS与系统编程。FreeRTOS或RT-Thread,掌握任务调度、信号量、消息队列,理解优先级与资源竞争的模型。这个阶段的核心收获,是建立起并发和时序的概念,体会“程序不是顺序执行的”到底是什么感觉。
第三阶段是嵌入式Linux。Linux是广阔的天地——进程/线程模型、内存管理、字符设备驱动框架、设备树、内核编译,每一块都需要花时间。这个阶段会极大提升你的系统抽象能力,让你看到一个复杂系统是如何通过分层协作组织起来的。
第四阶段是我最想强调的,从写代码走向做设计。参加一个完整的产品迭代,从需求分析到架构设计、任务分解、开发联调、测试维护,完整走一轮。这个过程中你会慢慢形成自己的架构判断力:哪些模块应该独立、接口应该设计成什么样、策略和机制怎么分离。
在这里我想给一个诚恳的提醒:网上流传的嵌入式八股文只是知识点的索引,能帮你过面试,不能帮你做系统。真正值钱的是你动手调过的硬件的数量、解过的bug的深度、以及对“为什么这个推不上架会有这个现象”的体感。
4.2 架构能力如何具体训练
架构能力一听起来很虚,但它完全可以通过刻意练习来提升。分享几个我自己用过、且带新人时验证过有效的方法。
第一,带着架构视角读代码。大多数人读源码是逐行理解逻辑,我建议换个方式:拿到一个开源项目(比如一个RTOS、一个通信协议栈),先不看具体实现,只看目录结构和头文件。用这些信息回答一个问题:这个系统有几个层次,每一层的作用是什么?接口之间的调用方向是怎么样的?之后再深入细节。这种读法训练的是从系统到局部的全局视野。
第二,做模块划分练习。接到任意一个小需求,都先在纸上画模块图:用哪些模块、模块之间怎么通信、接口长什么样、依赖关系怎么组织。不需要真的实现,就是画。画完之后和实际成熟方案对比,思考差距在哪里。这种练习做得多了,你的架构直觉会非常敏锐。
第三,做复盘文档。项目结束后,专门花半天时间写一份复盘——不是为了汇报,就是写给自己。当初架构决策的预期是什么?实际运行效果如何?哪里判断错了?如果重做一次,哪些地方会改。这是把项目经验沉淀成架构能力的关键动作,可惜绝大多数人都跳过了这个步骤,导致十年经验变成一次经验用了十次。
第四,善用AI作为架构教练。现在我也会让AI帮我做架构评审——把模块划分和接口定义描述给AI,让它从内聚耦合、扩展性、可测试性角度提意见。AI的建议有些泛泛,但偶尔会点出一个你忽略的边界条件,好用得很。它不是一个有经验的架构师,但作为一个第三视角的审查者,绰绰有余。
这些练习不需要大块时间,但需要日拱一卒的坚持。长期积累下来,你对系统的敏感度会远超同龄人。
5. AI辅助开发过程中的问题排查与避坑
5.1 AI生成代码的常见坑位
AI进入开发流程已经是不可逆的趋势,但如果你没有一套规避陷阱的方法论,它给你带来的麻烦可能比省下的时间还多。我整理了最近使用AI辅助嵌入式开发时遇到的典型问题,附带我的排查思路,给大家做参考。
问题一:AI生成的中断服务程序时序不合理。现象是设备偶发死机,频率不高,特别难复现。排查思路:检查ISR中是否存在耗时操作(比如printf、动态内存分配),这些在中断上下文是大忌。AI不会考虑你的上下文环境,它生成的统一风格代码可能把日志打印放进中断里。我的处理办法是:所有AI生成的中断相关代码,逐行审查,标记可能在中断上下文执行的每一个函数。
问题二:宏定义与类型定义冲突。AI在生成代码时,有时会“借鉴”大型开源项目的命名方式,比如定义一个通用的STATUS_OK宏,结果和你项目里已有定义冲突。编译期可能直接通过(同值宏定义不报错),但真运行起来行为可能是错的。排查思路:把AI生成的代码放进我们自己的代码规范检查工具里跑一遍。我强烈建议团队引入命名空间前缀和静态检查工具,这是成本最低的防御手段。
问题三:内存布局假设。嵌入式开发经常需要操作寄存器映射区、共享内存。AI生成的代码里如果有#define REG_BASE (volatile uint32_t*)0x40000000这类硬编码,你要非常小心。它是否对齐?是否与我们当前芯片的映射一致?排查思路:拿到任何AI生成的特殊地址指针代码,先与芯片手册对照确认,再在代码审查环节单独标记。
问题四:协议解析状态机考虑不周。让AI写一个数据帧解析函数,它很容易写出“假设数据总是完整且有序”的代码。但真实通信环境里,数据可能半包、粘包、错位、被干扰。这个问题我们在实际联调里遇到过,现象是对端设备偶发通信失败,但概率很低。排查思路:对AI生成的所有协议相关代码,单独导入一个模糊测试模块——故意发半包、错包、超长包,确保解析器能优雅处理异常输入。
这些问题背后有一个共同根源:AI生成代码的模式基于通用经验,但嵌入式系统运行在特定硬件和独一无二的环境里,通用性恰恰是它不适应嵌入式的原因。AI的使用原则应该是“生成+人类严格审查”,尤其是涉及中断、DMA、内存映射、并发访问的代码,不能有任何妥协。
5.2 架构层面的兜底设计:把AI的不可控关进笼子
通过上面的问题,你会发现单点防御还不够。更可靠的方式是在架构设计层面建立兜底机制,即使AI生成的代码质量不完美,系统依然可控。
我的做法是给整个系统建立一个分层的信任边界。最底层是硬件抽象层,这层代码我自己写、逐行Review、禁止AI参与生成;中间层是核心业务逻辑,AI生成的代码必须经过严格的单元测试和覆盖度验证;最上层是配置和胶水代码,AI可以大量参与,因为出错影响面可控,而且容易修改。
另外一个非常有用的兜底手段是运行时诊断机制。在固件里成本可控地加入一些诊断信息——模块心跳、关键路径耗时记录、异常上下文保存。这样即使AI生成的代码上线后出了问题,我们能快速定位到是哪个模块、哪段逻辑在什么条件下出错的。没有诊断手段的嵌入式系统,出了问题就只能盲猜,那才是真正的灾难。
6. AI时代架构师要重新掌握的技能组合
6.1 从纯编码到技术决策者
过去C++工程师的核心价值是“写出一段高效、健壮、可维护的代码”。到了AI时代,这个能力的门槛在降低——AI越来越擅长按照给定的模式写代码。那架构师的核心价值迁移到了哪里?迁移到了技术决策上。
比如,选择哪个嵌入式操作系统,用什么通信协议,是自研还是引入组件,模块边界划在哪里,技术债怎么权衡。这些决策决定了系统的上限,而且每一个都要综合技术、成本、团队能力、维护周期等多维信息。做决策的能力,才是架构师不可替代的支点。
我观察到一个趋势:AI越普及,纯执行性质的工作越不值钱,而判断性质的工作越发珍贵。具体到嵌入式领域就是——会“选择”要比会“实现”更值钱。同样的需求,A方案用裸机状态机,B方案上RTOS,C方案上嵌入式Linux,到底选哪个?这需要你掂量实时性需求、内存预算、开发周期、团队熟悉度。AI不会替你做权衡,它只会帮你把某一个方案更快地实现出来。
6.2 技术广度与系统抽象能力
AI时代做架构,还有两类技术敏感度必须培养——很多人容易忽视,但迟早会碰壁。
第一类是系统抽象能力。嵌入式设备常常不是一个孤岛,而是物联网系统的一个节点。作为架构师,你的视野要从芯片寄存器往上拔高到系统层次:板和板之间怎么通信,设备和网关怎么对接,网关和云平台怎么协同,数据从传感器到云端再回来,完整链路是什么样子。这种端到端视野是嵌入式架构师区别于普通嵌入式工程师的重要标志。我在做项目时经常提醒自己:我写的设备端固件,只是整个信息链路里的一段,设计时至少要为前后端留好协作接口。
第二类是分布式与大规模系统的触类旁通。“分布式架构”和“微服务架构”这些词虽然多出现在互联网后端语境,但它们所包含的思想——服务拆分、容错、可扩展、异步解耦——对嵌入式系统同样有启发。当一个嵌入式产品线上设备成千上万台,你就要在面对设备管理、升级、监控时思考类分布式的设计。有时候我会去读一些后端架构的文章,把其中适合的思维嫁接到嵌入式系统上,事实证明非常有效。
说到底,架构师不是只会嵌入式的人,而是能把嵌入式放进更大系统的全局视角中思考的人。
7. 写在最后:我为什么说架构路值得走
最后想聊一些更个人的看法。
在AI进入研发流程之后,我身边其实出现了两种截然不同的心态。一种是把AI当对手,整天焦虑“我是不是要被替代了”;另一种是把AI当玩具,写什么全扔给AI,自己慢慢丧失了动脑的习惯。我觉得这两种心态都不可取。
AI这波技术浪潮和以前引入新的IDE、新的调试器、新的版本管理工具没有本质区别。它让工程师从繁琐、重复、低创造性的劳动中释放出来,让创造力、判断力、系统思维成为更稀缺也更值钱的能力。换句话说,AI不是在替代工程师,它是在逼迫每个工程师往更高的层次走。
我自己选择的方向,就是标题写的那句话——持续走在架构的路上。这条路不是简单的技术路线,它要求的是一种长期的、系统化的思维方式:从具体代码中抬起头来,看见整个系统的全貌;把每一次技术选择都放到更长的时间维度和更大的空间维度里去权衡;对系统的运行机制保持敬畏和好奇,持续学习、持续校准自己的判断力。
如果你也是一个正在做嵌入式、用C++、被AI浪潮搅动得既兴奋又不安的工程师,我的建议很简单:别慌,把手上的模块做深,把头抬起来看远,把架构能力当成你长期投资的真正核心资产。
这条路不轻松,但走久了你会发现,它值得。在AI能写代码的时代,会思考系统的人反而更值钱了。本质上,这反而是我们这个行业回归理性的信号——真正稀缺的从来不是码字的能力,而是把复杂系统装进脑子、拆得开又合得上、并在各种约束下找到最优解的能力。
祝你我都能在这条路上走得更远。下次有好项目、好实践,我再来分享。