嵌入式工程师八年经验:从单片机到嵌入式AI的完整路线与行业真相
2026/9/8 3:42:34 网站建设 项目流程

1. 先说个背景:我为什么在干满八年后决定离开

干了八年嵌入式,从单片机裸机开发一路做到带Linux的SoC平台,去年年底我提了离职。离职那天没有拍桌子,也没有发朋友圈宣泄,就是安安静静把代码注释补完、把GitLab上的文档归档,然后收拾工位走人。很多人问我是不是找到了更好的下家,其实不是。真正原因更朴素——我想把这么多年在这个行业里看到、学到、踩过坑的东西,以一个不卖课、不拉群、不蹭流量的身份,说点大实话。

嵌入式这个圈子很有意思。外面的人挤破头想进来,觉得会写C语言、能调个驱动就是“硬核技术人”;里面的人却频繁自嘲,说自己是“写代码里最懂硬件的,搞硬件里最会写代码的,但工资永远是互联网同行的三分之二”。这种撕裂感不是一两天形成的,而是整个行业的技术栈深度、岗位边界、成长路径共同决定的。

这篇文章没有什么宏大架构,也不打算重复那些教科书里有的内容。我只想从实际出发,聊几个大部分嵌入式工程师迟早都会撞上的问题:技术路线到底怎么选,面试八股文到底怎么背,项目经验到底怎么攒,以及最关键的——嵌入式这个方向,到底值不值得一个新人把职业生涯押上去。如果你刚入行,或者正在校招/跳槽的边缘反复横跳,这篇文章应该能帮你省下不少弯路。

2. 行业大实话:嵌入式工程师到底在做什么

2.1 你以为的嵌入式 vs 实际的嵌入式

先泼一盆冷水。很多人在学校或者培训班看到的嵌入式,是一块板子、一颗芯片、一堆杜邦线,写几行点灯代码,然后看着串口输出“Hello World”,觉得这就是嵌入式。等你真正进了公司,你会发现日常陪伴你的不是乐趣,而是数据手册、勘误表、逻辑分析仪和不靠谱的供应商FAE。

真实的嵌入式开发分两种大方向:一种是偏底层的,写启动代码、移植内核、调驱动、做功耗优化,天天和寄存器、中断、内存映射打交道;另一种是偏应用的,在Linux或RTOS之上写业务逻辑,处理网络协议、图形界面、文件系统,偶尔也要下探到驱动层去排查问题。两者的技能树有交集,但侧重点完全不同。

更现实的是,很多公司所谓的“嵌入式岗位”其实是万金油。今天让你看一个I2C设备为什么读不到数据,明天让你评估一颗新Sensor的中断频率,后天可能要你去帮硬件同事核对原理图。这种工作强度下,如果你脑子里没有一个完整的技术地图,很容易陷入“天天救火、但说不出自己核心竞争力是什么”的状态。

2.2 单片机、Linux、嵌入式AI到底怎么选

这是被问得最多的一个问题。我直接给结论:如果目的只是尽快入行拿offer,单片机方向一定是门槛最低的。C语言基础加一款主流MCU(比如STM32),再加一两个能讲清楚的项目,中小型公司基本能进。但单片机的天花板也来得很快,当产品复杂度上升到需要操作系统、需要网络协议栈、需要多进程调度时,单片机那套裸机思维就不够用了。

Linux方向则完全是另一个量级。你不仅要会C,还要理解进程、线程、内存管理、文件系统、设备模型这些操作系统概念。面试时十有八九会被问到“Linux内核里某个子系统是怎么工作的”这类问题。这个方向的学习曲线陡,但对应的岗位价值也高,尤其是做车机、工业控制、AIoT网关的公司,愿意为懂Linux的嵌入式工程师开更高的薪水。

嵌入式AI则是这两年的新热点。热搜里那个“宠物检测AI模型——嵌入式设备上的猫狗实时识别”其实很能说明趋势:芯片算力在涨,模型在变小,原来只能在服务器上跑的目标检测网络,现在可以通过量化、剪枝、知识蒸馏塞进一颗几块钱的MCU里。这个方向对C/C++、Python、模型部署工具链都有要求,不是纯算法岗,也不是纯嵌入式岗,而是两者交叉的中间地带。我个人的看法是,未来三到五年,懂模型压缩和部署的嵌入式工程师会非常吃香,因为AI能力下沉到端侧是确定性的技术趋势。

2.3 技术栈全景:从C语言到Rust的进化

先聊C语言。做嵌入式不精通C,等于上战场没带枪。但这里的“精通”不是指你会写指针、会背语法,而是理解C语言在嵌入式环境下的约束:没有GC、内存要手动管、编译器可能做你意想不到的优化、volatile和const不只是给阅读者看的修饰符。真正的高手写C,心里是有一张“代码到汇编再到硬件行为”的映射图的。

关于“C语言面向对象编程”,很多嵌入式工程师看到这个词就皱眉,觉得C就是C,谈什么面向对象。其实在嵌入式场景里,用结构体加函数指针模拟继承和多态是极其常见的手法,比如Linux内核里的file_operations、设备驱动模型,本质上都是面向对象思想在C语言里的实践。懂了这个思路,你读很多开源代码会顺畅得多,写可扩展的驱动框架时也会更有章法。

Rust这两年出镜率越来越高,尤其是在车载和工控领域。Rust的内存安全特性对嵌入式来说几乎是量身定做:没有垃圾回收却能保证内存安全,零成本抽象,还能直接操作寄存器。我用Rust写过一个小型的BLE应用,说实话编译器的严格程度一开始会让人抓狂,但一旦编译通过,运行期的问题会少很多。如果你还在读书,或者刚工作不久,我建议把Rust列进修学计划里。这不是让你立刻用它替代C,而是多一门兵器,以后遇到对安全等级要求高的项目,你会有别人没有的选择。

3. 面试和内卷的真相:八股文、项目经验与真实能力

3.1 八股文为什么越来越长

打开任何一个招聘软件搜嵌入式,你会发现岗位要求的技能列表长得像一张购物清单:C语言、数据结构、操作系统、ARM架构、I2C/SPI/UART、RTOS、Linux驱动、网络编程……于是大量求职者进入一种“背八股文”的模式,从指针和内存布局背到进程调度算法,从AVL树背到红黑树,从中断下半部背到DMA一致性映射。

我特别理解这种焦虑,因为我当年也背过。但我要说句得罪人的话:背八股文能帮你过一面二面,但过不了系统和长久的职业发展。面试官其实心里清楚,简历上那些“精通”和“熟练”有多大的水分。他们问八股文,很多时候不是真想考你记忆,而是想看你在压力下怎么组织思路、怎么面对一个你不完全确定的问题。那种“我可以用伪代码说清楚思路,但具体API记不太准”的回答,往往比“这个知识点我在某本书上看到过,是XXX”更让面试官印象深。

3.2 面试官真正想问什么

我后来也当过面试官,累计面过上百个候选人。我自己的提问逻辑大概分三层:第一层确认基础,指针、链表、内存分配这种躲不开的;第二层考察思维,比如“如果一颗外设的中断频繁触发导致系统卡死,你怎么排查”;第三层看项目真实性,挑一个你做过的项目,层层往下追问,直到问到你答不上来为止。

有意思的是,大多数候选人倒在前两层,真正倒在第三层的反而少——因为能进到第三轮的人,项目多少是亲自做过的。这里想给所有准备面试的人一个建议:与其花时间背“嵌入式面试题八股文汇总”,不如把你简历上的每个项目都做一次彻头彻尾的复盘。项目背景是什么、你负责哪块、遇到过什么诡异的问题、怎么定位的、最后怎么解决的、有没有更好的方案。这套逻辑能讲顺,比背一百道题有用得多。

结构化面试的另一个隐藏观察点是学习能力。嵌入式技术栈太杂,没有任何人敢说全懂。面试官更想知道的是:你不会的东西,给你两天时间你能不能搞明白。这时候你曾经写过的技术笔记、做的开源小项目、甚至一篇记录排查过程的博客,都会成为强有力的证明。

3.3 薪资、加班与职业天花板

这一节可能会让你不太舒服,但都是实话。嵌入式工程师的起薪通常低于同级别的纯软件工程师,尤其是和互联网大厂相比,差个30%到50%很正常。嵌入式加班也不少,但性质不太一样:互联网的加班很多是业务迭代催出来的,嵌入式的加班往往是硬件联调、产线问题、客户现场故障逼出来的,属于“事情不搞定,你想走都走不了”。

职业天花板方面,纯做技术往上走大概有三条路:一条是架构方向,负责整个产品的软硬件技术选型和系统架构;一条是管理方向,带团队、做项目、对接产品和供应链;还有一条就是深耕某个细分领域,比如存储、BSP、电源管理、无线协议栈,成为那个领域里不可替代的人。

我不建议新人一上来就抱着“我要做架构师”的念头。架构师不是被任命的,是技术深度、广度、业务理解沉淀到一定阶段后的自然结果。你至少得先在一两个方向上有足够深的积累,再把眼界拉宽去理解整个系统的协作逻辑,才配谈架构。

4. 给还在坑边和坑里的人:一条相对清醒的学习路线

4.1 第一阶段:把MCU基础打扎实

不管你未来想不想做Linux、想不想搞AI,我都不建议一上来就啃内核。嵌入式的地基是MCU,也就是单片机。选一颗经典的芯片,推荐STM32F103或者更新的F4系列,资料多、社区活跃、遇到的坑在网上基本都能找到答案。

这个阶段的核心目标有两个:一是熟悉裸机开发的完整流程,包括GPIO、中断、定时器、UART、I2C、SPI、ADC这些基本外设;二是建立“寄存器思维”,即明白你在代码里写下的每一步,最终是如何变成芯片引脚上的电平变化和数据传输的。很多人到这个阶段就觉得自己行了,其实还差得远。建议自己动手做一个集成多个外设的小项目,比如一块带温湿度传感器、OLED显示屏、几个按键和Wi-Fi模块的板子,自己画PCB也可以,买现成的开发板也行。重点是要把“读手册、配寄存器、写驱动、调bug”这条链路完整走几遍。

4.2 第二阶段:进入Linux和应用层之间

MCU玩熟了之后,下一步是往Linux方向走。这里有一个很多初学者容易卡住的门槛:Linux不是跑在MCU上的。你需要一块能跑Linux的板子,树莓派、各种国产开发板、或者自己设计的ARM板都可以。

我推荐的学习路径是:先在板子上跑通一个完整的Linux系统,搞清楚引导流程、文件系统结构、进程管理的基本概念。然后尝试写应用层的程序,用上多线程、网络socket、文件IO。当你对Linux应用层有感觉之后,再去碰驱动,从一个最简单的字符设备驱动开始,逐渐理解设备模型、平台总线、中断处理这些内核概念。

这个阶段一定会有大量“看不懂”的时刻。我自己的经验是,看不懂就放一放,先去写应用层代码,过段时间再回头看,往往就通了。不要试图一次性把Linux内核源码从头啃到尾,没有任何人能这样学会内核。你只需要按需阅读,比如今天排查一个驱动问题,就去读对应的driver目录;明天遇到内存不足,就去看看内存管理相关的文档。

4.3 第三阶段:嵌入式AI与边缘计算

如果你已经能熟练地在Linux板卡上开发应用和驱动,可以考虑往嵌入式AI方向走一步。这个方向和纯算法岗有区别:算法工程师负责设计模型结构,而你负责把模型在端侧跑起来,要快、要省内存、功耗还不能太高。

具体要做的事情包括:熟悉至少一种推理框架,比如TensorFlow Lite Micro、ONNX Runtime、NCNN;理解量化(特别是INT8量化)对模型大小和推理速度的影响;掌握常见模型的部署流程,比如从PyTorch导出模型,再做算图优化,最后烧到板子上验证。当年我看到“宠物检测AI模型——嵌入式设备上的猫狗实时识别”这类项目时,第一反应是这有什么难的,后来自己动手做了一次才发现,真正难的不是网络结构,而是如何把层算子映射到特定芯片的加速单元上。这个话题展开讲能写一本书,这里只先提一个结论:嵌入式AI的核心不是AI,而是嵌入式。算法可以调库,但你对硬件执行效率的理解,才决定产品最终能不能落地。

Rust在这个阶段也可以开始正式用起来。比如用Rust重写一些之前用C写的模板工程,对比一下两者的直观感受。不用要求自己立刻完全切换,但至少要对它的所有权模型、借用检查、以及和C互相调用的FFI机制有认识。车载、军工、工控这些对安全要求高的行业,Rust的接受度正在肉眼可见地上升。

5. 给同行的实用工具箱和避坑心得

5.1 工具链选型:VSCode、Claude Code与其他

开发工具这一块,我见过太多人在IDE上折腾来折腾去,其实工具只是手段,效率和Debug体验才是王道。传统嵌入式常用Keil、IAR,但做Linux方向我建议你尽早切到VSCode加GCC这套组合。为什么?因为整个开源世界的构建系统、调试工具、代码分析插件,都优先适配GCC这一套,你在VSCode里配好了交叉编译环境,开发体验非常顺畅。

最近搜索热词里有一个“VSCode集成Claude Code开发嵌入式MCU代码工程”,这个我很感兴趣,实际上我也试过用AI辅助写MCU的驱动代码。我的体会是:AI在生成模板代码、解析数据手册、写单元测试方面效果不错,但在处理硬件时序问题、排查诡异中断行为时还不能替代人。合理的协作方式是你负责系统设计和关键逻辑,让AI帮你处理那些重复性的代码模板和简单的状态机逻辑。建议把这种工具当成一个“会写代码但要你审查的实习生”,而不是“全自动程序员”。

5.2 硬件调试的压箱底经验

调试这件事情,是嵌入式工程师拉开差距的地方。软件栈的问题通常可以通过打日志和单步跟踪解决,但硬件相关的问题往往信息很少、线索很碎。我分享两个实用的排查思路。

第一个思路是分而治之。遇到一个功能不正常,先判断是软件还是硬件问题,怎么判断?逐级排除。比如I2C读不到数据,先量一下时钟线和数据线的波形,如果波形正常,大概率是软件时序问题;如果波形就根本没有,那要么是接线虚焊,要么是引脚配置错了。波形异常时,优先怀疑电平和上拉电阻,这是最常见也最容易踩坑的点。

第二个思路是善用现有工具。逻辑分析仪不一定要很贵,十几块钱的USB逻辑分析仪配合开源软件,就能抓取I2C、SPI、UART的通信过程。示波器有条件就用示波器,没条件就先用逻辑分析仪。很多时候,你以为的“玄学问题”,实际上就是某个信号的上升沿太慢、或者时序余量不足导致的。

5.3 学习资料推荐和避雷

嵌入式相关的书籍和资料浩如烟海,但真正值得反复翻阅的其实不多。中文社区里很多人推荐韦东山老师的视频、正点原子和野火的教程,这些都是经过大量学习者验证的,对新手起步帮助很大。内核源码阅读方面,《Linux设备驱动程序》虽然有点老了,但对理解设备模型依然有效,《奔跑吧Linux内核》则是这两年口碑不错的新书。

再说避雷。不要买那种“三天精通嵌入式”的课程,不要相信任何声称不需要基础就能直接做项目的培训班。嵌入式的学习没有捷径,所有快速拿到offer的案例,背后都是成百上千小时的代码量、焊板量和Debug量。别贪多:看到AVL树觉得要学、看到Rust觉得要学、看到AI部署觉得要学,结果哪个都学不深。一次只追一个目标,把它学到能在项目里真正用出来,再切换下一个。

6. 离职后我最后悔的事和最不后悔的事

6.1 后悔的:没有更早建立开源作品集

离职整理电脑时,我翻到了自己这些年写过的很多代码:有早期写的一个小型RTOS,有后来调试Linux驱动时用的脚本,还有一些自用的C语言工具库。这些代码质量参差不齐,但每段背后都有一段踩坑史。重新读这些代码时我突然意识到,如果早几年把这些东西整理好发布到GitHub当作开源作品集,简历上根本不需要写那些“精通”和“熟练”,让别人直接看代码比任何自我描述都有说服力。

很多工程师不发布代码,是因为觉得自己的代码太丑、太不规范,拿不出手。说实话,这种想法大可不必。开放源码社区欣赏的不是完美的代码,而是你在解决问题的过程中展现出来的思路。一段带着详细README和注意事项的粗糙代码,比一个没有注释的完美项目,带给读者的价值高出十倍。

6.2 不后悔的:从入行第一天就坚持做技术笔记

我有个坚持了八年的习惯:每个工作日结束前,花十分钟记录当天解决了什么问题、为什么会出现、用了什么排查方法。这些笔记后来成为我做文章素材、面试复盘、甚至帮助同事排查问题的“外挂大脑”。很多看似简单的问题,比如“为什么这个引脚要加上拉电阻”“为什么这个中断要在底半部处理”,在笔记里都有当时很详细的推导过程。

把这些笔记整理成对外可读的文章,也让我收获了意外的东西。写“嵌入式Linux U盘测速方案”那篇笔记时,我只是想记录一次性能调优的过程,没想到被很多人转发,还有人私信说按照我的方法解决了类似的问题。那种被认可的感觉,比年终绩效评A还爽。所以如果你刚入行,我给你的第一个建议就是:写笔记,持久地写笔记,不用管有没有人看,先写给自己。

6.3 最后一个给同行的实用建议

如果非要我浓缩成一条最有价值的建议,我会说:永远不要让自己成为只能操作特定芯片、特定IDE、特定厂商SDK的人。技术栈会被淘汰,但底层能力不会。你真正要打磨的,是“面对一个陌生系统,如何快速搞清楚它的运行机制、定位问题、设计解决方案”的通用能力。这个能力从哪里来?从每一颗芯片的数据手册里来,从每一段难读的源码里来,从每一次凌晨两点还在焊板子的经历里来。

最后再分享一个离职后我才彻底想明白的事:嵌入式工程师的价值,不只是你会调I2C时序、会改Linux驱动、会弄模型部署,而是你能在软件和硬件、理论和工程、理想和现实这些夹缝之间,找到一条把不可能变成可能的路径。这个行业确实苦,加班不少、薪资相对不那么诱人,但它给你的是另一种回报:你能亲手让一个物理世界的设备动起来,能在无声的电路板上听到自己代码运行的回响。对我来说,这种感觉没有替代品,这也是我愿意把这些大实话讲给你们听的根本原因。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询