本文转自迅为开发板iTOP-4412开发板实战手册:http://www.topeetboard.com算法
刚刚读到这篇文章,对于刚入门嵌入式来讲挺有用的,献给向我同样正在迷茫,苦于没有头绪,没人指引的学习朋友们。
主要讨论下嵌入式技术学习方法,主要是针对嵌入式软件。
嵌入式技术是一门边缘科学(又称交叉科学),涉及的内容很是普遍,前几年不少学校,包括一流的大学都在讨论要不要设置这个专业。不是说设置这个专业自己有什么问题,而是由于课程设置不容易安排,若是偏硬件的话那就成了电子工程一类的专业,若是偏软的话就成了计算机专业。
正由于如此,不少人在学习嵌入式技术的时候,不知道从哪里方面入手,由于知识体系很是庞杂,若是没有指导,极可能会长时间不得要领,学习效率会不好。
那么,下面探讨一下学习方法,用比较简洁的方式,让你们明白嵌入式系统知识体系,以及它的整个脉络。
1嵌入式开发学习方法-框架学习法
嵌入式系统的学习方法不少人都讲过,相信你们在网上或者其余渠道接触过一些思路和方法,在这里讲一下我的的体会。
首先来讲,学习有没有捷径呢?一种说法是能够速成,几天就能够学会,我认为速成的说法太夸张了,那是不可能的事情。
有些人讲学习没有捷径,你必须通过长期的努力,所谓功到天然成。可是学习嵌入式技术,若是说没有好的方法那也是不对的,学习一门新的知识体系确定是要下工夫,可是也须要有好的指引,也就是捷径,实际上这里是讲的就是学习方法。
方法很重要,若是没有方法,闭着眼乱学乱撞,确定是不行的。就像咱们去找一个没有去过的地方,本身跟着感受去找,找到的但愿很小,若是手里面有张地图,而且还有指南针,那就快不少;若是咱们有导航,天然是更快更方便了。实际上,这就是方法的重要性。
那么在这里,咱们来介绍一种学习方法,这种方法也是迅为公司多年培训和产品开发经验所总结出来的。
你们可能会问了,迅为也作过嵌入式培训?实际上咱们有很丰富的培训经验。
咱们以为,‘框架学习法’是最适合初学者采用的一种方法,这里面包含了快速原型的思想;也就是框架学习,快速原型。那么这里面的主导思想呢,就是从一开始就要看到嵌入式系统知识领域的全貌,而后逐渐深刻!编程
好比说,咱们想了解北京这座城市,若是在胡同里转来转去,可能几年都搞不清楚这个城市是什么状况,若是咱们先经过北京地图学习一下,了解下天安门在什么地方,鸟巢在什么地方,香山八达岭在哪里。再加上咱们到这些地方去看一看,可能很快就掌握了这座城市的全貌。
在这里须要注意的是,即使是咱们有了地图,也须要有一些基础,好比咱们要知道什么是天安门,知道鸟巢的来历,明白八达岭是怎么回事,实际上这些就是基础知识。也就是说咱们在学习系统框架以前要具有必定的基础,不然这张地图也是看不懂的。
学习嵌入式技术也是须要必定的基础的,一下子咱们专门讲须要什么样的基础。
接下来若是咱们想进一步的了解这座城市,就要去研究这座城市的历史,甚至是中国的历史。更细一步呢,还能够进一步研究故宫自己的地图。
那么这样一环套一环。通过不断的研究,逐渐就会掌握这座城市的地理、文化、政治经济等特色。
经过了解北京城这个简要的例子,运用框架学习法,在对不一样层次的框架的学习过程当中,逐渐了解和掌握整个系统。
若是咱们不注意方法,天天在胡同里面来回转悠,确定是事倍功半,将在很长时间不得要领。
2嵌入式系统学习的框架
学习嵌入式也是这样。必须掌握必定的方法,才能比较快速有效的学习。
那么这个方法就是框架学习法,刚才咱们也讲了,首先在了解这个基础框架以前咱们要有必定的基础,那么这个基础呢就是单片机和C语言,不须要你掌握的有多好,但必定要具有必定的C语言编程能力。像其余有些课程,好比计算机专业的编译原理、数据结构,计算机系统体系结构,这些知识实际上还不太须要,了解一下就能够了。
有了C语言编程基础,而且学过单片机,这个时候就能够学习一下嵌入式Linux的基本框架了,很简单,那就是要搞清楚bootloader、Kernel、和文件系统,接下来简单介绍一下。
什么是BootLoader呢?
实际上它是个引导程序,也就是硬件复位之后第一个要执行的程序,它主要工做就是初始化操做系统运行的环境,好比说内存、定时器、缓冲器等,当这个工做作完之后,再把操做系统的代码加载到内存,而后操做系统就能够启动并执行,到此为止,bootloader的任务就完成了。
那么有人问了,没有bootloader行不行呢,能够的!可是呢,由于操做系统自己通常是个通用的软件,它要在不一样的平台上运行,好比X86,ARM,POWERPC等等,而不一样的处理器的初始化操做是不一样的,若是操做系统的软硬要考虑在启动时候各类平台的差别性,那就显得过于复杂。除此以外,也有其余方面的缘由,好比烧写系统的便捷性考虑等等,这里暂不作深刻的探讨。
经常使用的bootloder有不少种,好比U-BOOT、REDBOOT、LILO等等,咱们开发板用的是Uboot。
什么是Kernel呢?
Kernel就是Linux的内核,也就是说Linux操做系统自己的代码。那么U-BOOT启动到最后,就是把它加载到内存,而且跳转到Kernel来执行。
什么是文件系统呢?
如今咱们来介绍一下文件系统,这里须要了解一个事实,就是说Linux启动到最后必定要挂载一个文件系统。这个是Linux的一个特色,它不像其余操做系统,好比像VxWorks,是不须要文件系统的,VxWORKS没有文件系统也能够运行。 并且还须要了解一点,像QT系统、Android、以及Ubuntu系统它们的底层都是Linux内核,不一样的是她们的文件系统不同,也就是说,Android系统相关的一些代码,好比说图形界面系统、Android的虚拟机,Android的框架代码都在Linux最后挂的文件系统里面。 若是你们理解了这点,那么这几个系统的基本架构也就清楚了。数组
搞清楚了这几个概念,实际咱们就了解了Linux系统最基本的框架,而后呢咱们根据开发板配套的资料,去学习如何编译这几个文件,由于像Uboot、Kernel、文件系统,最后编译生成出来分别是一个独立的文件,就是说会生成三个文件,最后咱们要学会把这几个文件烧写到板子上。
学会了编译和烧写,接下来呢,咱们在这个框架的基础上,去学习如何作Linux上面的应用程序。
什么是应用程序(APP)呢?这也是框架的内容,它是跑在操做系统上面,经过调用操做系统的资源去工做,是最终的业务逻辑,好比咱们Windows上面有不少的应用程序,好比QQ、暴风影音、WORD、EXEL等,各类各样APP有不少。
根据咱们后期的视频教程,你们应该很快就能学会,好比说串口程序、网络程序等等,这些都是应用程序,咱们不须要作太多,学习几个加深一下对框架的认识就能够了。
再接下来,咱们就须要学习Linux驱动方面的一些知识了,这也是在基础框架里面的,驱动程序能够当作是操做系统的一部分,它在底层专门和硬件打交道。那么你们稍微了解一下,就会知道Linux的驱动包括有三种:字符设备、块设备以及网络设备。
这个时候呢,你们要注意,只须要学习字符类设备驱动,其余两种先不要去管。必定要记住,最初学习嵌入式技术的时候不要去研究块设备和网络设备。也就是说,把字符类设备搞明白就能够了。由于通常的公司开发嵌入式的产品仅限于字符设备的开发,掌握字符设备的框架思想和开发步骤就可以胜任了。至于块设备和网络设备,直接用开发板或者某个开发平台自己提供的驱动就足够了,这些是一线处理器厂家作的事情,通常状况下不须要咱们去完成,这些处理器研发的厂家在为处理器开发配套BSP的时候才会涉及这些工做。
固然了,有的同窗可能会讲,某某公司就是在作块设备驱动,个人意思是讲,从嵌入式这个行业整体上来说,大多数公司都不须要那么作,不少技术都是直接拿来用。咱们掌握了字符设备驱动的开发方法,已经可以应付大多数公司的开发要求,对于一个尚未入门的学生来说,必定要按照我说的办法来学习。
等未来熟练掌握基本技能之后,能够根据框架学习的方法,再去研究更深刻的编程。这个时候,那些计算机专业的课程,好比数据结构、计算机系统体系结构、各类算法等等就能够派上用场了,本身的水平也会在学习的过程当中再次升华。安全
学习字符类设备驱动,请跟着迅为的视频去学习LED的驱动编写方法,以及蜂鸣器、AD转换等这些跟GPIO相关的驱动开发技巧。
掌握了这些,能够讲,咱们已经成为了一个比较合格的嵌入式驱动工程师!网络
这个时候我进一步介绍一下什么是快速原型,若是学过软件工程的话,那么你们会据说过一种自顶向下的产品开发方法,这个方法颇有效,多数产品的开发方法都是遵循这个思想,大概就是从最初的可行性分析,而后概要设计、详细设计,编码,测试等等。
除此以外呢,还有一种开发方法就是‘快速原型’,这个是微软采用的一种方法,简而言之呢,快速原型是个逐渐迭代的方法,就是说让产品尽快把雏形开发出来,而后逐渐清晰,一步步走向成熟。
在这里咱们把快速原型法用到学习上,它原来是种开发方法,咱们这里借鉴过来,借鉴到框架学习的思想上。
也就是说,咱们掌握必定的基础之后,就要去学习框架,当这个基础框架清晰之后,再去学习更新更深刻的框架知识,这样一环套一环,环环相扣,最终研究愈来愈深刻,进而成为这个行业的专家。
那么在嵌入式行业的工程师的职位其实也是这个样子的,你们看一下:
基本数字电路 + C语言 + 基础框架知识 -----> 嵌入式驱动工程师
数组结构+编译原理 ------> 高级嵌入式驱动工程师
计算机系统体系结构 + 操做系统(从抽象到具体)-------> 系统架构工程师数据结构
由于在第一个阶段,你会发现,只要会C语言,有良好的编程功底就够了,在工做的时候不多涉及到编译原理、数据结构这些方面的知识,那么不少其余专业的毕业生,甚至原来学机械设计的同窗均可以成为嵌入式驱动工程师。
实际也是这样,在大多数嵌入式技术公司,尤为是应用产品开发的公司,只要了解基本的Linux架构的知识,而且可以编写字符类的驱动程序就够了。由于像网络设备驱动以及块设备驱动,基本都有个DEMO设计,只要参考这个DEMO作就能够,根本不须要咱们作什么,若是说须要作的话,那也是改一下GPIO的设置,修改一下中断的引脚,仅此而已。
那么深刻学习的话,分析操做系统源码的时候就会发现,数据结构的知识逐渐排上用场,尤为是在某些专业公司,负责某个专用领域的时候,这时候可能会改写操做系统的某部分代码,来适应他们本身硬件的各类状况,将会深刻分析某方面的技术,好比文件系统、网络协议等,这个时候数据结构等方面知识就显得颇有用了。架构
有了基础的原型之后,经过继续学习新的知识,逐渐使上一个层次,更精深的了解嵌入式技术,同时知识体系更加完备,能够作更高层次的工做了。
应用这样的学习方法,在学习过程当中,也会使学习过程始终有目标,并且不会感受枯燥,天天都会有成就感,从一开始就能抓住嵌入式系统的脉络,只要付诸努力,持久学习下去,就能成为嵌入式行业的专家。框架
最后咱们总结下,咱们要想比较快的掌握嵌入式技术,要应用框架学习的方法,在必定的知识基础上就开始学习基础的框架知识,这样就很容易入门,随着开发经验的积累,再去学更深刻的基础知识,以及更深层次的框架知识。这样相互迭代,直到可以精通嵌入式技术。
这个方法也充分说明计算机科学是个实验科学。
那么在学习过程当中,要注意,不用学习过多的基础,也就是说有了C语言和单片机的基础就能够学习嵌入式的基本框架,而后就可以成为一个合格的嵌入式工程师; 之后能够继续深造,学习数据结构编译原理操做系统等方面的知识,深刻学习算法,从而再去学习Linux更深层次的框架结构,使得总体水平获得进一步的升华。性能
如今咱们总结一下,把学习嵌入式技术的路线图跟你们澄清一下,那就是:
单片机 + C语言 -----> 学习基础框架知识(包括bootloadre,Linux内核、文件系统的编译和烧写 -----> 再去学习Linux上层应用的编程,以及字符设备的驱动,学完之后你就会以为入门了,能作一些事情了-----> 再深刻学习计算机系统结构、数据结构、操做系统原理等等一些知识,经过分析Linux系统源码,直到熟练掌握嵌入式编程技术。
我想你们按照这个学习方法,基于咱们iTOP-4412开发板提供的资料和视频,就必定可以学好这门技术。
3关于裸机程序和仿真
有些用户但愿经过ARM开发板来学裸机程序,其实咱们不建议这样作,在ARM上作一些裸机程序,不是不能够,而是没有太多价值,由于裸机程序根本发挥不了ARM处理器的性能,只有运行了操做系统才可以充分挖掘ARM处理器的优点,更可以保证系统运行的安全和稳定性。
若是真的想学习裸机程序,单片机就够了。从架构上来说,单片机和ARM是同样的,都是CPU,并且编程思想也没有多少区别,只不过ARM速度太快了,只有在上面跑操做系统,并使用多任务的编程方法才能最大化的发挥ARM处理器的优点。
在实际产品开发时也是这样,几乎没有拿ARM跑裸机的方式来开发产品的。若是用裸机方式来编程,推荐使用单片机,这样总体成本也会小不少,事实上也是这样的。
早期的时候,咱们在ARM上也作过不少裸机程序,而且用仿真器来调试;不少人,尤为从单片机转过来的人,都但愿学习下这种技术,由于他们感受裸机程序更亲切,而直接用操做系统以为很不踏实,不可以彻底掌握系统的运行状况;其实呢这种想法是不对的。咱们必须在抽象的层次上来开发产品,逐渐转变观念,不能说开发一款产品,就必定要对每一个程序的细节都很是清楚,应该学会在操做系统这个抽象的软件上来开发产品,这样作才符合潮流,也是产品发展以及我的发展必须转变的思路和观念。
由于咱们看到太多的作单片机开发的工程师很难能转到嵌入式产品的开发当中来,恐怕观念的转变能够说是最大的障碍,但愿引发你们的注意。学习