为什么会有这些博客
自己现在已经要进入大三下学期,很快就会面临秋招,自己从进入大学开始就从事嵌入式相关的开发,从arduino到STM32再到ARM+Linux开发,自己接触了不少的东西,写这些博客一个是为了对自己以往的知识进行一个总结,再一个也是希望可以给入门嵌入式的各位同学们提供一些帮助,都是从无到有,从看别人的到写自己的也是一个分享的过程。
可能大家觉得总结并不是特别的重要,但是我想说把知识组成体系是十分必要且有益的,尤其对于嵌入式来说,我可以小声的说一句,嵌入式涉及的东西确实多而杂,你接触许多方面的知识,从硬件到软件,从驱动到网络,从汇编到面向对象,从裸机到操作系统,很多知识如果不加以组织,不把他们变成体系,看了就忘基本是学习的常态。
嵌入式需要什么
岗位分类
首先来说嵌入式是一个比较宽泛的概念,大体来说面向应届生的岗位可以分为几种:嵌入式硬件、单片机开发(裸机)、嵌入式驱动(Linux)、RTOS嵌入式开发、Linux嵌入式开发
- 嵌入式硬件
这个其实和硬件工程师差不多,需要有原理图、PCB绘制、高速接口走线优化、电路板排错的能力,这个的话更偏重于硬件、接口方面的知识,偏向于底层 - 单片机开发(裸机)
单片机裸机开发也是有很大的市场的,相信我们每一个搞嵌入式的都接触过单片机,但是裸机开发并没有那么简单,一般是前后台系统或者使用状态机进行调度,所做的工作和产品的用途以及定位紧密结合。 - 嵌入式驱动(Linux)
嵌入式驱动主要是来搭建一个系统到硬件的桥梁,多为Linux的驱动开发,Linux经过20多年的发展已经形成的较为成熟的驱动框架和开发的流程,不过这个工作大部分会在IC原厂完成,大部分的专注做产品的公司对于驱动的要求是可以跑起来或者对底层驱动进行一定的优化和封装,而在IC原厂或者有底层开发需求的大企业则会有较多的驱动工程师需求,要成为较为优秀的驱动工程师不仅要可以在框架下完成驱动的编写,更重要的是要对内核有一定的了解,了解内核的机制,还要掌握接口和硬件的知识,可以完成与硬件工程师的沟通与联调 - RTOS嵌入式开发
很多产品裸机不能实现他的需求上Linux又会拉高成本,或者对实时性有较高的要求,比如物联网设备、飞控等等,这样的产品会使用RTOS系统进行开发,常见的包括开源的FreeRTOS、资料最丰富的但是商用收费的UCOS、国内地开源新星Rt-Thread、华为的Lite OS等等。对于RTOS嵌入式开发需要对一款甚至多款RTOS有使用的经验,最好可以对内部的重要机制有过研究(进程管理、中断处理、同步管理等),同时也要了解一些协议栈库的使用(LWIP、MQTT等),少数岗位也要求对UI界面的开发有了解(Emwin、柿饼等) - Linux嵌入式开发
Linux嵌入式开发一般是在Linux操作系统下做一些应用层的开发工作,以C语言为主,有的也需要C++,跑Linux的产品一般是有音视频处理需求、较高的网络需求、图形界面的开发需求中的一个或多个,所以对Linux系统编程尤其是多线程编程和网络编程的要求较高,如果是做图形界面的话也会要求有QT的开发经验,当然现在好多的企业也在用Android来做图形界面,但是我了解到的Android底层开发还是难度较高的,需要有Linux底层为基础再有Android框架的加持,应届生做这个的不是太多
这上面列出来的五个方向当然不是每一个都要做好,多而不精是没有意义的,应当选定一两个进行深入的学习,对我来说我目前深耕的领域是Linux的驱动开发,但是只做驱动的话路子比较窄,所以也在学习Linux嵌入式开发的内容,努力成为一个Linux平台从底层驱动到上层应用都能游刃有余的高级工程师(路漫漫)
招聘需求(所需技术栈)
如果你学习一个技能或者方向是为了找一份相关的工作的话,那么看一看招聘信息你就可以大致了解到你需要学会什么
- 嵌入式驱动(Linux)
- Linux嵌入式开发
看了以上的图片我们可以做一个总结
驱动工程师需要的技能的包括:熟练的C语言使用、对操作系统的原理有较深的认识、Linux的常用外设的驱动框架、uboot+kernel+rootfs+第三方库移植流程、对Linux内核有一定的深入了解、能读懂硬件原理图
Linux嵌入式开发工程师在招聘需求上写的比较笼统,但我们依旧能归纳出一些来:熟练的C语言使用且最好会用C++、数据结构、Linux系统编程、要对计算机网络和操作系统这两个部分基础知识有了解
接下来我们将对每一块知识做一个分解画一个思维导图出来
技能分解及思维导图
我们可以从底层当上层将Linux嵌入式工程师所需的技能进行分解。
注意: 因为很多知识并不能简单直接分开,这只能算是我个人的理解,如果有不同的意见也欢迎指出
- 基础
这个基础是独立于底层、驱动、系统、应用的,而是作为一个软件相关的从业者应当掌握的基础知识。包括:C语言(尽可能的熟悉)、数据结构(链表、队列、栈、二叉树等(对图的需求较少))、算法(递归、排序、二分查找、搜索、哈希算法等)、操作系统的基础知识、计算机网络的基础知识 - 底层
底层这里涉及的就是一些电路相关的知识,比如如何去读原理图(简单的比如三极管的驱动电路)、以及某些外设接口的电路特性(IIC接口上拉),这部分的要求其实是比较少的 - 驱动
这部分对于驱动工程师来说是核心的内容,包含字符驱动框架、Platform设备驱动、IIC总线驱动、SPI设备驱动、GPIO和Pinctrl子系统、块设备驱动、Input子系统、Framebuffer子系统、驱动中的中断处理、驱动中的同步机制等,更加重要的是不仅仅要会改代码,而且要体会Linux内核驱动的框架与机制,从而可以通过学习几个子系统来举一反三 - 系统
我这里的系统并不仅仅指Linux而是指整个嵌入式系统层面的技术,这里首先包含uboot、Linux内核、rootfs的裁剪与移植,这个其实想要做到熟练是需要大量的项目经验的,我们也不需要去深入代码层次的理解,而是要体会系统启动的整个流程,熟知每个部分的作用,并能进行移植操作。
还有一个就是对Linux内核的理解了,内核是特别深的,作为应届生想要有较深的理解其实是很难的,但是我们要尽自己所能的去了解和学习,对内核的学习我很赞成宋宝华老师的观点,先要有总体的认识然后在逐渐的深入,最后对每一块进行逐个的攻破 - 应用
应用层面主要包含:Linux系统编程(尤其是网络和多线程部分)、C++及面向对象的内容、QT开发
简单的思维导图如下
在接下来的博客中我争取对各个部分的知识进行一个总结,当然如果以前有写过不错的总结博客我就不会再写了,而是把以前博客的链接贴出来