学习嵌入式开发学习建议(耐心读,下面有学习路线)

首先呢,先讲明关于嵌入式方向

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

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

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

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

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

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

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

所以一般情况下,一个公司的软件工程师数量是硬件硬件工程师的4~5倍,嵌入式软件工程师需求比硬件工程师大很多,同时跟硬件工程师相比,嵌入式软件工程师学起来相对容易些

问题:1.我想要学习嵌入式我要掌握哪些方面?

如果您想学习嵌入式,您需要掌握的内容有:硬件设计(包括单片机、处理器、板载电路等)、汇编语言、C/C++编程、操作系统(如Linux或UCOS)、通信原理、中断、DMA、实时系统、模拟电路、数字信号处理等等。

2.需要有什么基本的基础吗?

C语言

认真学习C语言,认真学习C语言, 认真学习C语言, 重要的事说三遍。

C语言在嵌入式中是重中之重,它就是你上手嵌入式的工具,在工作中经常能用到。

不管是做嵌入式软件还是硬件开发的人员,对C语言的掌握这个是必需的,特别是对于以后致力于嵌入式软件开发的人,现在绝大部分都是用C语言。

操作系统

了解操作系统,对我们提升硬件和软件的理解,绝对有很大的帮助。

比如进程、线程,系统如何来分配资源的,系统如何来管理硬件的,当然,不是看书就能把这些理解透,如果不是一时能理解,没关系,多看看,结合以后的项目经验,会有更好的理解的。

还有如linux或者wince下的编程,这些对以后做应用的编程很有帮助。

当然,如果做手机的话,那可以学习MTK、塞班、Android等操作系统,Android也是基于linux系统封装的,所以建议先学习下linux。

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

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

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

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

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

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

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

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

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

单片机/ARM

虽然现在51单片机用得越来越少,但在一些要求不高的项目中还是会被使用。个人觉得学习51是在学习一些基础知识,对于后面学习其他芯片会有帮助。

比如STM32,ARM系列的芯片,市场上用得特别多的,有各种各样的系列(L0, F0, F1, F4等),基本都大同小异。学习一种之后,其他的基本分分钟就能上手。

如果以上知识都了解了,就该去阅读一些优秀的代码了,当然最重要的还是多动手!

3.在不同的阶段,需要掌握什么呢?(参考https://zhuanlan.zhihu.com/p/485396083小熊讲嵌入式)

· 入门嵌入式工程师
此阶段主要是前期的入门过程,主要针对入行没多久的新人。其实成功没有捷径,所以打好基础才是关键。

关于这一阶段,各位可以先给自己定个小目标,例如一段时间内学会在Linux下进行你的日常活动(编写文档,看视频等),可以通过网上搜索资料或者购买相关书籍进行操练。

如果大家有需要,这边有个嵌入式 Linux开发相关的学习课程,不用开发板,适合零基础入门,而且不用花钱,点击下方卡片就可以免费开始学。

主要包含以下4个方面的内容:

1. 电路知识

首先你要学习电路、模电、数电,认识电阻、电容、三极管,基础器件要知道,放大电路、集成运放、时序电路基本电路能看懂,不然看电路图一定是云里雾里,也就无法进行后续的工作。

硬件产品的设计实现,包括器件选型、原理图和PCB设计、电路调试,都需要过硬的电路基础。

2. C语言

C语言是嵌入式开发中最重要的编程语言,要对这门语言有深入的理解,毕竟不仅仅要会写程序,看懂他人程序也很重要。

最基本的数据类型、数组、指针、结构体,链表、文件操作等都要会,掌握基本语法和语句。

3. 单片机

单片机入门相对简单,通过单片机的学习可以熟悉单片机的硬件结构,包括I/O口、AD转换、通信(串口、并口、I2C、CAN、USB、以太网、ZigBee技术等)、显示(LED、LCD等)、控制(PWM等控制技术)、数据处理(图形、图像、语音、视频等的处理或识别)等,学好单片机可以为采用嵌入式系统奠定良好的基础。

4. Linux基础

Linux的源码和架构都是开放的,在嵌入式系统中应用尤为广泛,学习Linux对于系统的开发会有很大的帮助。

详细了解Linux下的目录结构、基本命令、编辑器VI、编译器GCC、调试器GDB和 Make 项目管理工具,Shell Makefile脚本编写等知识,以及嵌入式开发环境的搭建。

· 中级嵌入式工程师
经过第一个阶段的学习,你已经可以进行嵌入式开发工作了,但是要进阶依旧还有很多知识要学,而这个阶段也将是第一个分水岭,使得优秀的嵌入式工程师得以脱颖而出。

此阶段虽然只有三项,但涉及的知识非常广,要想学好需要花费大量的精力,实操演练也很重要,最好是还能有个大佬让你请教开发的理解和代码调试的能力。

1.Linux编程

系统编程可以直接跟内核及核心系统程序库对话,深入了解Linux内核。

掌握Linux系统编程主要提升对Linux应用开发的理解和代码调试的能力。

由于网络应用开发越来越广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,可以全面了解Linux网络应用程序开发。

2. 数据结构与算法数据

结构及算法在嵌入式底层驱动、通信协议及各种引擎开发中得到了广泛的应用,语言编译要使用栈、散列表以及语法树;

操作系统中用队列、存储管理表及目录树等;数据库系统运用线型表、多链表及索引表进行数据管理等等,对其掌握的好坏直接影响程序的效率、简洁及健壮性。

3. QT、DSP、FPGA

Linux没有自己的界面,学习QT编程可以创建艺术级的图形用户界面所需的所有功能,从而更好的实现人机交互控制。

而如今用户对于图形图像的要求也越来越高,这就需要DSP、FPGA技术来设计开发更好的嵌入式视觉系统。

至于嵌入式高级工程师,暂时无需多说,操之过急而言并不是好事,当你到达这个位置的时候,可以说你已经是一个人生赢家了。

真正的学习过程如同一场漫长的修行,在这个过程中,必定有各种各样的困难。

当然了,嵌入式工作中更多的需要实践以及经验的积累,相信守得云开见月明,你也可成为一名优秀的嵌入式工程师。

作为初学者,有什么推荐的课?

在B站上有好多资源,但是作为一个零基础的人关于C语言?

嗯,我只推荐一点就是B站的鹏哥C语言。加上翁凯老师。这是最好的决定。

数据结构和计算机网络无论做驱动还是做应用都离不开数据结构和计算机网络知识。学习建议是数据结构可以看看

郝斌的视频

计算机网络可以看看小林coding的资料

至于其他的书籍以及资料。

 

学习路线推荐。参考https://www.zhihu.com/answer/2248831391

入门:51+STM32
主要学习内容

中断、定时器、串口、NAND FLASH、网络控制器、LCD屏、触摸屏等的工作原理。

学习资源推荐

视频:野火,正点原子

书籍:野火,正点原子

学习建议

如果你以后的方向是驱动开发,这部分学习的话重点放在硬件知识的理解。买个开发板,学习下他们的例程是如何写的,常用嵌入式外围设备的硬件工作原理,以及如何使用C语言来编程、控制这些硬件。把基本的外设都学习一遍,不求都会写,但是硬件原理一定要搞清楚。

进阶:ARM-A+Linux
这部分主要分为两个方向:Linux应用开发,Linux驱动开发。下面我会对这两个方向分别进行说明。

有了之前的单片机基础,上手Linux开发就会快一点。可以买个ARM-A内核的开发板,ARM-A和stm32很多地方都是相通的,理解起来不难,二者最大的差别在于开发环境,很多新手入门Linux开发在搭建环境时就被劝退了。学习ARM-A前可以先看下 《ARM体系结构与编程》,再去看韦老师视频的话会理解快一点,视频中讲到的难理解的这里基本都有。
应用开发
主要学习内容

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内核精讲】

 

总结

在学习的过程中,我们应该抓住不变的东西,考虑下这些不变的内容是否对我们以后掌握变化的东西有帮助。

不管是学习任何技术,一定要学到这门技术的边界。对于嵌入式开发来讲,汇编,这就是软件的边界。

经常会在往上看到有人讨论,嵌入式有35岁危机吗?不能说没有,只能说压力相比于互联网可能会小点。

嵌入式相对于互联网来讲,技术的更新迭代没有那么快。如果能在嵌入式某个领域深入研究,建立起技术的护城河,或许职业生涯会长一点。

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

 

 

  • 17
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lidiyscrp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值