ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

嵌入式开发学习路线:工具链、Linux应用驱动设备树、裁剪调优与AI部署

嵌入式开发学习路线:工具链、Linux应用驱动设备树、裁剪调优与AI部署 嵌入式开发这四个字第一次接触的人多半是这么进来的刷到一个标题写着整整100集、零基础到大神、七天速成、少走99%弯路的视频合集手一点收藏心里瞬间踏实了然后……再也没打开过。收藏夹里躺着的课程越来越多手上能跑的板子一块没有这是绝大多数新手最真实的状态。我见过太多人把学嵌入式开发理解成看够100集视频结果看到第30集讲中断向量表的时候前面点灯的内容已经忘干净了。这篇东西不打算再给你列一个第1集到第100集的清单那种清单网上一抓一大把。我想干的是另一件事把这套课程背后真正需要你动手补齐的东西讲清楚——嵌入式开发的学习路线到底该按什么顺序铺、环境怎么搭、Linux嵌入式下面应用驱动设备树这三层怎么串、系统裁剪和性能调优平时都在调什么、算法和AI模型往板子上塞的时候会撞到哪些墙、以及哪些项目实例是真能写进简历的。不管你现在是刚买第一块开发板的纯小白还是写过单片机想往Linux方向转的看完应该都能对着自己的进度找到下一步该干什么。1. 收藏夹里那套100集教程真正卡住新手的是哪一步1.1 嵌入式开发和写普通程序的分界线在哪先把一个概念性的东西说透不然后面全是迷糊账。你平时写Python、写Java、写前端脚下踩的是一个完整的操作系统内存有人帮你管文件有人帮你读屏幕有人帮你画。嵌入式开发的第一件事是把这层兜底拿掉——你要直接面对寄存器、时钟树、外设控制器、内存布局这些东西。第一次点亮一颗LED你学的其实不是语法而是我怎么让一块芯片按我的意思动起来。这个差别决定了学习方法完全不一样。桌面编程你可以边看文档边敲跑不通多半是逻辑写错了嵌入式跑不通可能是编译器版本不对、时钟没使能、引脚复用没配对、下载器没连上、供电不稳、串口线接反——每一个环节都能让你盯着屏幕怀疑人生。所以我说嵌入式是硬件的不确定性和软件的不确定性叠在一起。视频教程永远只演示顺利的那条路而真实开发里你要处理的是那条不顺利的路。理解了这条分界线你就不会再用看完多少集来衡量进度了而是会用我能独立让一个外设动起来来衡量。这两种衡量方式差别是天地之别。1.2 从看懂视频到板子真的跑起来中间缺的是什么视频里老师敲完代码一按下载灯就亮了。你照着敲编译报错、烧录失败、灯不亮。很多人到这一步就停了以为自己不适合。其实缺的不是知识是那条工具链的完整链路没搭通。一条完整的嵌入式开发链路至少包含交叉编译工具链、构建系统、调试器、烧录器、串口终端、时钟和引脚的初始化配置。任何一环出问题结果都是灯不亮。我给你一个排错顺序这比看十集视频都管用先确认代码能不能编译通过编译不过就是工具链或头文件路径问题再确认能不能烧进去烧录失败就是连接、供电、下载器驱动问题再确认能不能连上调试器停在main连不上基本是时钟或复位问题最后才看功能对不对跑飞了多半是栈溢出、中断优先级、时钟没使能这些。按这个顺序一层层剥问题基本跑不掉。我自己的习惯是每换一块新板子先跑官方固件确认硬件是好的再跑一个最小工程确认工具链是通的最后才开始写业务代码。这个习惯帮我省掉过无数次到底是硬件坏了还是我代码错了的深夜纠结。1.3 七天从小白到大神这句话该怎么拆说实话七天到大神是个营销话术但七天建立能自己往下走的框架是真能做到的。七天里你能完成的事是理解GPIO、串口、定时器、中断这四个基础外设怎么用把编译-下载-调试这条链路跑通知道去哪里查芯片手册和参考代码。一周之后你不会是大神但你会从完全不知道从哪下手变成知道下一步查什么。真正的成长在项目里。做过一个完整的、有输入有输出有通信有存储的小系统比看五十集视频有用得多。所以别纠结集数也别被100集2026最新版这种字眼带节奏抓住那条能动手的链路剩下的交给项目。提示遇到一个教程只有演示没有原理先别急着跟问自己一句这一步背后是谁在做事答不上来就去补那一块。这比刷完整个合集性价比高。2. 开发环境选型VSCode插件组合与CLion的取舍2.1 用VSCode做嵌入式我的插件清单和配置逻辑现在大部分人做嵌入式开发编辑器首选都是VSCode原因是它轻、插件生态全、跨平台一致。但插件不是装得越多越好装多了互相打架代码补全反而变慢。我的常用组合是这样的插件解决什么问题备注C/C补全、跳转、语法检查核心必装CMake Tools配置和构建工程用CMake的工程必装Cortex-Debug芯片调试、看寄存器ARM Cortex系列调试利器Makefile Tools老式Makefile工程支持很多原厂SDK还在用MakefileSerial Monitor串口收发省得再开一个串口工具GitLens看代码改动历史团队协作很有用EditorConfig统一缩进换行风格多人协作少吵架配置逻辑上关键是把c_cpp_properties.json里的头文件搜索路径配对不然你会发现能编译但编辑器满屏红线。很多人以为红线就是错其实那是编辑器没找到头文件。把交叉编译工具链的include路径加进去红线立刻消失。这个坑我前后踩过好几次每次换SDK都要重新补一遍路径。2.2 CLion在嵌入式场景下值不值得上CLion的优势在于对CMake的原生支持和重构能力代码分析比VSCode深一个档次远程调试和内存视图也做得很舒服。什么时候值得用项目比较大、重度依赖CMake、需要频繁重构和调试的时候。什么时候没必要就点个灯写个串口收发用CLion纯属杀鸡用牛刀启动慢、吃内存。我自己的分工是小工程、快速验证用VSCode图的是开机就能写中大型Linux应用或需要深度调试的工程用CLion图的是分析能力。两者不是二选一装两套切换着用成本很低。真正要提醒的是不管你用哪个编辑器底层的编译工具链是同一套别把编辑器和工具链搞混了。2.3 工具链本身编译器、调试器、烧录器到底用什么编辑器只是壳真正干活的是工具链。编译用arm-none-eabi-gcc这一类交叉编译器调试和烧录常用OpenOCD、pyOCD配合ST-Link、J-Link这些硬件调试器。判断自己是不是真的入门了有个很简单的标准脱离IDE用命令行敲一遍编译、下载、调试的全流程。做得到说明你知道每一步在干什么做不到说明你还在被IDE牵着走。命令行跑通之后你对整个工程结构的理解会清晰很多源文件在哪、链接脚本怎么写、启动文件干了什么、编译产物是什么格式。这些在IDE里都被藏起来了偏偏是排查问题时最需要的东西。3. Linux嵌入式开发的三层结构应用、驱动、设备树3.1 应用层开发从交叉编译到真正部署Linux嵌入式开发最上面那层是应用层说白了就是跑在板子上的普通Linux程序。但和桌面开发有个根本区别你在电脑上敲完代码不能直接跑得用交叉编译器编出目标板架构能执行的二进制文件然后拷到板子上运行。拷的方式有网络传输、U盘、SD卡、NFS挂载等等生产环境里固件打包进镜像调试阶段最省事的还是网络传。交叉编译最容易出问题的点是链接了错误的库比如你把x86的库链进去了编译能过一上板子就报无法执行二进制文件或找不到动态库。解决办法是编之前明确指定--sysroot指向目标板的根文件系统链接时用-L指定目标库路径。这个坑每个人都要踩一次踩完就记住了。应用层看似简单其实是最容易做深的地方。你写的服务要不要开机自启、要不要看门狗、日志怎么轮转、资源占用怎么控制、崩溃了怎么重启这些都是有讲究的。我见过不少人的板子上跑着程序跑三天内存就满了最后发现是某个日志文件没轮转、句柄没释放。这些都是应用层的内功。3.2 驱动开发字符设备那一套流程必须亲手走一遍往下就是驱动层。Linux驱动开发入门绕不开字符设备那一套流程申请设备号、初始化cdev、实现file_operations里的open/read/write/ioctl、通过mknod创建设备节点。这套流程不难但必须亲手写一遍光看视频是记不住的。写驱动最需要建立的一个意识是内核空间和用户空间是隔离的。你在驱动里不能随便用用户空间的函数数据在两边传递要用copy_to_user和copy_from_user这类接口不然轻则报错重则崩溃。刚开始我总是忘记这一点写完一跑就内核panic看日志才知道是访问了非法的地址。调试驱动也是个体力活因为内核崩了不会给你友好的报错。常用手段是printk打日志、看dmesg、打开内核的调试选项。我现在写驱动养成了一个习惯功能没写完先加上足够的日志确保每一步都能看到执行到哪出问题时排查效率高很多。这条经验是很多次通宵换来的。3.3 设备树配置为什么改引脚之前要先改dts在比较新的Linux内核里硬件描述基本都交给设备树了。设备树的作用是把这块板子上有什么硬件、接在哪个引脚、用什么驱动从内核代码里抽出来变成一份可配置的文本文件。改引脚、加外设、调地址第一步都是改设备树而不是改驱动代码。我第一次接触设备树的时候特别不适应觉得这套东西抽象得没道理。后来想明白了以前每种板子硬件不同硬件信息都硬编在内核里板子一多内核就臃肿。设备树把硬件描述独立出来同一份内核配不同的dts就能跑不同的板子这是为了可复用。理解了这一点改dts的时候心里就有底了知道自己改的不是魔法配置而是给内核的一份硬件说明书。实践中常见的坑是设备树里的引脚复用、时钟、电源域没配对导致驱动加载成功但硬件没反应。排查的时候先看内核启动日志里设备有没有被识别再看引脚复用寄存器是不是被别的驱动抢占了一层层往下查。4. 系统裁剪与性能调优资源有限时到底在调什么4.1 裁剪的思路从内核到根文件系统嵌入式设备的内存和存储通常都很紧张所以裁剪是绕不开的技能。裁剪分几块内核配置裁剪、根文件系统裁剪、以及启动流程精简。内核这块用make menuconfig一项项关掉不需要的驱动和子系统能省下不少空间根文件系统用BusyBox搭一个精简的把用不到的库和程序全砍掉。裁剪的核心原则是按需保留但难点在于你往往不知道自己需要什么砍多了系统起不来砍少了体积超标。我的做法是先保留一个能正常启动的基线配置每次只砍一小块砍完立刻验证系统能不能起、功能正不正常。这样即使砍错了也能快速定位是砍的哪一项导致的问题。一股脑砍完再排查那是自找麻烦。还有一点裁剪不只是为了省空间也是为了减攻击面和加快启动速度。一个只保留了必要功能的小系统启动往往比完整发行版快好几倍这对很多工业场景是很实在的价值。4.2 性能调优先观测再动手性能调优最容易犯的错是不测就调。很多人一上来就问怎么优化却不知道自己慢在哪。正确顺序是先观测CPU占用用top、mpstat看内存用free、smem看IO用iostat看程序内部热点用perf或干脆在关键路径打时间戳。看清楚瓶颈在哪再决定动哪块。调优手段按层次分应用层可以改算法、减锁、用批处理、上多线程系统层可以调调度策略、改缓存参数、调IO调度器硬件层可以改主频、加DMA、换存储介质。从便宜到贵依次尝试别一上来就想着换硬件。我调过一个图像采集的程序最初怀疑带宽不够测下来发现是每帧都做了一次全量内存拷贝改成零拷贝之后直接就流畅了。这就是先观测的价值。调优之后一定要回归测试确认功能没被改坏。性能上去了、正确性掉了这种事故在嵌入式里代价很大。5. 算法与AI模型往板子上塞的时候会撞到哪些墙5.1 嵌入式能用的开源库生态和PCL那类库的对应关系经常有人问嵌入式里有没有像PCL点云库那样的高级开源库。答案是有对应生态但形态不太一样。PCL本身偏桌面和机器人平台对算力和内存要求高直接往嵌入式塞很吃力。嵌入式这边更常用的是轻量矩阵库Eigen、优化库Ceres和g2o、视觉库OpenCV的精简版、轻量近邻搜索nanoflann需要点云时会用PCL的裁剪版或者干脆自己写简化算法。这个选择背后是有道理的嵌入式资源有限大而全的库既占空间又拖性能所以生态自然往专而小的方向走。你要做的不是找一个能和PCL打平的嵌入式库而是找能解决你当前这个具体问题的轻量组件然后按需拼装。这种拼装思路是嵌入式算法岗和桌面算法岗很大的一个区别。5.2 模型部署与性能调优量化、算子与内存把AI模型部署到嵌入式端主流路子是用推理框架比如TFLite、ONNX Runtime、NCNN、MNN这些或者针对MCU的TFLite Micro、CMSIS-NN。部署过程大概分几步训练好的模型转成框架能识别的格式、做量化、在板子上跑推理、对比精度和速度、调优。量化是重头戏。把浮点模型换成定点或int8体积和内存能降一大截速度也快很多代价是精度可能有损失。这里的关键是找到精度和性能的平衡点通常做法是量化后在验证集上重新评估精度掉得能接受就用掉太多就保留部分层用浮点。这个过程要反复试没有一劳永逸的参数。性能调优的大头在算子和内存布局。同一个模型换个算子实现、改一下内存对齐、把中间结果复用起来速度能差出好几倍。还有就是批处理和流水线把预处理/推理/后处理做成并行流水整体吞吐能明显提升。这块的经验是不要只盯着模型本身数据搬运很多时候才是真正的瓶颈。6. 学习路线和项目实例所谓速成的说法该怎么落地6.1 一条能走通的自学路径我把自学路径按能力阶段分成四段。第一段是单片机基础搞懂GPIO、串口、定时器、中断、ADC这些外设用C语言把它们驱动起来第二段是工具链和环境能脱离IDE用命令行完成编译下载调试会看芯片手册和参考代码第三段是Linux嵌入式搞懂应用开发、驱动开发、设备树这几块能在板子上部署和调试程序第四段是进阶方向比如系统裁剪、性能调优、算法部署、AI推理按你的目标岗位选。每一段的核心指标都是能独立完成一个小项目而不是看完了哪些视频。比如第二段结束时你应该能自己从零建一个工程、编出固件、烧进板子、调试功能。做不到就说明这一段还没过关别急着往下一段跑。这条路径看着慢其实是相对快的因为它每一步都扎实。6.2 几个能真写进简历的项目实例项目选得好比证书管用。我推荐几个层次分明的实例入门级做一个带串口交互和定时采集的环境监测小设备把外设、通信、存储串起来进阶级做一个跑在Linux板子上的数据采集网关涉及应用、驱动、网络通信和进程管理稍复杂一点做一个带图像或传感器融合的嵌入式设备涉及算法部署和性能调优。这三个做下来你的能力覆盖已经相当完整了。写项目的时候有个技巧重点写你解决的具体问题和技术取舍而不是流水账式地列功能。比如为了降低功耗把采集周期从100ms改成500ms并启用低功耗模式整机续航从8小时提升到30小时这种描述比实现了数据采集功能有用得多。面试官想听的是你怎么思考和权衡的而不是你用了什么模块。注意项目里的数据一定要自己实测过能复现、能解释。写了自己没弄懂的东西一问就露馅反而减分。最后分享一点个人体会。学嵌入式这件事最怕的不是基础差而是一直在准备从来没动手。买板子、装环境、收藏教程这些都很爽但都不算真正开始。真正的开始是你让第一颗灯亮起来的那一刻。从那天算起后面所有的驱动、设备树、裁剪、调优、模型部署其实都是同一件事的延伸——让硬件按你的意思动起来。所以别再纠结那100集了挑一块板子从点灯开始把每一步都亲手走一遍。走得慢没关系走出来才是你的。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进