③ 开始学习STM32。随便买个板子,看原子的书跟着一步步去做。这时候你会遇到很多计算机方面的问题,这时候一边学习教程,一边学习:微机原理,编译原理,操作系统。你要弄清楚 ARM 架构,弄明白 CPU 如何取指,译码,执行,知道地址总线,控制总线,数据总线如何工作。要弄明白你编译各个阶段产生的各个文件是什么,什么是分散加载,什么是重定位,什么是代码段,什么是数据段,等等。弄明白 CPU 如何启动,程序镜像在内存中如何布局。要知道中断的原理,以及现场保护等等。最后你了解了各个知识点之后,转向 GCC 开发 STM32,这时候你如果知识掌握得不错,你应该可以很快地学会编写链接器脚本并且明白每一条语句所代表的含义。
④ 开始增强 C 语言。深入挖掘C语言的各个死角。最好可以做到当你写下一条语句的时候知道编译器会如何处理。还需要数据结构和软件工程,建议最好还要学习一下设计模式。开始学习养成良好的代码风格,开始思考代码的结构。可以说设计模式如果能学好,在往后学习 LINUX 内核时大有裨益。你会发现 LINUX 的输入子系统有点像职责链模式,会发现 ASOC 音频系统有点像模板方法模式。私以为,如果能在两个以上不同方面考察同一种编程思想,你会得到更加深刻的理解,更能领会其精华。
阶段 2大三到研究生入学前这个阶段我在工作与考研之间无比纠结,并在此期间无数次常思考嵌入式开发到底是什么,如何把嵌入式开发做好,以后该选择怎样的一条职业道路。为此,像很多人一样,在知乎上像做嵌入式开发的前辈们咨询过多次。在这个阶段,我学习了 Linux 驱动开发,并渐渐认识到,嵌入式开发是一个比较偏软件的岗位(我认为大多数学生做的工作都是嵌入式软件开发,而不是硬件开发),应该深入学习计算机体系结构的知识,而不是把那些无聊的嵌入式相关项目翻来覆去的做(尤其少参加乱七八糟的比赛)。最终,我选择了读研,想站的再高一点看这件事。
研一进入研究生阶段(2018),当大家都火急火燎的加入 AI 的阵营时,我依然对嵌入式爱的深沉。选课时,我选择了嵌入式实时操作系统,计算体系结构相关的课程,还看了很多相关的书籍,依然每周保持嵌入式 Linux 的学习。时不与我,明明选择了做底层的导师,结果导师转做深度学习了,还好是做终端+AI相关的方向,也不算完全偏离嵌入式,这让人多少有点欣慰(毕竟我还是放不下嵌入式的)。在这个阶段,由于接触了不少的人和事,我越来越认识到,嵌入式只是一个平台,切勿把嵌入式看作一个具体的岗位,无论硬件还是软件。因此,我对这个岗位以及行业就业现状有了更进一步的认识。
研二到研三在这个阶段,我对狭义嵌入式(驱动,应用开发)完全释怀,我认为许多人喜欢的嵌入式并不是驱动或者应用等开发,而是对底层系统的一种好奇心与掌控时的快感。与其说喜欢嵌入式,还不如说喜欢的是计算机体系结构。因此,只要是涉及到硬件的软件开发,我都喜欢,我也将其均定义为嵌入式。因为嵌入式软件开发就是建立在底层语言,计算机组成原理,操作系统等知识上的一种软件开发,如果你想将嵌入式开发做好,你就得学好这几门课程 ,如果你学好了这几门课程,底层软件开发工作的岗位你应该都能胜任。因此,又何必将嵌入式开发狭义的划到驱动开发,XX协议开发之类的呢?最终,这个阶段我毅然放弃了 Linux 驱动的学习,投入了 Python 深度学习的怀抱中。我不再关注我到底做的是不是嵌入式开发,只关注和嵌入式平台有没有关系。我研究的是如何把一个深度学习模型部署到嵌入式平台上去。有人可能会疑问,这和嵌入式开发有什么关系?为什么没有关系呢?在嵌入式平台上用 C 语言编写神经网络模型的前向推理,这不是把我们的C语言和组成原理的知识发挥出来了吗?当图像处理程序性能不足时,查看生成的汇编程序,当汇编效率不高时,将 C 语言替换为我们自己写的汇编代码,这还不够嵌入式吗?其实,当我们把思路放宽后,嵌入式就不再是某一个具体的岗位了,它有可能是 AI 算法工程师,AI编译器开发工程师,FPGA加速工程师,高性能工程师等等。