干货满满,从学习路线+学习书籍+练手项目都总结好了!
你们好,我是仲一,作为一个今年拿下oppo,红米等十余家大厂offer的学长回答下。近来有公众号粉丝常常问我,怎么学习嵌入式。粉丝有要求,俺们必需安排上。
不得不说,下班了是真的忙,每晚只能抽上班回去的一个多小时写文章。这篇8000字的文章足足写了11天,更改了十几次。总算在八月下旬总算肝完了这篇文章。下边开始本文的内容,干货满满!
我个人是从STM32转入驱动开发的,在研二的时侯学习了韦东山老师的驱动开发的课程,转入了驱动开发的方向。下边就怎么学习嵌入式说下我个人的见解。
哪些是嵌入式?
嵌入式即嵌入式系统,IEEE(日本电气和电子工程师商会)对其定义是用于控制、监视或则辅助操作机器和设备的装置,是一种专用的计算机系统。
国外普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为基础,软硬件可剪裁,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以囊括机械等附属装置。嵌入式系统作为装置或设备的一部份,它是一个控制程序储存在ROM中的嵌入式处理器控制板。
事实上,所有带有数字插口的设备,如腕表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。
嵌入式方向
嵌入式工程师须要把握的内容十分广泛,主要包括嵌入式软件、嵌入式硬件、以及相关行业、产品的专业知识。作为嵌入式初学者,我们不可能,也没有这么多精力把所有的知识到搞的很精通,我们要学会捉住重点,学会抉择,达到一通百通,事半功倍的学习疗效。首先嵌入式技术主要分为嵌入式软件和嵌入式硬件两大方向。
嵌入式硬件方向
嵌入式硬件工程师主要工作职责是为产品设计硬件电路原理图,设计硬件PCB板,选择合适的元元件,点焊调试硬件电路板,保证硬件电路板的可靠性、稳定性和抗干扰能力。
由于如今集成电路发展迅速,大部份集成电路厂商还会提供参考电路,所以硬件电路原理图的设计相对来说比较简单,硬件工程师工作的含金量主要彰显在产品的可靠性和稳定性设计、以及电磁兼容设计,这才是硬件设计工程师的含金量所在。
要成为一个资深的嵌入式工程师相当难,一方面要有十分扎实的理论知识,同时也要有相当的那个小型的、高频CPU、多层PCB板的设计经验。
嵌入式硬件工程师要学的课程主要有模拟电路设计、数字电路设计、电磁波理论等。熟悉常用的放大电路、滤波电路、电源电路设计和剖析。
嵌入式软件方向
嵌入式软件工程师的职责主要是依据产品的功能需求设计好软件,让硬件工作上去。
嵌入式电子产品硬件部份,大部份都是相同的,核心的都是由CPU、RAM和FLASH几大部份组成,而软件就千差万别了。产品的具体功能都是由软件来实现的,通常来讲一个产品的实现,软件设计的工作量是硬件设计的4~5倍。
所以通常情况下,一个公司的软件工程师数目是硬件硬件工程师的4~5倍嵌入式linux应用程序开发详解,嵌入式软件工程师需求比硬件工程师院好多,同时跟硬件工程师相比,嵌入式软件工程师学上去相对容易些,所以这儿我重点和你们谈一下嵌入式软件工程的学习路线。
码字不易,假如认为本篇文章对你有帮助,可以双击下屏幕,点个免费的赞支持作者@仲一
学习嵌入式须要这些内容?C语言
C语言是嵌入式的重中之重,Linux操作系统就是用C实现的,包括安卓系统的底层也是C语言实现的,基础不牢,地动山摇,一定要打好基础。
C语言学习过程中重点要置于表针,结构体,文件的处理,链表等。在学习过程中,一定要多写代码,代码光看是看不会的。
遇见错误不要怕麻烦,擅于使用搜索工具,百度,googlearm linux,stackoverflow。要晓得,你遇见的问题他人肯定也会碰到过,通常在网上一搜都会有答案。
最后嵌入式linux应用程序开发详解,要多调试程序,熟悉调试的过程。程序三分写,七分调,没有谁的程序是可以一遍写对的。并且,多调试程序也可以让我们理解程序具体是怎样执行的。
基本的硬件原理
嵌入式肯定要和硬件打交道的。假如做嵌入式的应用层的话,可能和硬件接触的少一点。并且好多企业在笔试的时侯,也会问一些基本的硬件知识。
例如,我朋友在笔试高通的C++工程师的时侯,就问到了他好多关于硬件的知识(中断是哪些,协程是哪些,两者有哪些区别,一个基本嵌入式系统有哪些构成等),所以说硬件知识晓得越多越好,即使做应用层,一些最基本的也要晓得。
假如是准备做嵌入式底层的话,对于硬件知识的把握要求就比较高了。例如,LCD是怎样显示的,IIC合同/SPI合同是哪些,怎么收发数据,不同设备对于IIC的速率有哪些要求,IIC合同上拉内阻通常是多少等等。只有明白了硬件原理,在看芯片指南的时侯才会明白怎么去配置各个寄存器。
据悉,常用的设备仪器的使用能把握就更好了,和硬件工程师和稀泥的时侯会用到。例如,万用表,示波器,逻辑剖析仪等。不会也没关系,这部份不是必须的。
数据结构与算法
这部份是程序员的选修课。在各大厂的秋招春招中,面试笔试都是必考的。常见的数据结构如数组,二叉树,堆,队列,常见排序算法及其改进(快排,归并,冒泡,插入)等都是要把握的。假如是为了找工作,这部份内容有好多是要能达到手写的目的。(相关内容见我整理的嵌入式软件工程师面试笔试手册)
尽管嵌入式对于数据结构与算法的要求不像传统互联网这么高,但是,这种数据结构在之后的工作中不一定可以用到,而且一些基本的我们还是要晓得的。
像Linux内核中就用到了好多的数组,二叉树等。把握这部份内容对于我们之后跳槽,深入研究操作系统都有很大的帮助。
计算机基础
这部份直接决定了我们之后是否能走的更远,像操作系统的基本概念,计算机组成原理的内容都是须要我们去了解的。例如载流子锁,讯号量,阻塞与非阻塞等。
学习任何技术一定要学到这门技术的边界,对于嵌入式来讲,它的边界就是汇编。汇编语言不要求会写,而且一定要能读懂(虽然就是Arm指令集)。在好多情况下,看反汇编文件对于bug的调试会更便捷。
学习路线推荐入门:51+STM32
主要学习内容
中断、定时器、串口、NANDFLASH、网络控制器、LCD屏、触摸屏等的工作原理。
学习资源推荐
视频:野火,正点原子
书籍:野火,正点原子
学习建议
假如你之后的方向是驱动开发,这部份学习的话重点放到硬件知识的理解。买个开发板,学习下她们的类库是怎样写的,常用嵌入式外围设备的硬件工作原理,以及怎样使用C语言来编程、控制那些硬件。把基本的外设都学习一遍,不求就会写,而且硬件原理一定要厘清楚。
进阶:ARM-A+Linux
这部份主要分为两个方向:Linux应用开发,Linux驱动开发。下边我会对这两个方向分别进行说明。
有了之前的单片机基础,上手Linux开发都会快一点。可以买个ARM-A内核的开发板,ARM-A和stm32好多地方都是相通的,理解上去不难,两者最大的差异在于开发环境,好多菜鸟入门Linux开发在搭建环境时就被劝退了。学习ARM-A前可以先看下《ARM体系结构与编程》,再去看韦老师视频的话会理解快一点,视频中提到的难理解的这儿基本都有。
推荐一个github库房,里面放了上百本精典的嵌入式,计算机书籍,可以star一下,上次找书直接在里面搜索就可以了:github书籍宝藏库房github访问不了可以访问这个:gitee书籍宝藏库房应用开发
主要学习内容
Linux系统调用概念,多进程,多线程实现多任务开发,多任务的同步互斥开发:互斥锁、信号量,网路数据通讯过程,TCP/IP合同,Socket编程、TCP网路编程、UDP网路编程,QT编程。
学习资源推荐
书籍:《Unix环境中级编程》,《Unix网路编程》,《QtCreator快速入门》
视频:这部份视频没看过,可以在哔哩哔哩搜索下,找播放量高的就可以。
驱动开发
主要学习内容
Bootloader的工作流程、UBOOT的编译、裁剪与移植、Linux内核的编译、裁剪与移植,根文件系统的建立、BootLoader、内核和根文件系统的烧录。
重点驱动框架如:字符设备驱动、块设备驱动、LCD设备驱动、触摸屏设备驱动,总线设备驱动模型,输入子系统模型等。
学习资源推荐
书籍:《Linux设备驱动开发解读》《Linux设备驱动程序》
视频:强烈推荐韦东山老师!!
学习建议
对照视频一点一点学习的过程中,刚开始第一遍看的话会有好多地方不明白,不要紧。假如在查阅了一些资料后还是不明白,可以先往前放放,不用揣测。内核的许多东西一旦考量上去,越陷越深。
作为初学者,学习驱动开发主要学习驱动的框架(例如,输入子系统模型常用的一个函数input_attach_handler()这个函数,刚开始我们只须要晓得他是拿来匹配dev设备和驱动软件就可以,暂时可以不用晓得这个函数内部是怎样实现的)。有一定基础以后,可以再去考量其中的某个点,思索她们为何如此写。
码字不易,假如认为本篇文章对你有帮助,可以双击下屏幕,点个免费的赞支持作者@仲一
高手:各种复杂驱动
通常自学能到第二个阶段就早已相当不错了。复杂驱动部份通常是在工作学校习的。像Android驱动,音视频驱动,usb驱动,wifi,蓝牙合同,内核开发等都是比较深入一点的东西了,随意掏出一块内容,深入钻研下都可以成为这个领域的专家。
学习资源推荐
书籍:这部份方向好多,我自己对好多方向也不了解。分享几本不错的内核书籍,《Linux内核设计与实现》《深入理解LINUX内核》《深入Linux内核构架》
视频:哔哩哔哩搜索【Linux内核精讲】
总结在学习的过程中,我们应当捉住不变的东西,考虑下那些不变的内容是否对我们之后把握变化的东西有帮助。不管是学习任何技术,一定要学到这门技术的边界。对于嵌入式开发来讲,汇编kali linux,这就是软件的边界。常常会在往上看见有人讨论,嵌入式有35岁危机吗?不能说没有,只能说压力相比于互联网可能会小点。嵌入式相对于互联网来讲,技术的更新迭代没有这么快。倘若能在嵌入式某个领域深入研究,构建起技术的护城河,其实职业生涯会长一点。聪明,好奇,协作,忠诚,随遇而安。推荐一个github库房,里面放了上百本精典的嵌入式,计算机书籍,可以star一下,上次找书直接在里面搜索就可以了:github书籍宝藏库房github访问不了可以访问这个:gitee书籍宝藏库房
练手项目推荐这篇文章:
面试笔试推荐我写的免费知乎专栏:
码字不易,假如认为本篇文章对你有帮助,可以双击下屏幕,点个免费的赞支持作者@仲一