Harmony会成为下一个Linux吗?
Harmony会成为下一个Linux吗?
作为一个在嵌入式领域摸爬滚打了6年的老码农,看到这个问题我第一反应是——这问题问得太早了,但又问得恰到好处。
先说结论吧
Harmony能不能成为下一个Linux,取决于它能不能像Linux当年那样,让全世界的开发者都觉得“用它能赚到钱”。
注意啊,不是“用它能做出牛逼的东西”,而是“能赚到钱”。这是两码事。
我为什么这么说?
2015年我刚毕业那会儿,在厦门某马做单片机开发。那时候组里有个老哥,天天跟我吹Linux多牛逼,开源社区多繁荣。我就问他一句:“那你为啥不去搞Linux?”
他愣了半天,说:“公司项目用的STM32,我能咋办?”
你看,这就是现实。
后来我27岁跳到外企做车载Linux,才真正理解了Linux为什么能成为今天的Linux——不是因为它技术多先进,而是因为整个产业链都在用它赚钱。
芯片厂商基于它做BSP能卖芯片,方案商基于它做产品能接项目,程序员学它能涨薪跳槽,培训机构教它能收学费。这才是一个生态真正的护城河。
Harmony现在的处境
说实话,Harmony现在有点像2005年左右的Android——技术框架搭起来了,但生态还没跑通。
我最近接了几个企业咨询的单子,有做IoT的,有做车机的,他们问我最多的问题不是“Harmony技术行不行”,而是“用Harmony能不能降本?能不能快速出货?万一华为哪天不维护了怎么办?”
你看,打工人关心的永远是最现实的问题。
我在公众号写Linux相关内容这些年,涨粉最快的永远不是那些讲内核原理的硬核文章,而是“如何用Linux接外包月入2万”这种标题党。因为大家要恰饭啊。
Linux当年是怎么起来的?
很多人以为Linux是靠技术先进起来的,错了。
Linux真正起飞是在2000年后,IBM、红帽这些大厂开始all in的时候。为啥?因为他们发现用开源能赚更多的钱——卖服务比卖License利润更高,而且不用养那么多研发。
再看国内,为啥这么多公司用Linux?不是因为情怀,是因为省License费啊老铁!
我在外企那几年,光Android的License费就能省几百万美金。这钱省下来,老板开心,我们年终奖也多。这才是Linux在中国真正普及的原因。
Harmony的机会在哪?
说句可能得罪人的话——Harmony最大的机会不在技术,在政策。
如果哪天上面一纸文件下来,说某些领域必须用国产系统,那Harmony立马就能起飞。你看现在信创市场多火?麒麟、统信这些国产Linux发行版,技术比Ubuntu强吗?不见得。但人家有政策扶持啊。
但这也是Harmony最大的风险——如果只靠政策,没有真正的商业闭环,那就是空中楼阁。
我见过太多这样的项目了。政府补贴一停,公司立马黄。
真正的问题是什么?
Harmony要成为下一个Linux,需要解决三个问题:
第一,让芯片厂商赚到钱。
现在做Harmony芯片的有几家?瑞芯微、全志?远远不够。Linux之所以强,是因为从ARM到x86,从高通到MTK,大家都在做。芯片厂商才是生态的地基。
第二,让方案商活下去。
我接触过一些做Harmony方案的小公司,说实话日子不好过。客户要的是成熟稳定能快速出货的方案,不是“未来可能很牛”的东西。方案商活不下去,生态就是空谈。
第三,让开发者看到前途。
现在学Harmony的人多吗?不多。为啥?因为招聘网站上Harmony的岗位太少了。我一个做自媒体的,天天有人问我“学Harmony有前途吗?能找到工作吗?”
你看,大家关心的还是能不能赚钱。
我的判断
Harmony会不会成为下一个Linux?有可能,但至少还要5-10年。
这5-10年里,它需要:
- 让至少50家芯片厂商基于它赚到钱
- 让至少5000家方案商靠它活下去
- 让至少50万开发者因为它涨薪跳槽
只有这样,它才能真正成为一个生态,而不是一个项目。
Linux用了15年才真正统治服务器市场,用了10年才在移动端站稳脚跟。Harmony凭什么能更快?
但话说回来,中国市场足够大,政策支持力度也够强。如果华为能扛住压力,持续投入,Harmony是有机会的。
只是这个过程,注定不会一帆风顺。
更多编程学习资源
- C语言零基础入门电子书-2026最新版
- STM32零基础入门电子书-2026最新版
- FreeRTOS零基础入门电子书-2026最新版
- C++ 零基础入门电子书-2026最新版
- 51单片机零基础入门学习路线
- AD画板零基础入门学习路线
- C语言零基础入门学习路线
- C++语言零基础入门学习路线
- ESP32零基础入门学习路线
- FreeRTOS零基础入门学习路线
- Linux应用开发零基础入门学习路线
- Linux底层开发零基础入门学习路线
- LVGL零基础入门学习路线
- QT零基础入门学习路线
- STM32零基础入门学习路线
嵌入式学习路线(2026最新版)
说完Harmony,聊聊嵌入式学习这事儿。
我24岁误打误撞进了这行,28岁开始写公众号分享经验,30岁靠这个赚到第一个百万。这些年带过不少新人,也见过太多人走弯路。
今天就把我这6年踩过的坑、总结的经验,毫无保留地分享给你们。
1. 学习大纲

2. 必看开源视频
B站高质量教程
C语言与数据结构:
- 《郝斌C语言自学教程》 虽然是老视频,但讲得真的透彻。我当年就是看这个入门的,郝老师讲指针那部分,比我大学老师讲得清楚多了。180集看着多,其实每集也就20分钟,上下班地铁上就能刷完。 链接: http://bilibili.com/video/BV1os411h77o
- 《浙大数据结构》陈越、何钦铭 这个是真的神课,浙大的良心之作。我做外包项目的时候,很多算法优化的思路都是从这门课里学的。特别是讲树和图那几节,配合PTA刷题,进步飞快。 链接: http://bilibili.com/video/BV1Kb41127fT
STM32单片机:
- 《正点原子STM32开发板配套视频》 这个必须推。我在某马那会儿,组里新人都是看这个上手的。正点原子的视频最大的优点是理论+实战结合得好,不会让你光听理论云里雾里,每一节都有对应的代码和硬件实验。而且他们的开发板资料真的全,原理图、PCB、例程全开源。 链接: http://bilibili.com/video/BV1th411z7sn
- 《野火STM32视频教程》 野火的教程更偏工程化一些。我特别喜欢他们讲RTOS那部分,把FreeRTOS的任务调度、信号量、消息队列讲得很清楚。如果你想往产品级开发方向走,野火的教程更适合。 链接: http://bilibili.com/video/BV18X4y1M763
Linux系统编程:
- 《Linux C编程一站式学习》宋劲杉 这个课程我反复看了三遍。第一遍看懂了60%,第二遍看懂了80%,第三遍看的时候已经在外企做Linux开发了,很多当时不理解的点突然就通了。特别是讲进程、线程、信号那部分,结合内核源码分析,醍醐灌顶。 链接: http://bilibili.com/video/BV1KE411q7ee
- 《韦东山嵌入式Linux》 韦老师是我见过把驱动开发讲得最通俗易懂的。他那个“先用起来,再深入原理”的教学思路特别适合新手。我当年就是看他的视频,一周时间搞定了字符设备驱动,然后在公司项目里直接用上了。 链接: http://bilibili.com/video/BV1w4411B7a4
嵌入式Linux系统:
- 《正点原子Linux开发实战指南》 从U-Boot到Kernel到根文件系统,整个流程讲得很完整。我做企业咨询的时候,经常推荐客户的工程师看这个。特别是讲设备树那部分,很多人看内核文档看不懂,看这个视频就豁然开朗了。 链接: http://bilibili.com/video/BV1w4411B7a4
进阶内容:
- 《100ASK_IMX6ULL裸机开发》 想深入理解ARM架构和底层启动流程,这个课程必看。韦东山团队出品,质量有保证。我在写公众号文章分析启动流程的时候,很多素材都是从这个课程里来的。 链接: http://bilibili.com/video/BV1wy4y1v7TT
- 《宋宝华Linux驱动开发》 宋老师是国内Linux驱动领域的大牛,他的课程偏实战。如果你已经有一定基础,想往驱动开发方向深耕,这个课程能让你少走很多弯路。我在外企做车载Linux的时候,很多疑难问题都是参考他的思路解决的。 链接: http://bilibili.com/video/BV14f4y1Q7gv
图文教程推荐:
- 《Linux C编程一站式学习》(开源电子书) 网址: http://akaedu.github.io/book/ 这本书配合视频看效果最好,很多概念视频里一带而过的,书里会详细展开。我当年打印出来,在地铁上翻烂了。
- 《蜗窝科技》 网址: http://wowotech.net 这是国内最好的Linux内核分析网站,没有之一。文章质量极高,很多内核机制分析得非常透彻。我写公众号的时候,经常参考他们的文章。不过新手可能看着吃力,建议有一定基础再看。
3. 必读经典书籍
入门必读
《C Primer Plus》(第6版)
这本书我前前后后看了四遍。第一遍大学时候囫囵吞枣看完,第二遍工作后重新看,第三遍带新人的时候又翻了一遍,第四遍是写公众号文章的时候查资料。
这本书最大的优点是讲得细,每个知识点都有大量例子。特别是指针那章,很多人看不懂谭浩强的《C程序设计》,看这本书就能看懂。我在某马带过一个实习生,C语言基础很差,我让他啃这本书两个月,后来写代码完全没问题。
《C和指针》
如果说《C Primer Plus》是教科书,那《C和指针》就是武功秘籍。这本书专门讲指针,而且讲得非常深入。
我印象最深的是第4章讲指针运算,把指针加减、指针数组、数组指针这些容易混淆的概念讲得清清楚楚。我在外企面试的时候,面试官问我“int (*p)[10]和int *p[10]有什么区别”,就是靠这本书打的底。
建议有一定C语言基础后再看,新手直接看可能会懵。
《数据结构与算法分析——C语言描述》
这本书比《算法导论》友好多了,代码都是C语言实现的,直接能跑。我做外包项目的时候,经常需要优化算法,这本书翻得最多。
特别是第3章讲链表、第4章讲树,写得非常清楚。我在公众号写过一篇《手撕LRU缓存算法》,里面的链表+哈希表实现,就是参考这本书的思路。
单片机开发
《STM32库开发实战指南》(野火)
野火的书和他们的视频一样,工程化做得好。这本书最大的特点是代码注释详细,每个寄存器配置都会解释为什么这么写。
我在某马那会儿,手头常备这本书。遇到问题先看书,书里没有再去翻数据手册。特别是讲定时器、DMA那部分,比ST官方的参考手册好懂多了。
《深入浅出ARM Cortex-M3》(宋宝华)
这本书偏底层,讲ARM架构、中断、异常处理这些。如果你想深入理解STM32的工作原理,而不是只会调库,这本书必看。
我在外企做车载项目的时候,遇到过一个诡异的bug——系统跑着跑着就死机,调试了一周才发现是中断优先级配置错了。后来重新看这本书的第6章,才彻底理解了NVIC的工作机制。
《FreeRTOS内核实现与应用开发实战指南》(野火)
学RTOS必看。这本书把FreeRTOS的任务调度、内存管理、同步机制讲得很透彻,而且有大量实战案例。
我特别喜欢第12章讲任务间同步,把信号量、互斥锁、事件组的使用场景分析得很清楚。我在做IoT项目的时候,多任务之间的通信就是参考这本书设计的。
Linux系统编程
《UNIX环境高级编程》(APUE)
这本书是Linux编程的圣经,没有之一。我在外企那几年,这本书一直放在工位上,遇到问题就翻。
全书700多页,内容非常全面——文件IO、进程控制、信号、线程、网络编程,应有尽有。我印象最深的是第10章讲信号,把信号的产生、捕获、处理讲得非常细致。我在处理多进程通信的时候,经常参考这章的内容。
建议:这本书不要从头到尾看,而是按需查阅。比如你要做网络编程,就重点看第16、17章;要做多线程,就看第11、12章。我看了三年,也没完全看完,但不影响工作。
《Linux程序设计》(Beginning Linux Programming)
这本书比APUE友好,更适合入门。内容涵盖Shell编程、文件操作、进程线程、网络编程,而且每章都有完整的实战项目。
我特别推荐第13章讲进程间通信,把管道、FIFO、消息队列、共享内存、信号量讲得很清楚,配合代码示例,很容易理解。我在做车载项目的时候,多个进程之间的通信方案就是参考这本书设计的。
《UNIX网络编程》(卷1:套接字联网API)
做网络编程必看。这本书把TCP/IP、Socket编程讲得非常深入,而且有大量实战代码。
我在做IoT项目的时候,需要实现MQTT客户端,就是参考这本书的第6章(IO复用)和第16章(非阻塞IO)。虽然最后用了开源库,但理解底层原理后,遇到问题调试起来快多了。
注意:这本书比较厚(900多页),建议有一定网络编程基础后再看。新手可以先看《Linux程序设计》的网络编程部分。
驱动开发
《Linux设备驱动程序》(LDD3)
驱动开发的经典教材,虽然基于2.6内核,但核心思想没变。这本书把字符设备、块设备、网络设备驱动讲得很清楚。
我在外企做驱动开发的时候,这本书翻烂了。特别是第3章讲字符设备驱动,从file_operations到ioctl,每个接口都有详细解释。我写的第一个驱动就是参考这本书的例程。
《Linux驱动开发实战》(宋宝华)
宋老师的书偏实战,而且基于较新的内核(4.x)。这本书最大的特点是代码多、案例多,每个知识点都有对应的驱动实例。
我特别推荐第10章讲设备树,把DTS的语法、设备树的解析、平台设备驱动讲得很透彻。现在做ARM Linux开发,设备树是绕不过去的,这章必须吃透。
《深入Linux内核架构》
这本书很厚(1200多页),但如果你想深入理解Linux内核,这本书必看。从进程调度到内存管理,从文件系统到网络协议栈,讲得非常深入。
我在写公众号分析内核机制的时候,经常参考这本书。不过新手不建议看,建议工作1-2年后,有一定内核开发经验再看。
嵌入式Linux系统
《嵌入式Linux应用开发完全手册》(韦东山)
韦老师的书和他的视频一样,通俗易懂。这本书从Bootloader到Kernel到根文件系统,整个流程讲得很完整,而且有大量实战案例。
我特别推荐第5章讲Buildroot,把如何定制根文件系统讲得很清楚。我在做企业咨询的时候,帮客户定制嵌入式Linux系统,就是用的Buildroot,参考的就是这本书。
《Building Embedded Linux Systems》
这本书偏工程化,讲如何构建一个完整的嵌入式Linux系统。从交叉编译工具链到Bootloader移植,从内核配置到根文件系统制作,每个环节都有详细说明。
我在外企做车载项目的时候,需要从零搭建一个嵌入式Linux系统,就是参考这本书。虽然是英文版,但技术书籍的英文其实不难,配合Google翻译完全能看懂。
进阶书籍
《深入理解Linux内核》
这本书和《深入Linux内核架构》齐名,但侧重点不同。这本书更偏向内核源码分析,适合想深入研究内核的人。
我在分析内核启动流程的时候,参考了这本书的第2章。虽然基于2.6内核,但启动流程的核心逻辑没变,依然有参考价值。
《性能之巅》
做性能优化必看。这本书把Linux性能分析的方法论讲得很清楚,从CPU到内存,从磁盘到网络,每个子系统都有对应的分析工具和优化方法。
我在做车载项目的时候,遇到过系统卡顿的问题,就是用这本书介绍的perf、ftrace等工具定位的。虽然这本书偏运维,但对嵌入式开发也很有帮助。
4. 必做项目
做嵌入式最怕纸上谈兵,必须动手做项目。我这些年做过的项目、看过的开源项目,挑几个含金量高的推荐给你们。
单片机项目
智能小车(STM32)
- 项目地址: http://github.com/Embedfire/ebf_motor_tutorial_code_stm32f407_jiaoyang
- 推荐理由: 野火的电机教程配套代码,涵盖了直流电机、步进电机、舵机控制。我在某马那会儿,带新人都是让他们先做这个项目。通过这个项目,能掌握PWM、定时器、PID算法,而且成就感很强——看着小车跑起来,特别有动力。
- 技术栈: STM32、PWM、PID、串口通信
- 难度: ⭐⭐⭐
多功能智能手表(基于FreeRTOS)
- 项目地址: http://github.com/moononournation/T-Watch-2020-PCB
- 推荐理由: 这是一个完整的智能手表项目,用的ESP32+FreeRTOS。包含GUI界面、蓝牙通信、传感器数据采集、低功耗管理。我在做IoT项目的时候,参考过这个项目的低功耗设计。
- 技术栈: ESP32、FreeRTOS、LVGL、蓝牙
- 难度: ⭐⭐⭐⭐
开源飞控(Betaflight)
- 项目地址: http://github.com/betaflight/betaflight
- 推荐理由: 这是目前最流行的开源飞控固件,代码质量非常高。如果你想深入学习传感器融合、PID控制、实时系统,这个项目必看。我在写公众号分析姿态解算算法的时候,就是参考的这个项目。
- 技术栈: STM32、传感器融合、PID、实时控制
- 难度: ⭐⭐⭐⭐⭐
Linux应用项目
基于Qt的音乐播放器
- 项目地址: http://github.com/Italink/QMusicPlayer
- 推荐理由: 这是一个完整的Qt音乐播放器,界面漂亮,功能完善。我在外企做车载项目的时候,HMI开发就是用的Qt,参考过这个项目的界面设计。通过这个项目,能掌握Qt编程、多媒体框架、多线程。
- 技术栈: Qt、GStreamer、多线程
- 难度: ⭐⭐⭐
视频监控系统(基于V4L2)
- 项目地址: http://github.com/mpromonet/v4l2rtspserver
- 推荐理由: 这个项目实现了一个轻量级的RTSP服务器,可以把摄像头数据通过网络推流。我在做IoT项目的时候,需要实现远程视频监控,就是参考的这个项目。代码不多,但麻雀虽小五脏俱全,V4L2、网络编程、多线程都涉及到了。
- 技术栈: V4L2、RTSP、网络编程
- 难度: ⭐⭐⭐⭐
开源NAS系统(OpenMediaVault)
- 项目地址: http://github.com/openmediavault/openmediavault
- 推荐理由: 这是一个基于Debian的NAS系统,功能非常强大。如果你想学习Linux系统管理、Web开发、存储管理,这个项目值得研究。我在做企业咨询的时候,帮客户搭建过私有云存储,就是基于这个项目改的。
- 技术栈: Linux系统管理、PHP、存储管理
- 难度: ⭐⭐⭐⭐
Linux驱动项目
字符设备驱动模板
- 项目地址: http://github.com/Johannes4Linux/Linux_Driver_Tutorial
- 推荐理由: 这是一个非常好的驱动开发教程,从最简单的Hello World驱动,到字符设备、平台设备、设备树,每个知识点都有对应的代码。我在带新人的时候,都是让他们先跟着这个教程走一遍。
- 技术栈: 字符设备驱动、平台设备驱动、设备树
- 难度: ⭐⭐⭐
USB摄像头驱动(UVC)
- 项目地址: http://github.com/torvalds/linux/tree/master/drivers/media/usb/uvc
- 推荐理由: 这是Linux内核自带的UVC驱动,代码质量非常高。如果你想学习USB驱动开发、V4L2框架,这个驱动必看。我在外企做车载项目的时候,需要适配一个特殊的USB摄像头,就是参考的这个驱动。
- 技术栈: USB驱动、V4L2、视频采集
- 难度: ⭐⭐⭐⭐⭐
SPI Flash驱动(MTD)
- 项目地址: http://github.com/torvalds/linux/tree/master/drivers/mtd/spi-nor
- 推荐理由: 这是Linux内核的SPI Flash驱动,基于MTD框架。如果你想学习SPI驱动开发、Flash操作,这个驱动值得研究。我在做嵌入式Linux系统的时候,经常需要操作SPI Flash,这个驱动看了不下十遍。
- 技术栈: SPI驱动、MTD框架、Flash操作
- 难度: ⭐⭐⭐⭐
嵌入式Linux系统项目
Buildroot定制系统
- 项目地址: http://github.com/buildroot/buildroot
- 推荐理由: Buildroot是构建嵌入式Linux系统的利器,配置简单,编译快速。我在做企业咨询的时候,帮客户定制嵌入式Linux系统,90%都是用Buildroot。建议fork一份,自己定制一个最小系统,加深理解。
- 技术栈: Buildroot、交叉编译、根文件系统
- 难度: ⭐⭐⭐⭐
Yocto项目
- 项目地址: http://git.yoctoproject.org/cgit/cgit.cgi/poky
- 推荐理由: Yocto是更强大的嵌入式Linux构建系统,但学习曲线陡峭。如果你想往高端嵌入式方向发展,Yocto必须掌握。我在外企做车载项目的时候,用的就是Yocto,虽然一开始很痛苦,但掌握后效率很高。
- 技术栈: Yocto、BitBake、Layer管理
- 难度: ⭐⭐⭐⭐⭐
OpenWrt路由器系统
- 项目地址: http://github.com/openwrt/openwrt
- 推荐理由: OpenWrt是最流行的开源路由器系统,代码质量很高。如果你想学习网络编程、Linux系统定制,这个项目必看。我在做IoT网关的时候,就是基于OpenWrt改的。
- 技术栈: Linux网络、iptables、UCI配置
- 难度: ⭐⭐⭐⭐
综合项目
智能家居系统(HomeAssistant)
- 项目地址: http://github.com/home-assistant/core
- 推荐理由: 这是一个完整的智能家居系统,支持上千种设备。虽然是Python写的,但架构设计非常值得学习。我在做IoT项目的时候,参考过它的设备管理、自动化规则设计。
- 技术栈: Python、MQTT、REST API
- 难度: ⭐⭐⭐⭐
车载信息娱乐系统(AGL)
- 项目地址: http://git.automotivelinux.org
- 推荐理由: AGL是Linux基金会的车载系统项目,包含了完整的车载软件栈。如果你想往车载方向发展,这个项目必须研究。我在外企做的就是车载项目,AGL的很多设计理念都有参考价值。
- 技术栈: Yocto、Wayland、CAN总线
- 难度: ⭐⭐⭐⭐⭐
工业控制系统(CODESYS)
- 项目地址: http://github.com/beremiz/beremiz
- 推荐理由: Beremiz是一个开源的PLC编程环境,支持IEC 61131-3标准。如果你想往工业控制方向发展,这个项目值得研究。我接过一些工控外包项目,就是用的这个工具。
- 技术栈: PLC编程、实时控制、工业总线
- 难度: ⭐⭐⭐⭐
5. 必刷经典面试题
这些年我面试过不少公司,也面试过不少候选人,总结了一些高频面试题。这些题目不是让你背答案,而是要真正理解背后的原理。
C语言基础
- 指针和引用的区别是什么?
- static关键字的作用有哪些?
- const关键字的作用,const int *p和int * const p有什么区别?
- volatile关键字的作用是什么?什么时候用?
- 宏定义和内联函数的区别?
- 结构体内存对齐的原则是什么?如何手动控制对齐?
- 大端和小端的区别?如何判断系统是大端还是小端?
- 如何实现一个不用第三个变量交换两个变量的值?
- 如何判断一个数是否是2的幂次方?
- 位操作实现加减乘除
数据结构与算法
- 单链表反转的实现
- 如何判断链表是否有环?如何找到环的入口?
- 两个有序链表如何合并?
- 二叉树的前序、中序、后序遍历(递归和非递归实现)
- 如何判断一棵树是否是二叉搜索树?
- 快速排序的实现原理和时间复杂度
- 堆排序的实现原理
- 如何在O(n)时间内找到数组中第K大的元素?
- LRU缓存算法的实现
- 字符串匹配算法(KMP)
操作系统
- 进程和线程的区别?
- 进程间通信的方式有哪些?各有什么优缺点?
- 什么是死锁?如何避免死锁?
- 虚拟内存的作用是什么?
- 用户态和内核态的区别?如何切换?
- 中断和异常的区别?
- 什么是上下文切换?开销在哪里?
- 如何实现一个生产者-消费者模型?
- 什么是内存泄漏?如何检测?
- 缓存一致性问题如何解决?
单片机开发
- STM32的启动流程是什么?
- 中断优先级如何配置?抢占优先级和响应优先级的区别?
- DMA的工作原理是什么?什么时候用DMA?
- 定时器的工作模式有哪些?
- SPI和I2C的区别?各适用于什么场景?
- UART通信如何保证数据可靠性?
- ADC的采样精度如何提高?
- PWM如何实现?占空比如何计算?
- 看门狗的作用是什么?如何使用?
- 低功耗模式有哪些?如何进入和退出?
RTOS
- FreeRTOS的任务调度算法是什么?
- 信号量和互斥锁的区别?
- 什么是优先级反转?如何解决?
- 消息队列和邮箱的区别?
- 如何实现任务间同步?
- 软件定时器和硬件定时器的区别?
- 临界区如何保护?
- 任务栈如何分配?如何确定栈大小?
- 空闲任务的作用是什么?
- 如何调试RTOS程序?
Linux系统编程
- fork()函数的返回值是什么?父子进程如何区分?
- 僵尸进程和孤儿进程是什么?如何避免?
- exec族函数的作用是什么?
- 信号的生命周期是什么?如何捕获信号?
- 守护进程如何创建?
- 线程同步的方式有哪些?
- 互斥锁和自旋锁的区别?
- 读写锁的使用场景是什么?
- 条件变量如何使用?
- 线程池如何实现?
Linux网络编程
- TCP和UDP的区别?
- TCP三次握手和四次挥手的过程?
- TIME_WAIT状态的作用是什么?
- 如何实现一个简单的TCP服务器?
- select、poll、epoll的区别?
- epoll的ET和LT模式有什么区别?
- 如何解决粘包问题?
- 如何实现心跳检测?
- 非阻塞IO如何实现?
- 如何优化网络性能?
Linux驱动开发
- 字符设备驱动的框架是什么?
- file_operations结构体的作用是什么?
- ioctl的作用是什么?如何使用?
- 如何在内核和用户空间传递数据?
- 内核模块的加载和卸载过程?
- 设备树的作用是什么?如何解析?
- 平台设备驱动的框架是什么?
- 中断如何申请和释放?
- 如何调试内核驱动?
- 内核同步机制有哪些?
嵌入式Linux系统
- U-Boot的启动流程是什么?
- 如何移植U-Boot到新的开发板?
- Linux内核的启动流程是什么?
- 如何裁剪Linux内核?
- 根文件系统的作用是什么?如何制作?
- Busybox是什么?如何配置?
- 交叉编译工具链如何生成?
- 如何调试嵌入式Linux系统?
- Buildroot和Yocto的区别?
- 如何优化嵌入式Linux系统的启动速度?
综合应用
- 如何设计一个智能家居系统?
- 如何实现一个实时视频传输系统?
- 如何设计一个低功耗的IoT设备?
- 如何实现OTA升级?
- 如何保证嵌入式系统的安全性?
- 如何进行性能优化?
- 如何处理内存碎片?
- 如何实现多核并行处理?
- 如何设计一个可靠的通信协议?
- 如何进行系统调试和问题定位?
6. 学习建议
最后聊聊学习方法,这是我这6年踩过的坑总结出来的。
不要贪多,要吃透
我见过太多人,今天学STM32,明天学树莓派,后天又去学Arduino,结果啥都没学会。
我的建议是:选一个方向,深挖下去。
比如你想做单片机开发,那就选STM32,把它吃透——GPIO、定时器、中断、通信接口、DMA,每个外设都要自己写代码验证。不要只看视频,一定要动手。
我在某马那会儿,用STM32做了半年项目,把常用外设都摸了个遍。后来换到外企,虽然用的是NXP的芯片,但上手很快,因为原理都是相通的。
理论和实践要结合
很多人学习有两个极端:要么只看书不动手,要么只做项目不看书。
正确的方式是:理论指导实践,实践验证理论。
比如学FreeRTOS,先看书理解任务调度、信号量、消息队列的原理,然后自己写代码验证。遇到问题再回头看书,这样印象最深。
我在外企做车载项目的时候,遇到过一个多任务死锁的问题。当时调试了两天,后来重新看《FreeRTOS内核实现》那本书,才发现是互斥锁使用不当。从那以后,我对RTOS的同步机制理解就特别深刻。
要有自己的项目
面试的时候,面试官最喜欢问:“你做过什么项目?”
如果你只是跟着教程做了几个demo,那没什么竞争力。你需要有一个完整的、能拿得出手的项目。
我的建议是:选一个你感兴趣的方向,自己从零开始做一个项目。比如智能小车、无人机、智能家居,都可以。
关键是要完整——从需求分析、方案设计、硬件选型、软件开发、调试优化,整个流程走一遍。这样的项目,比你做十个教程demo都有价值。
我在某马那会儿,业余时间自己做了一个四旋翼飞控,从原理图设计到PCB打板,从姿态解算到PID调参,全部自己搞定。虽然最后没飞起来(笑),但这个项目让我对嵌入式开发有了全面的认识,后来面试的时候也成了加分项。
要学会看源码
很多人害怕看源码,觉得太难。但其实看源码是提升最快的方式。
我的建议是:从简单的开始看,比如先看一些开源的字符设备驱动,理解框架后再看复杂的。
看源码的时候,不要一行一行看,要抓主线。先看整体流程,再看关键函数,最后再看细节。
我在外企做驱动开发的时候,经常需要参考内核源码。一开始看得很痛苦,后来掌握了方法,效率就高了。现在遇到问题,第一反应就是去看内核源码,往往能找到答案。
要学会提问
遇到问题,不要憋着,要学会提问。但提问也有技巧:
- 先自己尝试解决,Google、看文档、看源码,实在解决不了再问
- 描述问题要清楚,环境、现象、已尝试的方法,都要说清楚
- 选对平台,技术问题去Stack Overflow、CSDN、知乎,不要去微信群瞎问
我在写公众号的时候,经常有读者问我问题。有些人问得很好,我一看就知道他是认真思考过的;有些人就是伸手党,连错误信息都不贴,这种问题我一般不回。
要持续学习
嵌入式这行,技术更新很快。你不学习,很快就会被淘汰。
我的建议是:每天至少学习1小时。可以看书、看视频、写代码,形式不重要,重要的是坚持。
我从28岁开始写公众号,到现在3年了,每周至少写一篇技术文章。这个过程逼着我不断学习新东西,也让我对知识的理解更深刻。
而且持续学习还有一个好处:让你保持竞争力。我现在30岁,在嵌入式领域还算年轻,但如果我不学习,很快就会被95后、00后超越。
要学会总结
学完一个知识点,一定要总结。可以写博客、做笔记、画思维导图,形式不重要,重要的是把知识内化。
我在外企那几年,每学一个新技术,都会写一篇技术文档。一开始是给自己看,后来发现写文档的过程,其实就是梳理思路的过程,对理解帮助很大。
后来我开始写公众号,把这些文档整理成文章发出来。没想到还有不少人看,这也成了我后来创业的基础。
最后说一句
嵌入式这行,说难也难,说简单也简单。难在知识面广,从硬件到软件,从底层到应用,都要懂;简单在只要你肯下功夫,一定能学会。
我一个学机械的,都能在这行混得还不错,你们肯定也可以。
关键是找对方法,坚持下去。
加油,打工人!
更多编程学习资源