嵌入式学习路线

【干货分享】嵌入式学习路线公开!(书籍推荐+视频推荐+练手项目) - 极术社区 - 连接开发者与智能计算生态

哈喽,大家好,我是仲一。最近有小伙伴在微信私信我,如何学习嵌入式。一直想写一篇学习路线的文章,由于各种原因拖到了现在。趁着国庆节在家,终于肝完了这篇文章。

我个人是从STM32转到驱动开发的,在研二的时候学习了韦东山老师的驱动开发的课程,转到了驱动开发的方向。下面就如何学习嵌入式说下我个人的看法。

什么是嵌入式?

嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统

国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。

从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。嵌入式系统作为装置或设备的一部分,它是一个控制程序存储在ROM中的嵌入式处理器控制板

事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。

嵌入式方向

嵌入式工程师需要掌握的内容非常广泛,主要包括嵌入式软件、嵌入式硬件、以及相关行业、产品的专业知识。作为嵌入式初学者,我们不可能,也没有那么多精力把所有的知识到搞的很精通,我们要学会抓住重点,学会取舍,达到一通百通,事半功倍的学习效果
首先嵌入式技术主要分为嵌入式软件和嵌入式硬件两大方向。

嵌入式硬件方向

嵌入式硬件工程师主要工作职责是为产品设计硬件电路原理图,设计硬件PCB板,选择合适的元器件,焊接调试硬件电路板,保证硬件电路板的可靠性、稳定性和抗干扰能力

因为现在集成电路发展迅速,大部分集成电路厂商都会提供参考电路,所以硬件电路原理图的设计相对来说比较简单,硬件工程师工作的含金量主要体现在产品的可靠性和稳定性设计、以及电磁兼容设计,这才是硬件设计工程师的含金量所在

要成为一个资深的嵌入式工程师相当难,一方面要有非常扎实的理论知识,同时也要有相当的那种大型的、高频CPU、多层PCB板的设计经验

嵌入式硬件工程师要学的课程主要有模拟电路设计、数字电路设计、电磁波理论等。熟悉常用的放大电路、滤波电路、电源电路设计和分析

嵌入式软件方向

嵌入式软件工程师的职责主要是根据产品的功能需求设计好软件,让硬件工作起来

嵌入式电子产品硬件部分,大部分都是相同的,核心的都是由CPU、RAM和FLASH 几大部分组成,而软件就千差万别了。产品的具体功能都是由软件来实现的,一般来讲一个产品的实现,软件设计的工作量是硬件设计的4 ~ 5倍

所以一般情况下,一个公司的软件工程师数量是硬件硬件工程师的4~5倍,嵌入式软件工程师需求比硬件工程师大很多,同时跟硬件工程师相比,嵌入式软件工程师学起来相对容易些,所以这里我重点和大家谈一下嵌入式软件工程的学习路线。

学习嵌入式需要那些内容?

C语言

C语言是嵌入式的重中之重,Linux操作系统就是用C实现的,包括安卓系统的底层也是C语言实现的,基础不牢,地动山摇,一定要打好基础。

C语言学习过程中重点要放在指针,结构体,文件的处理,数组等。在学习过程中,一定要多写代码代码光看是看不会的

遇到错误不要怕麻烦,善于使用搜索工具,百度,google,stack overflow。要知道,你遇到的问题别人肯定也会遇到过,一般在网上一搜就会有答案。

最后,要多调试程序,熟悉调试的过程。程序三分写,七分调,没有谁的程序是可以一遍写对的。而且,多调试程序也可以让我们理解程序具体是如何执行的。

基本的硬件原理

嵌入式肯定要和硬件打交道的。如果做嵌入式的应用层的话,可能和硬件接触的少一点。但是很多企业在面试的时候,也会问一些基本的硬件知识。

比如,我同学在面试联发科的C++工程师的时候,就问到了他很多关于硬件的知识(中断是什么,轮询是什么,二者有什么区别,一个基本嵌入式系统有什么构成等),所以说硬件知识知道越多越好,就算做应用层,一些最基本的也要知道。

如果是打算做嵌入式底层的话,对于硬件知识的掌握要求就比较高了。比如,LCD是如何显示的,IIC协议/SPI协议是什么,如何收发数据,不同设备对于IIC的速度有什么要求,IIC协议上拉电阻一般是多少等等。只有明白了硬件原理,在看芯片手册的时候才能明白如何去配置各个寄存器。

此外,常用的设备仪器的使用能掌握就更好了,和硬件工程师扯皮的时候会用到。比如,万用表,示波器,逻辑分析仪等。不会也没关系,这部分不是必须的。

数据结构与算法

这部分是程序员的必修课。在各大厂的秋招春招中,笔试面试都是必考的。常见的数据结构如链表,二叉树,堆,队列,常见排序算法及其改进(快排,归并,冒泡,插入)等都是要掌握的。如果是为了找工作,这部分内容有很多是要能达到手写的目的。(相关内容见我整理的嵌入式软件工程师笔试面试指南

虽然嵌入式对于数据结构与算法的要求不像传统互联网那么高,而且,这些数据结构在以后的工作中不一定可以用到,但是一些基本的我们还是要知道的。

像Linux内核中就用到了很多的链表,二叉树等。掌握这部分内容对于我们以后跳槽,深入研究操作系统都有很大的帮助

计算机基础

这部分直接决定了我们以后是否能走的更远,像操作系统的基本概念,计算机组成原理的内容都是需要我们去了解的。比如自旋锁,信号量,阻塞与非阻塞等。

学习任何技术一定要学到这门技术的边界,对于嵌入式来讲,它的边界就是汇编。汇编语言不要求会写,但是一定要能看懂(其实就是Arm指令集)。在很多情况下,看反汇编文件对于bug的调试会更方便

学习路线推荐

入门:51+STM32

主要学习内容

中断、定时器、串口、NAND FLASH、网络控制器、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网络编程》,《Qt Creator快速入门》

视频:这部分视频没看过,可以在哔哩哔哩搜索下,找播放量高的就可以。

驱动开发

主要学习内容

Bootloader的工作流程、UBOOT的编译、裁剪与移植、Linux内核的编译、裁剪与移植,根文件系统的构建、BootLoader、内核和根文件系统的烧写。

重点驱动框架如:字符设备驱动、块设备驱动、LCD设备驱动、触摸屏设备驱动,总线设备驱动模型,输入子系统模型等。

学习资源推荐

书籍:《Linux设备驱动开发详解》《Linux设备驱动程序》

视频:强烈推荐韦东山老师!!

学习建议

对照视频一点一点学习的过程中,刚开始第一遍看的话会有很多地方不明白,不要紧。如果在查阅了一些资料后还是不明白,可以先往后放放,不用深究。内核的许多东西一旦深究起来,越陷越深。

作为初学者,学习驱动开发主要学习驱动的框架(比如,输入子系统模型常用的一个函数input_attach_handler()这个函数,刚开始我们只需要知道他是用来匹配dev设备和驱动软件就可以,暂时可以不用知道这个函数内部是如何实现的)。有一定基础之后,可以再去深究其中的某个点,思考他们为什么这么写。

大神:各类复杂驱动

一般自学能到第二个阶段就已经相当不错了。复杂驱动部分一般是在工作中学习的。像Android驱动,音视频驱动,usb驱动,wifi,蓝牙协议,内核开发等都是比较深入一点的东西了,随便拿出一块内容,深入钻研下都可以成为这个领域的专家。

学习资源推荐

书籍:这部分方向很多,我自己对很多方向也不了解。分享几本不错的内核书籍,《Linux内核设计与实现》《深入理解LINUX内核》《深入Linux内核架构》

视频:哔哩哔哩搜索【Linux内核精讲】

总结

  1. 在学习的过程中,我们应该抓住不变的东西,考虑下这些不变的内容是否对我们以后掌握变化的东西有帮助
  2. 不管是学习任何技术,一定要学到这门技术的边界。对于嵌入式开发来讲,汇编,这就是软件的边界
  3. 经常会在往上看到有人讨论,嵌入式有35岁危机吗?不能说没有,只能说压力相比于互联网可能会小点。
  4. 嵌入式相对于互联网来讲,技术的更新迭代没有那么快。如果能在嵌入式某个领域深入研究,建立起技术的护城河,或许职业生涯会长一点。
  5. 聪明,好奇,协作,忠诚,随遇而安。

推荐一个 github仓库,上面放了上百本经典的嵌入式,计算机书籍,可以star一下,下次找书直接在上面搜索就可以了

github 书籍宝藏仓库

github访问不了可以访问这个:gitee 书籍宝藏仓库

练手项目推荐分享GitHub上一些嵌入式相关的高星开源项目

#嵌入式#
全部评论
写的太棒了,想问一下,如果主要是mcu的bsp驱动+rtos等系统,linux驱动方面好找工作不。linux的那些应用知识,还有c++需要看的深入吗。
1 回复 分享
发布于 2024-10-28 19:38 陕西

相关推荐

02-10 15:19
已编辑
北京邮电大学 C++
嵌入式类岗位大致分为以下几个类型:嵌入式软件开发工程师、驱动工程师、系统软件开发工程师、应用软件工程师、嵌入式测试工程师;还有一些:电子研发工程师、C/C++软件工程师(嵌入式)、智能驾驶软件工程师、机器人软件工程师、硬件产品经理等等。1.1. 嵌入式软件开发工程师A公司岗位描述:1、负责设备软件的设计和交付,包括单片机嵌入式开发、DSP嵌入式软件开发、多线程多任务的动态调度、动态内存管理等软件关键技术研究;2、负责设备软件研发及商用过程中的功能、性能、功耗、可靠性等问题的定位解决;3、负责设备软件新技术的预研和产品实现,提升产品优势;4、跟进行业新技术动态,参与新技术的研究,并能引入到产品开发中。A公司任职要求:1、熟练掌握汇编/C/C++编程语言和基本的常用数据结构,了解操作系统原理;2、熟悉Linux系统编程,嵌入式系统,ARM或单片机,RTOS实时操作系统;3、熟悉HTTP/TCP/UDP等网络协议,熟悉一种或以上接口协议优佳,如:USB、UART、Ethernet、PCIE、EMMC、I2C、SPI等;4、有嵌入式系统或产品的开发项目经验优先;小结:嵌入式软件开发工程师主要负责该部门嵌入式产品的研发工作,固件开发,单元测试,代码维护等,提升产品优势。很多公司都是大类嵌入式软件开发工程师,而不进行驱动、系统、应用工程师等区分。1.2. 驱动工程师B公司岗位描述:1、负责底层驱动及上层应用的开发和调试,外设驱动的开发优化工作,比如Camera、LCD、Sensor等;2、负责软硬件结合新器件技术预研和开发工作;B公司任职要求:(与A公司要求相差不大)C芯片公司驱动岗位描述:1、设计和开发驱动程序(user mode, kernel mode, firmware etc),HAL/API,提供应用程序库的支持,提供包括内存管理,任务管理,硬件资源管理等功能;2、建立驱动程序的开发环境,包括硅前和硅后测试和调试环境,以及相关驱动程序测试工具;3、与硬件工程师和软件工程师协调提供解决平台中出现的问题。C芯片公司任职要求:1、精通C/C++编程,有Linux编程经验者优先;2、熟悉计算机体系构架,算法设计等;3、具备CUDA/OpenCL/GPU shader programming知识和经验者优先;4、有较强学习新知识的能力;具备较强的沟通能力。小结:驱动工程师主要是编写和移植各种芯片驱动,优化硬件设备驱动,一般驱动工程师指Linux上的驱动开发工程师,所以需要精通Linux驱动框架,结合芯片本身去编写驱动,所以芯片公司招聘嵌入式相关的岗位一般是驱动工程师。1.3. 系统软件开发工程师D公司岗位描述:1、参与soc软件开发,包括soc bring up软件开发、IP驱动软件开发、bootloader软件开发、操作系统移植等;2、参与soc 软件、硬件系统验证;3、参与板级外设驱动软件开发与调试;4、参与soc BSP 、soc SDK 软件开发、软件测试。D公司任职要求: (与A公司要求相差不大)小结:系统软件开发工程师主要是编写固件,需要熟悉整个操作系统组成与调度,对固件的稳定性高求很高,是驱动和应用的基础。1.4. 应用软件工程师E公司岗位描述:1、负责嵌入式系统的搭建与维护,熟悉芯片驱动、嵌入式OS、SD接口定义;2、负责软件系统的跨芯片移植(如:NXP系列、STM32系列);3、负责系统集成以及调试工作;4、负责进行嵌入式软件系统的应用开发、优化。E公司任职要求: (与A公司要求相差不大)小结:应用软件工程师主要是编写业务逻辑程序,调用驱动工程师提供的接口控制设备,软件开发过程所涉内容范围非常广,主要使用C语言开发,但经常会涉及其它语言、数据库、前端后台、各种通讯协议等。1.5. 嵌入式测试工程师F公司岗位描述:1、负责嵌入式项目功能测试、性能测试、SDK测试或者自动化测试;2、根据产品需求制定测试方案、设计测试用例,搭建测试环境;3、依据测试用例完成产品的功能测试、硬件指标测试等,记录测试结果,报告与跟踪产品缺陷,并协助研发人员进行缺陷定位与重现;4、编写测试报告,根据测试结果评估软件质量;5、进行测试总结,编写测试相关文档,对测试中存在的问题及时分析与解决,并提出改进建议E公司任职要求:1、有嵌入式软件开发的经验优先;2、有脚本语言(如python/shell)的使用经验;3、有Linux下的自动测试和测试开发的经验;4、熟悉嵌入式调试技术及工具;5、具备良好的沟通表达能力,良好的分析解决问题的能力;剩余的大佬面经总结了  链接在下边   http://daxprogram.com
点赞 评论 收藏
分享
评论
25
166
分享

创作者周榜

更多
牛客网
牛客企业服务