如何学习嵌入式------转载

2019-07-12 19:24发布

 关于嵌入式如何学习,我相信有很多大牛回答得很专业,最近在知乎上看到一网名为----李brooks,~的网友对此进行了总结,我个人觉得非常好,还有其他两位网友li
crifan
Tony
Ho
,毕竟我工作以来也还有好多东西没有接触,就有他说的那些中的部分内容,我们来看看他们说了什么内容:
有一位大学生四年级的网友提出这样的问题: 本人大四学生,专业为电气类的,有C语言,单片机,模电,数电的基础,一直想从事嵌入式方面的工作(感兴趣),但是以目前的水平,暂时还不能找到这方面的工作,所以一直在纠结是先找份本专业的工作做着,又或者是到培训机构培训,然后找份嵌入式方面的工作,希望大家能指点一二。另:嵌入式学习需要哪方面的基础知识,培训四个月的时间努力学习大概能达到什么样的水平。
以下为解答: 第一位:李brooks 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。
作者:李brooks
链接:https://www.zhihu.com/question/22252234/answer/75026117
来源:知乎


不请自来。做电赛出身的程序猿一名,目前从事嵌入式Linux驱动开发。还有单片机从51到意法Ti都做过,DSP只用过TI的,主要是在开关电源控制方面的应用。建议学习路线:
1 学习51单片机,这个阶段你只需要跟着郭天翔的视频去学,只要求实现功能,不求甚解。但建议能够提出问题,比如“为什么往IO控制寄存器写入特定值能点亮LED灯?”“IO口的电路结构是什么样子的?”“什么是上拉下啦,灌电流拉电流?”,这一阶段主要是熟悉单片机的使用,并且在使用中思考发现问题,还能熟悉一些基本概念。
2 开始查资料看书,看模拟电路数字电路等等,开始去弄明白1中所提出的问题。这时候问题主要集中在电路方面。
3 开始学习STM32,随便买个板子,看原子的书跟着一步步去做。这时候你会遇到很多计算机方面的问题,这时候一边学习教程,一边学习:微机原理,编译原理,操作系统。你要弄清楚ARM架构,弄明白CPU如何取指,译码,执行,知道地址总线,控制总线,数据总线如何工作。要弄明白你编译各个阶段产生的各个文件是什么,什么是分散加载,什么是重定位,什么是代码段,什么是数据段,等等。还要能弄明白CPU如何启动,程序镜像在内存中如何布局。要知道中断的原理,以及现场保护等等。最后你了解了各个知识点之后,转向GCC开发STM32,这时候你如果知识掌握得不错,你应该可以很快地学会编写链接器脚本并且明白每一条语句所代表的含义。
4 开始增强C语言,深入挖掘C语言的各个死角。最好可以做到当你写下一条语句的时候知道编译器会如何处理。还需要数据结构和软件工程,建议最好还要学习一下设计模式。开始学习养成良好的代码风格,开始思考代码的结构。可以说设计模式如果能学好,在往后学习LINUX内核时大有裨益。你会发现LINUX的输入子系统有点像职责链模式,会发现ASOC音频系统有点像模板方法模式。私以为,如果能在两个以上不同方面考察同一种编程思想,你会得到更加深刻的理解,更能领会其精华。
5 认真研读OS方面的书,各个知识点都要弄明白,进程是什么程序是什么线程是什么,竞争死锁优先级反转,虚拟地址空间物理地址空间,用户空间内核空间等等。开始学习ucos,这个没什么可说的,如果在2中能熟练掌握各种知识点,知道CPU如何中断如何保护恢复现场,那么读ucos的源码时候,在原理上就不会有什么疑惑。如果能在4中养成把握代码整体结构的能力并且学习好数据结构和基本的算法,读源码就没有什么障碍。一旦原理弄通了,源码也能读懂,那么吃透ucos就是顺理成章的事情。
6 自己仿照ucos写一个stm32上的实时os出来。
7 进军LINUX。学习LINUX的基本使用,看赵炯那本内核剖析,啃LINUX内核设计与实现,把握总体的内核架构。之后可以学习驱动,看建议陈学松老师的书,弄明白基本的驱动架构和如何编写简单的驱动,认真对待,这里强调一下设备驱动模型。最后啃LINUX内核源码情景分析,上下两册用心读,这里着重强调一下内核中的VFS部分。之后就是看宋宝华老师的书,进一步学习驱动开发。最后。。。。。。。看内核源码看内核源码看内核源码。
8 其它的什么SPI,IIC,什么DMA,都只是技能问题,只要知识学的好,技能想咋点就咋点。
9 暂时没想到其它的了。想到再说

第二位:li crifan 著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:li crifan
链接:https://www.zhihu.com/question/22252234/answer/20769642
来源:知乎

现已整理出教程,详见:
1.先看:
嵌入式软件开发
搞懂嵌入式软件方面的知识。
2.如果打算做驱动方面的开发,那么再去看:
嵌入式驱动开发
3.如果是和Linux有关的嵌入式,则再去看:
嵌入式Linux软件开发
4.如果和Linux驱动有关,再去看:
嵌入式Linux驱动开发

========================================
目前对于嵌入式培训的质量,不是很清楚。但是根据个人的了解,貌似质量高的不多。
所以,鉴于你的基础,推荐你:
先找自己专业的工作,有了相对稳定的生存的基础了。然后再抽时间,自己学习嵌入式。

关于自学嵌入式的话,需要具备哪些基础,如何循序渐进的学习嵌入式等方面的问题,说实话,很难几句说清楚。但是,我会尽量说的让你能看懂:

【如何学习嵌入式】
基于此,我也是正在,一点点的完善我要写的,关于如何学习嵌入式的教程。
主体思路,和目前已经写了的部分的内容,如下:

1.说清楚整体嵌入式行业的概况,应用领域,举例说明。
2.然后通过一些典型的你所能接触到的产品,去说明嵌入式行业领域的产业链。
3.然后你才能搞清楚,你作为嵌入式软件开发者,所处的位置。
4.然后你才知道,你需要做大概哪些方面的软件工作,以及和其他产业链和合作人员的关系。
5.搞清楚所处大环境的位置,才是去如何搞嵌入式软件开发。
相关内容:
嵌入式开发之嵌入式背景知识
【整理】嵌入式软件知识体系概述

6.才是介绍需要大概哪方面的基础知识
相关内容:
【整理】类比解释:嵌入式开发需要掌握哪些知识

7.然后才是,对于典型的一些嵌入式软件开发,是如何搭建开发环境,如何一点点开发。
相关参考:
(1)之前遇到的一本,解释的大而全的,嵌入式开发方面的书籍:
Embedded.Systems.Architecture_免费高速下载
此书算是说的不错了,不过是英文的。如果英文还行,建议多看看,即使看不全懂,也可以看看其大概框架,以便对于嵌入式开发有个概念。
(2)
嵌入式开发之基本概念和开发逻辑
(3)
【问题解答】用一个嵌入式开发板去实现数据采集的基本思路和逻辑

8.然后才是解释具体的某个领域开发的真正的逻辑和流程,比如嵌入式linux驱动如何写,等等。
相关参考:
(1)
嵌入式开发系列教程
(2)之前给别人推荐的这本书:
Linux设备驱动开发详解

总之:
目前:上述的部分的帖子,部分的推荐书籍,你凑合先看吧。
以后:关于嵌入式开发方面的,从逻辑概念到实际动手操作,以后我会抽空去完善出全套的教程的,去详细解释的方方面面的事情的。到时候,再看我的教程,就会很清楚了。

【其他一些嵌入式相关的内容】
1.解释了一些嵌入式领域内常会遇到的基本概念:
【整理】嵌入式领域的名词概念解释
2.总结了些经验:
【整理】嵌入式开发经验和心得总结
3.上次给另外一个人回答了类似的问题,你也可以参考参考:
关于嵌入式驱动的学习?

【最后】
我一直正在陆陆续续的写嵌入式方面的内容,如果写好了,都会发布到我自己的个人网站上面对应的嵌入式分类中的:
Embedded | 在路上
换句话说,如果感兴趣,可以时不时的去看看,可能就会看到我更新的一些,关于嵌入式方面的帖子。
其中,可能有些是嵌入式领域教程方面的介绍的内容,有些可能是具体某个嵌入式知识点方面的内容。你捡你感兴趣的看,即可。
第三位:Tony Ho 花了一张图,厚着脸皮贴一把,以后我会将各个技能树的学习顺序与参考学习资料整理一下:
关于博主本人建议: 本人也是出自于嵌入式培训而才顺利找到工作的,但是在没培训之前还没知道过这么多,因为大学知识毕竟有限,而且我本人还是普通大专学生,读的是电子信息工程,见识短浅,当时只是知道几种单片机和ARM,没有扎实的专业知识,但是就是借着培训这个平台长了见识才能顺利走上嵌入式开发这条路,后来自己工作后不断的补充新知识,还是有所长进。培训有利有弊,当然,你有能力你可以自学成才,别浪费大学几年的时间,做嵌入式的,英语必须是要好的,C语言,数据结构,操作系统等理论知识都要具备。自制力差的,选择培训也不错,但是要能坚持,毕竟4个月的学习等于你需要掌握大学将近好几年的东西,不易啊,而且学费也不便宜,一般都要15000以上,因为这四个月是纯粹的学习技术核心知识,而不是跟大学一样有许多空闲时间和其它非技术相关的知识的学习。所以,且学且珍惜,如果本文能为各位初学者带来帮助,请感谢知乎三位大牛。大笑