写给嵌入式初学者

时间:2021-02-03 19:10:12

如果我是嵌入式初学者,我也许会这样做

声明:

我绝非一个高手,也不是老手,或许对于初学者,我只是起步的时间比你们早了一些罢了。

因此以下说的也谈不上经验之说,只是按照个人之见来建议性的对于初学者说点什么,是否

完全适合你们,还请自己定夺,但我会本着责任对于以下的建议,若有争议,请在QQES6:180631429参与讨论。

——疯子(六月&风)

一、到底是自学还是去培训呢?

如果你觉得基础不够好,而又没有一份恒心去独自做好一件事,自学能力不够强,不能一个人坐在空空的房间里独自呆上一天,不能承受那份寂寞与苦楚,或者说你时间短,而又

快面临找工作,想在短时间内入门,那选择培训吧,培训费是高,但是这种投资,会在你工作后得到回报(对于选择哪个培训机构,不做推荐)。

如果你觉得自己能够管理好自己,能够承受三点一线的生活,自学能力比较强,而且时间相对来说还算长,有着一颗要学好的决心和信心,还有一份坚持,那么可以选择自学。本文档重点在于如何自学。

其实嵌入式不是一个短暂的过程,而是长期的坚持和积累,才能达到一定境界,我始终相信,不是短期3.4个月能完全掌握的,请一定要相信这点。无论培训还是自学,在最终的提高,都在于个人是否能够继续在嵌入式上花时间,下工夫,去专研。

二、学习的态度?

对于一个东西,一定要有兴趣,如果没有兴趣只靠单纯的动力去坚持,很难坚持到最后,当面临一个接一个问题的时候,就容易产生放弃的念头,半途而废,很多初学者倒在这里,以至于最后无奈的和我们说再见,和嵌入式擦肩而过,但我们绝对不能完全凭借兴趣,毕竟这个世界吸引我们眼球的东西太多,否则又容易陷入这个也弄,那个也弄了,看似知识渊博,却最后变得东不成西不就,就如有些人即想学好ARM,又想玩好FPGA,最后还想学会DSP呢,当然这不是不可能,只是在你工作之前,貌似没什么可能,这样到最后,没有一样可以让自己自信的去找工作。兴趣之后我们需要的是一份动力,因此我们得知道如何去发掘动力,支撑我们在旅途继续前行,俗气点说,我们可以没有多少伟大的理想为了啥振兴中华,简单说为了高薪为了生活富有等等,让他成为我们的动力,我们不得不提高自己的技术水平,如此之后,无形中去提高整个国内的技术水平吧,尽管社会很残酷,可能最后你也不一定高薪,但是你技术不咋样,肚子里没什么货,这种可能没高薪将变成一定不高薪,当然这是对于嵌入式方面的研发人员来说,人生路各种有,咱不能说得那么死板与绝对。

三、你还在徘徊吗?

前些天有个人问我,如何选择?我说,做什么事,你都需要坚定下来,考研不考研,专业不专业,你应该在开始一件事前就决定好,否则,徘徊越久,越拿不定主意,那就是在浪费时间。好吧,假设能够看到这个文档的你们,都应该是想好学嵌入式了,那么有人问,我在上学,而课堂上好多要学的,那有如何选择呢?我对他说,和嵌入式相关的,你就学,不相关的,你也用不到,你课堂上学了也是皮毛,对于你工作,或许没半点用,只要应付考试过就行了,至少这个毕业证咱还是得拿到的,既然与自己将来要从事的没有多少关系,咱干嘛还花那时间去学习?青春短暂,时不待我。

四、对于ARM9ARM11我如何选择?

这个问题,也是我在群中遇到过很多次的问题,已经回答好多次了,以后真不想再费口舌。对于一个初学者,不是越高端的东西越好,而是应该看用户群和学习资料。目前来说,ARM9,而且是s3c2440的学习资料比较多,对于开发板,应该是友善之臂的mini2440用户群最广,当然我没做过调查,只是在几个群中出现频率高于其他开发板估计所得。而现在网络上的多数学习资源,也基本会有对mini2440的支持,所以当遇到问题也容易解决,也容易找到相关人员进行咨询。

五、如何学习?

啰嗦了那么多,终于到了如何开始嵌入式学习的地步了。分几点来说吧。

1、什么是嵌入式?

首先我们需要搞清楚什么是嵌入式,以及他到底能干嘛,如果这个不懂,正如我们上路,不知道去那里,不明白目标物是个什么东西,就容易迷路,找不准方向,也可能最后错过终点,因为我们一直不知道去哪里在哪里下车呀。至于什么是嵌入式,嵌入式到底干嘛,我不在这里介绍,这毕竟只是个如何自学的文档而不是知识讲解文档,请百度相关知识,毕竟这是教你如何自学。

2、嵌入式到底要学些什么?

俯视嵌入式,嵌入式是软硬件的集合,那么就是说软件硬件都得学,这是个大的方向把握。站在嵌入式本身的角度,那么软件就是三个层次,上层应用,界面编程,比如QT,中间层的应用编程,比如linux编程,就是那些linux网络编程,进程控制,线程等,底层编程就是内核,驱动编程,比如如何控制一个GPIO,如何驱动一个LCD让其正常工作等等。至于硬件,那就是各种硬件电路,比如GPIO电路,LED电路,电源电路,LCD的控制电路等等。对于以上提到的名词,这里不做多的介绍,只是示范,暂时不懂没关系,等学到一定程度,有些东西你自然而然就懂得如何去找资料去了解。

2.1、对于界面应用编程,那又需要哪些知识以及如何学习呢?

应用编程,如果选择miniGUI,那么就是用C进行编程,这个我不太了解,没有深入学习,相对来说用的比较少,大多数选择QTQT是采用C++语言,这个可以在win下进行编程,有相关软件,叫做QTcreator,可以很方便的放置各种控件,也可以在linux下进行编程,也有相关软件,而且跟win下的差不多的界面,很方便,推荐书籍《C++ GUI Qt4 编程》,学习过程中加以网络上各种辅助文档,当然,首先一定得要C++有个良好基础,所以先学好C++再说吧。当熟悉这个编程过程之后,再根据网络上文档进行QT到开发板的移植工作,这其中,有很多知识又是你可能没有遇到过的,但是,那些知识都是不系统的,只能根据你所遇到什么百度什么或者向其他人咨询去解决,毕竟不是个系统的知识所以也就没有个系统的学习法,嵌入式就是这样,很多知识都是零零散散的。学到什么程度呢?当你把我上面推荐的那个书所有知识都弄懂,而且可以自己很有把握的设计想要什么界面就是什么界面的程度,那你就很牛了,当然,我还远没有那个水平,继续努力中……

2.2、对于linux应用编程,需要哪些知识又得如何学习呢?

既然是linux的应用编程,那我们首先得要学会如何使用linux系统吧?所以,先学会如何去装linux系统吧,如果直接装,这里不多说方法,既然是自学,那就多去百度找答案吧,如果是装虚拟机,那就得先装好虚拟机软件,然后再通过这个软件去装虚拟机跑linux系统,本人一直采用虚拟机模式,很多时候我们得虚拟机中的linuxwin两个系统同时工作,互相传文档或其他资料,所以得学会如何建立环境在两者间互传文件吧? 可以通过FTPssh等工具。推荐书籍《鸟哥的私房菜》,以及《国嵌共享教学视频》,一开始你可以依葫芦画瓢,视频装什么系统,比如他装红帽,你就装红帽,等你熟悉这些系统之后,你就会发现其他系统也差不多一个样,游刃有余。对于新手,请依葫芦画瓢吧,瓢画好了,你就可以创新画瓜了。这样的过程,有助于你遇到问题不至于太茫然手足无措打击自信心。好,假设你现在已经对于使用系统熟悉了,那就开始linux应用编程,这个《国嵌共享教学视频》中基本都是讲这些,还有《中嵌教学视频》,首先,你听到进程,线程等各种概念会很陌生,请别怕,我曾经也陌生过,也怕过,但现在告诉你,没什么,只要耐着寂寞和恐惧,硬着头皮听视频讲解,然后你就会明白了,理解这些东西,还是很简单的,只是对于新手,对于一个陌生的东西会有些莫名的恐惧而已。至于linux应用编程到底要学些什么,也就是《国嵌共享教学视频》中讲的那些差不多了,更多的关于linux应用编程的请看被誉为linux“圣经”的书《unix环境高级编程》。学到什么程度呢? 可以这么说,这个很重要,当然是越深越好,更多的需要看书而不是视频,视频只是用来打破你心里恐惧的魔咒带你轻松入门,入门后,看书才是最好的学习路径。

2.3、对于底层编程,内核,如何学习?

这里不建议一开始就看内核源码,在这个时候完全没有这个必要了,那无非是自取其辱,自我打击罢了。首先你需要了解ARM,了解开发板各种硬件资源,对于开发板有个整体的了解,一般用户手册都有介绍了,否则,那就不是好的厂家。用户使用说明书都木有,搞什么?然后你需要根据开发板自带的系统, 继续熟悉开发板,使用他,用户手册这个时候是个很重要的文档,我不建议一开始你就去对于板子做什么工作,就是先先使用他,当你对板子有一个整体的把握,你放心你自己烧写系统了,那就开始干吧。最快入门的方法,还是看教学视频吧,《国嵌共享教学视频》,对于这个也是有讲解的,而且讲解的不错,这里你一开始不是已经通读了开发板用户手册吗?那再看教学视频,已经不是什么难事了。用户手册肯定要介绍如何烧写系统,而且开发板光盘中肯定有内核镜像,你这个时候只需要学会如何烧写系统就够了,烧写他光盘自带的。下一步,你是不是想如果我自己配置编译一个系统,然后烧写到我自己的板子上那又如何呢? 是的,学习过程就是这样的,但工欲善其事必先利其器,搭建好开发环境,这里最重要的是价差编译器的安装,假设这里是你第一次编译用于开发板ARM平台的程序,这个时候就需要搭建交叉编译器了,如何搭建?百度搜索。视频教学中也有讲解,请仔细听课,就怕你不够仔细不够耐心。这里有两本书书要推荐,但不适合作为新手的我们翻看,一本是《深入理解linux内核》,一本是《内核源码完全解析》,这两本,还是等到你想要深入了解有一定基础后再去查看吧。很多人关心bootloade,我这样理解,bootloader其实只是各种裸机程序的大杂烩,首先初始化各种硬件,做程序运行环境的准备,到最后拷贝内核代码到内存,然后跳转到内核的第一条指令去启动内核,这样之后bootloader的工作就结束了,他的使命也就总结在此。对于bootloader,在一开始有汇编代码,请放心,不要听到汇编就吓破胆,那些指令就那么几条,记住就可以,稍加理解,《国嵌共享教学视频》中也有讲解,呵呵  ,这个视频,真是入门的好帮手啊,感谢国嵌吧,虽然后面的视频他收费,但或许咱不需要。尚观教育中心也有部分免费视频,有讲解bootloadr如何编写,这个可以看看,有帮助,网上也各种文档可以查阅,有几篇说的很不错,不妨在自学过程中多百度吧。

很多人都向往搞驱动,那么请问,你有51单片机基础吗?或者其他单片机也可以,如果没有,还是建议了解下, 这样的基础,对于学习驱动还是很有帮助的。如果是MSP430做基础,我想比51更好,因为430的程序编写在我看来,跟ARM裸机程序就更接近了,当然, 越往上,越接近,但是入门更难。ARM的裸机还是很有必要研究的,这毕竟会帮助到你编写驱动程序。关于这部分,推荐《linux应用开发完全手册》,韦东山编写,而且有对应的教学视频,适合入门,我想,推荐了这个,接下来就不用我多介绍了,好好看吧,在我看来,最适合入门的书籍。对于驱动程序,那么我们首先就该了解驱动的机制,如何加载卸载驱动,那么就从hellowrld模块开始了解如何加载卸载驱动,这虽然不是个正中的驱动程序,但是有助于新手了解驱动与内核的关联。第一个真正的驱动,那就是点亮一个LED了。

对了,在这个时候,我们会遇到文件系统,nfs挂载文件系统等新知识,那么在开始驱动之前,我们就应该了解学会这些作为基础的。那么如何制作一个根文件系统,以及如何通过NFS挂载,我们就应该学习了,呵呵,不好意思,还是请百度,遇到问题请群里咨询。群号:180631429.如果我们要将驱动放进内核怎么办?那就需要知识makefilekconfig这两大知识做后盾了,所以,继续学习吧,嵌入式就是这样,在学习一个东西的时候,我们总是欠缺那样的知识,这都没什么,缺什么补什么。拦在你前面的障碍,只有先清除障碍,我们才能继续上路啊。

对于裸机程序,我说的貌似少了点,ARM9应该采用ADS或者KILL或者其他集成开发环境,ARM11应该采用RVDS集成开发环境,对不起,我几乎没用过这样的模式编写裸机程序,无可奉告。除了这样的集成开发环境,那就是在linux系统直接编写程序然后直接编译了,这样的话,比较麻烦,那又需要更多的知识了,makefile,链接脚本等,这个时候你就该学会简单的makefile知识了,至于链接脚本,干嘛用的?上面有推荐《linux应用开发完全手册》和他的教学视频,那么请认真看书认真听课吧。

2.4、对于硬件,咱们该如何学习,要到什么程度呢?

要到什么程度,我不管妄下结论,如何学?推荐《电子设计从零开始》,假设你是个没有半点硬件基础的人,你还是应该看看数字电路和模拟电路的,至少电阻电容你要会认识,至少上拉下拉电阻你得知道是干嘛的,至少你的知道滤波电容旁路电容是啥玩意儿。推荐一个博客http://hi.baidu.com/new/mx0807,对于新手,还是不错的吧,个人觉得,你们或许会找到更多更好的博客和文档。数字电路中的时序图是个很重要的东西,对于编写驱动程序的人员来说,一定要会看,跟多知识,请百度,推荐一个视频尚观的一个视频,地址去百度找吧,对于时序图的讲解,还是比较到位的。

3、对于嵌入式,到底要哪些基础?要学多少知识?

需要哪些基础?如果认真看了以上介绍,那么你应该懂得,C绝对是基础的基础,linux应用编程是用C,内核是用C,驱动更是用C,你说重要吗?C++也是在C的基础上有了类和对象,继承等概念,这么说,你不认为C是基础的基础了吗?关于C学习,书籍太多了,但绝对不是谭浩强那本书做基础就行了的,只能说,谭的书是基础C的基础,如果这都没有,那你的路还太遥远,C的三大著作,还是有必要的,《C专家编程》,《C和指针》,《C陷阱和缺陷》,有一本比较基础也是以Linux为背景写的C书籍很不错,入门挺容易,《一站式C编程》,强烈推荐C新手。C的重要性不多说,面试的时候你不要后悔对于C你了解的太少了。如果还要什么基础,那就是硬件方面了吧,除非你不搞驱动不搞底层,那就不算是需要的基础了。

那么,第二问题,到底需要学多少知识呢?对不起,我回答不了,以上内容如果您认真看了,你就发现,在没走一步,总要障碍,而这障碍,就是新的知识,你想走过去走得更远,那就需要学习,否则,有些坎你永远无法逾越,别指望可以绕过去,哪天你还是得要绕回来补补的。以我之见,做个大概的介绍,C语言,C++makefile编写,kconfig规则,链接脚本,shell脚本编程(稍后再来对他做个介绍吧),java(当然,你想了解android的话就需要学)等等,这些知识中,绝不是但看名字你就能认为那只是一个知识点的,比如C中,你还得了解编译原理啊,代码的分段啊,代码在内存的存储区域啊,深入指针啊什么的,链接脚本中,你还需要知道什么是加载地址什么是执行地址,什么是加载域什么是执行域啊等等,简直是层出不穷。

4、shell脚本编写很重要?

当然重要,linux系统的管理,基本上需要shell脚本语言的,很多自动化工作,需要shell脚本语言知识,在文件系统中,也会看到shell脚本语言,什么makefile等等,都会牵涉到shell脚本语言,还有configure文件,build文件等都会牵涉到,如果你没有shell脚本语言编写知识,你就很头疼,所以必须要了解,推荐《shell脚本学习指南》,这是shell方面的权威著作。

5、最后,咱需要将所学知识融合一体,来几个小项目练练手,你们觉得怎么样?

总结:

现在想想,有些东西我毕竟没有介绍到,那么,那是我觉得不太重要或者说,对于一个新手没有必要介绍了,因为很多知识,只有当你学习过程中才能遇到,根据个人学习方向和程度,以及遇到的问题而定,不适合在此一概而论。嵌入式学习,一定得要多思考多专研,对于编程工作,一定要敲代码,对于想要深入的你们,视频只能是个入门,最终落实还是在看书,看源代码,敲代码。对于自学,那就是一定要多百度,可以寻找志同道合的朋友,遇到问题一起交流,多虚心请教,别灰心,别因为别人没有及时回答而放弃,要学会执着。还有,很多人不懂得提问,那就需要看看《提问的智慧》,也同样有人,不屑于扯淡这个过程,生活,决不能仅仅只是做技术,而有人,只有当自己有问题的时候才会出现在群中,这也是一个弊端,因为你遇到的问题有限,当别人有问题的时候,你没有看到其他的人的回答和解决方法,那么这一个问题有可能就是你下一个问题,学习,要善于把别人的经验变为自己的,否则完全只靠自己单方面的积累,如果这是苹果,或许共享你就少了一半,但这是思想是经验,共享,只会加深你知识的深度和广度。

后记:

但愿我们的ES群更好的发展,但愿这篇文档,对于初学者,是一个指引方向的灯台,帮助迷茫中的你们,找到方向,触动你们的神经,坚持自己的决定。也希望多支持ES6群:(群号:180631429),多参与到讨论中,互帮互助,共同进去。一起在这个行业,打造属于自己的天地。

欢迎转载此文,欢迎嵌入式群ES6180631429共同交流学习。

——疯子(六月&风)

QQ362543692

2012.08.11  00:18