转载自知乎大佬 梦人亦冷的回答,问题:该不该放弃嵌入式,单片机这条路?
原文链接:https://www.zhihu.com/question/370606355/answer/1865920389


文章目录

  • 前言
  • 阶段1:大一到大三
    • |关于如何学习嵌入式软件开发
  • 阶段2:大三到研究生入学前
  • 阶段3:研一
  • 阶段4:研二到研三
  • 题外话

前言

我与嵌入式软件开发爱恨交织7年,今年秋招拿到BAT华为等公司45-60W的offer,希望我的经历可以帮到你。(也许很难直接帮到你,但是希望可以帮到许多在校学生)


阶段1:大一到大三

这个阶段我与大多数学生相同,学习本专业知识(EE专业)。学习嵌入式软件开发需要的计算机课程(汇编原理,计算机组成原理,操作系统,C语言等) + 嵌入式项目(来源于实验室项目,自己想到的项目以及各种比赛)。

|关于如何学习嵌入式软件开发

①学习51单片机。

这个阶段你只需要跟着郭天翔的视频去学,只要求实现功能,不求甚解。但建议能够提出问题,比如“为什么往IO控制寄存器写入特定值能点亮LED灯?”“IO口的电路结构是什么样子的?”“什么是上拉下啦,灌电流拉电流?”,这一阶段主要是熟悉单片机的使用,并且在使用中思考发现问题,还能熟悉一些基本概念。

②开始查资料看书。

看模拟电路数字电路等等,开始去弄明白1中所提出的问题。这时候问题主要集中在电路方面。

③开始学习STM32。

随便买个板子,看原子的书跟着一步步去做。这时候你会遇到很多计算机方面的问题,这时候一边学习教程,一边学习:微机原理,编译原理,操作系统。你要弄清楚ARM架构,弄明白CPU如何取指,译码,执行,知道地址总线,控制总线,数据总线如何工作。要弄明白你编译各个阶段产生的各个文件是什么,什么是分散加载,什么是重定位,什么是代码段,什么是数据段,等等。还要能弄明白CPU如何启动,程序镜像在内存中如何布局。要知道中断的原理,以及现场保护等等。最后你了解了各个知识点之后,转向GCC开发STM32,这时候你如果知识掌握得不错,你应该可以很快地学会编写链接器脚本并且明白每一条语句所代表的含义。

④开始增强C语言。

深入挖掘C语言的各个死角。最好可以做到当你写下一条语句的时候知道编译器会如何处理。还需要数据结构和软件工程,建议最好还要学习一下设计模式。开始学习养成良好的代码风格,开始思考代码的结构。可以说设计模式如果能学好,在往后学习LINUX内核时大有裨益。你会发现linux的输入子系统有点像职责链模式,会发现ASOC音频系统有点像模板方法模式。私以为,如果能在两个以上不同方面考察同一种编程思想,你会得到更加深刻的理解,更能领会其精华。

⑤认真研读OS方面的书。

各个知识点都要弄明白,进程是什么程序是什么线程是什么,竞争死锁优先级反转,虚拟地址空间物理地址空间,用户空间内核空间等等。开始学习ucos,这个没什么可说的,如果在2中能熟练掌握各种知识点,知道CPU如何中断如何保护恢复现场,那么读ucos的源码时候,在原理上就不会有什么疑惑。如果能在4中养成把握代码整体结构的能力并且学习好数据结构和基本的算法,读源码就没有什么障碍。一旦原理弄通了,源码也能读懂,那么吃透ucos就是顺理成章的事情。

⑥自己仿照ucos写一个stm32上的实时os出来。

⑦进军LINUX。

学习LINUX的基本使用,看赵炯那本内核剖析,啃LINUX内核设计与实现,把握总体的内核架构。之后可以学习驱动,看建议陈学松老师的书,弄明白基本的驱动架构和如何编写简单的驱动,认真对待,这里强调一下设备驱动模型。最后啃LINUX内核源码情景分析,上下两册用心读,这里着重强调一下内核中的VFS部分。之后就是看宋宝华老师的书,进一步学习驱动开发。最后。。。。。。。看内核源码看内核源码看内核源码。

⑧其它的什么SPI,IIC,什么DMA,都只是技能问题,只要知识学的好,技能想咋点就咋点。


阶段2:大三到研究生入学前

这个阶段我在工作与考研之间无比纠结,并在此期间无数次常思考嵌入式开发到底是什么,如何把嵌入式开发做好,以后该选择怎样的一条职业道路。为此,像很多人一样,在知乎上像做嵌入式开发的前辈们咨询过多次。

在这个阶段,我学习了Linux驱动开发,并渐渐认识到,嵌入式开发是一个比较偏软件的岗位(我认为大多数学生做的工作都是嵌入式软件开发,而不是硬件开发),应该深入学习计算机体系结构的知识,而不是把那些无聊的嵌入式相关项目翻来覆去的做(尤其少参加乱七八糟的比赛)。

最终,我选择了读研,想站的再高一点看这件事。

阶段3:研一

进入研究生阶段(2018),当大家都火急火燎的加入AI的阵营时,我依然对嵌入式爱的深沉。选课时,我选择了嵌入式实时操作系统,计算体系结构相关的课程,还看了很多相关的书籍,依然每周保持嵌入式Linux的学习。

时不与我,明明选择了做底层的导师,结果导师转做深度学习了,还好是做终端+AI相关的方向,也不算完全偏离嵌入式,这让人多少有点欣慰(毕竟我还是放不下嵌入式的)。在这个阶段,由于接触了不少的人和事,我越来越认识到,嵌入式只是一个平台,切勿把嵌入式看作一个具体的岗位,无论硬件还是软件。

因此,我对这个岗位以及行业就业现状有了更进一步的认识。解读可以看这个链接:

答主梦人亦冷的回答:普通一本研一电子与通信工程想走嵌入式方向该怎么学?

【注意这个回答认为很重要。】

阶段4:研二到研三

在这个阶段,我对狭义嵌入式(驱动,应用开发)完全释怀,因为我认为许多人喜欢的嵌入式并不是驱动或者应用等开发,而是对底层系统的一种好奇心与掌控时的快感。与其说喜欢嵌入式,还不如说喜欢的是计算机体系结构。因此,只要是涉及到硬件的软件开发,我都喜欢,我也将其均定义为嵌入式。

因为嵌入式软件开发就是建立在底层语言,计算机组成原理,操作系统等知识上的一种软件开发,如果你想将嵌入式开发做好,你就得学好这几门课程 ,如果你学好了这几门课程,底层软件开发工作的岗位你应该都能胜任。因此,又何必将嵌入式开发狭义的划到驱动开发,XX协议开发之类的呢?(向钱看)

最终,这个阶段我毅然放弃了Linux驱动的学习,投入了Python深度学习的怀抱中。

我不再关注我到底做的是不是嵌入式开发,只关注和嵌入式平台有没有关系。

我研究的是如何把一个深度学习模型部署到嵌入式平台上去。有人可能会疑问,这和嵌入式开发有什么关系?为什么没有关系呢?在嵌入式平台上用C语言编写神经网络模型的前向推理,这不是把我们的C语言和组成原理的知识发挥出来了吗?当图像处理程序性能不足时,查看生成的汇编程序,当汇编效率不高时,将C语言替换为我们自己写的汇编代码,这还不够嵌入式吗?

其实,当我们把思路放宽后,嵌入式就不再是某一个具体的岗位了,它有可能是AI算子工程师,AI编译器开发工程师,FPGA加速工程师,高性能工程师等等。这些岗位需要的技能与嵌入式工程师极为相似,年薪却最低30W起。

为什么?很简单,供需关系决定价格!嵌入式早已江河日下,但嵌入式+某一风口就能迈向高薪之路,这个道理在任何技术领域都是通用的。 2018年-2021年,嵌入式+AI=高薪,未来嵌入式+XX也可以。至于未来的风口是什么,就要靠我们自己去探索了。只要保证我们自己有核心的知识储备,再学习一下风口相关的技术,立马就能咸鱼翻身。在视野拓宽后,我去了2家大公司实习,后续我陆续收到了很多公司的offer。里面既有纯算法(计算机视觉)的岗位(50-60W),也有异构计算的岗位(45-55W),也有AI芯片工具链相关的岗位(45W-50W)。

回头看,我好像已经2年没有学习过嵌入式开发了,但是好像依旧在嵌入式学习的路上。到底要不要放弃嵌入式这个问题我没法给出答案,但如果把看待嵌入式的视角变一变,生活可能会变的更好。


题外话

这个分割线下面,我是想补充一些题外话,也是近几年做技术的一些所察所想。

首先我想说一个很匪夷所思,却又相当普遍的现象:当我们技术人员对行业薪资不满意时,往往不像其他人一样良禽择木而息,而是对自己的技术能力开始质疑,然后不断打磨精进,期望获得更高的薪资。在此期间,不但会质疑自己,还会用所处行业的大佬XXX来作为自己的精神支柱。这种精神支柱不但给予了前进的动力,也为自己当下生活的不满意提供了合理的解释。毕竟,“我”的确是与大佬有差距的,因此,我的现状是应该的。但是,现实是,技术为我们带来的薪资高低往往取决于市场的需求。

讲到这,造成焦虑与痛苦的来源好像不言而喻了,就是既没有当前行业的顶尖能力,又没有迎合市场的乐趣。这一点在嵌入式相关的行业似乎尤为明显。为什么?嵌入式开发是一门非常吸引人的技术,能为人提供较多的乐趣(起码对我来说),且从事这一技术岗位的人,往往非常务实和本分。这里有一个似乎很新颖的观点,为什么做嵌入式的人就“本分”了呢?我的答案是,因为这些人在诸多选择中选择了嵌入式,而且多年都不曾因就业大环境而改变(例如我自己)。嵌入式如同一个IT行业的“本分”筛选器,越是筛选,剩下的人就越“本分”。这种“本分”当然也与嵌入式带来的兴趣和满足感是有关的。

作为对比,我们看看android ios开发,当初android ios开发大火后,很多人涌入进去了,异常火爆。也就过了那么几年,android ios开发的人却指数下降了,为什么?这些人本来就是来投机的,想找个好工作,兴趣成分非常少!既然没兴趣,行业造就岗位也变少了,那就溜了,但嵌入式还真不是!以我自己为例,身边还在做嵌入式的朋友,可谓是相当“本分”了,人都非常的nice!踏实,精益求精,极其有“工匠精神”,让我非常佩服。

事与愿违,因为钱的缘故,我没法“本分”下去了。当我不“本分”后,生活也仿佛变的更好了,这里我可以讲一个我个人的故事。由于我不“本分”了,从事了风口工作,除了我正式的工作外,还有小公司请我兼职他们公司的项目,一年给我开30W(合同给我,我拒签了,因为我想“本分”的好好工作)。。。。。如果加上这份兼职和我正式的年薪,相当于毕业第一年就有接近90W的年收入,这是我以前做嵌入式时想都不敢想的事情。在这里,我并没有炫耀的意思,只是想传递一个自己的感悟。要么获得当前行业的顶尖能力,要么就迎合市场,两者不一定冲突。

放下手中的《c ++ primer》,拿起其他书读一读,可能是当下普通工程师最缺失的教育。


P.S.1 转载时略有删减,全文请点击原网址。 「2021.5.9 12:21」

该不该放弃嵌入式,单片机这条路?(答主梦人亦冷:我与嵌入式软件开发爱恨交织7年)相关推荐

  1. 该不该放弃嵌入式,单片机这条路?

    不管在哪里,总是能碰到很多喷做嵌入式的,特别是做单片机开发. 既要懂硬件,又要学编程,拿的还比纯软件少,总是感觉吃亏了. 在这物欲横流的年代,大多数人都很浮躁,对目前所学专业或者所从事的工作不满意. ...

  2. 【小白】【大学】一名嵌入式软件开发小白的单片机学习历程、心路历程、经验分享

    我的嵌入式学习之路 我为什么写这篇文章 先简单介绍一下我自己 与每一个技术小白共勉 这篇文章写给谁 我的学习经验分享 我的成长之路 我的单片机学习历程分享 51系列单片机学习历程 预备知识:(可以查百 ...

  3. 放弃51单片机直接学32是因为51难找工作?

    大家好,我是华维蔵鹰,现在很多初学者都存在一个误区,受互联网的影响被带了节奏,觉得51单片机已经几乎无用武之地:嵌入式的开发岗位缺口大,这是个不争的事实,但是51单片机绝对会拥有自己的一席之地. 大多 ...

  4. oracle 取记录最大的那条记录_相机记录高三备考生的一天,看哭万人: 读书虽苦,却是最容易的那条路!...

    备战高考的这一整年,都是值得纪念的.为了一个梦想,拼尽全力,有一组照片记录了高三学生的一天,很多看到的家长和同学都说"戳中了内心",小数老师仿佛也回到了那个记忆中的高三.清晨六点十 ...

  5. 10条关于嵌入式软件开发测试的秘诀

    在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1(实际上可能更 多).这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对一般人来讲很重要.很多年前,一位开发人员 ...

  6. 该不该放弃单片机,嵌入式这条路?

    作者:TopSemic 链接:https://www.zhihu.com/question/370606355/answer/1137000299 来源:知乎 写一写我的经历. 我是2011年本科自动 ...

  7. 嵌入式单片机传统学习方法,毫无疑问这是极其耗费时间的一个路子

    基本学习路线 首先C语言编程->电路基础->高级C语言编程->数字电路基础->汇编原理->单片机C语言编程->模拟电路基础->Linux操作系统->数据 ...

  8. 放弃51单片机,直接学STM32开发会有什么严重的问题?

    本人从事单片机开发10年,我一直认为只有起点和你差不多的人,经历过的路,才具备参考的价值. 别人开局就是一套终极装,在各种资源背景加持下经历像开挂一样,你参考个锤子啊. 我当初是电气工程转行到嵌入式单 ...

  9. 机械毕业本科生竟被嵌入式单片机公司录取?

    之前在网上看到一个问题:机械本科毕业生被一家做单片机嵌入式的公司录取该去吗? 下面来聊聊个人看法. 机械本科毕业生被一家做单片机嵌入式的公司录取,这太不可思议了! 只能说他非常幸运,很多读这个专业的都 ...

最新文章

  1. 分析了 600 多种烘焙配方,机器学习开发出新品
  2. 【转载】python学习之 字符串前'r'的用法
  3. afn text html,关于AFN请求返回的数据格式
  4. mysql workbench 从model建库_使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结...
  5. 附9 elasticsearch-curator + Linux定时任务
  6. 第三次scrum冲刺
  7. JavaScript 是如何成为一门严肃的编程语言的
  8. ORACLE查询不可用状态索引
  9. python读取matlab数据_详解如何在python中读写和存储matlab的数据文件(*.mat)
  10. Steam游戏Hacknet部分命令备份
  11. puppet成长日记四 Exec资源详细介绍及案例分析
  12. m序列的产生原理及其性质
  13. C语言——输入两个正整数m和n,求其最大公约数和最小公倍数
  14. SEO学习笔记一:Google搜索引擎背后的运作模式
  15. 转发:不懂朗姆酒?那你就out了!
  16. Linxu命令(3)
  17. php gbk转utf8
  18. android调用fragment的方法,Android Fragment基本使用
  19. DDCTF2018(╯°□°)╯︵ ┻━┻writeup
  20. 数据挖掘学习——SOM网络聚类算法+python代码实现

热门文章

  1. 功夫大师——中国智能跆拳道训练专家
  2. 从0-1带你手写代码生成器(Java版)
  3. 左乘行向量 右乘列向量 置换矩阵(permutation matrix)
  4. 《电子商务概论》期末考试题总结
  5. WIFI 模块 串口 调试 助手
  6. centos上面谷歌浏览器安装
  7. java跨平台 ios_Smobiler如何实现.net一键开发,ios和android跨平台运行
  8. 一位未来程序猿的成长历程
  9. JS 颜色16进制转rgb,rbg转16进制
  10. java基于springboot框架开发的办公自动化OA系统