大部分嵌入式开发初学者都在问有没有关于ARM与嵌入式linux的入门主张吗?我也知道咱们这样问的原因,所以这儿做一个总结供咱们参阅。事前声明下,以下的进程都是针对Linux体系的,并不面向WinCE。想要面向WinCE入门主张的朋友勿进。
榜首,学习根本的裸机编程。
关于学硬件的人而言,有必要先对硬件的根本运用方法有理性的知道,更有必要深入知道该硬件的操控方法,假如一开端就学linux体系、学移植那么只会立刻就堕入一个很深的漩涡。我在刚刚开端学ARM的时分是挑选ARM7(主见是其时ARM9还很贵),学ARM7的时分仍是保持着学51单片机的思想,运用ADS去编程,榜首个试验便是操控led。学过一段时间ARM的人都会笑这样很笨,实际上也不是,我却是觉得有这个进程会好许多,由于不管做多杂乱的体系终究都会落实到这些最底层的硬件操控,因而对这些硬件的操控有了理性的知道就好许多了学习裸机的编程的一同要好好了解这个硬件的构架、操控原理,这些我称他为了解硬件。所谓的了解硬件便是说,了解这个硬件是怎样安排这么多资源的,这些资源又是怎样由cpu、由编程进行操控的。比如说,s3c2410中有AD转换器,有GPIO(通用IO口),还有nandflash操控器,这些东西都有一些寄存器来操控,这些寄存器都有一个地址,那么这些地址是什么意思?又怎样经过寄存器来操控这些外围设备的作业?还有,norflash内部的每一个单元在这个芯片的内存中都有一个相应的地址单元,那么这些地址与刚刚说的寄存器地址又有什么联系?他们是相同的吗?而与norflash相对应的nandflash内部的贮存单元并不是线性排放的,那么s3c2410怎样将nandflash的地址映射在内存空间进步行运用?或许简略地说应该怎样用nandflash?再有,运用ADS进对ARM9行编程时都需求运用到一个初始化的汇编文件,这个文件终究有什么用?他里边的代码是什么意思?不要这个能够吗?诸如此类都是对硬件的了解,了解了这些东西就对硬件有很深的了解了,这对今后更深一步的学习将有很大的协助,假如越过这一步,我信任越往后学越会觉得苍茫,越觉得这写东西莫测高深。由于,你的根基没打好。不过先声明一下,自己并没有运用ADS对ARM9进行编程,我是学完ARM7后直接就运用ARM9学linux体系的,因而触及运用ADS对ARM9进行编程的问题我很难答复^_^,自己去研讨研讨吧。
关于这部分不久将供给一份教程,这个教程中的例程并不是我为咱们所署理的板子写的,是我在咱们学院试验室拿的,英培特为他们自己的试验箱写的,不过很有学习含义,能够作为一份有价值的参阅。
第二,运用linux体系进行一些根本的试验。
在买一套板子的时分一般会供给一些linux的试验例程,好好做一段时间这个吧,这个进程也是很有含义的,也是为进一步的学习堆集理性知道,你能幻想一个从没有运用过linux体系的人能学好linux的编程吗?好好依照手册上的例程做一做里边的试验,尽管有点娃娃学走路,有点弱智,可是我想许多高手都会阅历这个进程。
在这方面咱们深蓝科技现在没有方案供给相应的例程,主要是开发板的供给商会供给很丰厚的例程,咱们不做重复作业,只供给他们没有的、最有价值的东西给咱们。
第三,研讨完好的linux体系的的运转进程。
所谓完好的linux体系包含哪些部分呢?
三部分:bootloader、linux kernel(linux内核)、rootfile(根文件体系)。
那么这3部分是怎样相互协作来构成这个体系的呢?各自有什么用呢?三者有什么联络?怎样联络?体系的履行流程又是怎样样的呢?搞清楚这个问题你对整个体系的运转就很清楚了,关于下一步制造这个linux体系就打下了另一个重要的根基。介绍这方面的材料网上能够发掘到几吨,自己好好研讨吧。
上面提到完好的linux有3部分,并且你也知道了他们之间的联系和作用,那么现在你要做的便是自己着手学会制造这些东西。
当然我不可能叫你编写这些代码,这不完结。事实上这个3者都能在网下载到相应的源代码,可是这个源代码不可能下载编译后就能在你的体系上运转,需求许多的修正,直到他能运转在你的板子上,这个修正的进程就叫移植。在进行移植的进程中你要学的东西许多,要懂的相关常识或许多,等你完结了这个进程你会发现你现已算是一个初出茅庐的高手了。
在这个进程中假如你很有研讨精力的话你必然会想到看源代码。许多书介绍你怎样阅览linux源代码,我不发起无意图地去看linux源代码,用许三多的话说,这没有含义。等你在做移植的时分你觉得你有必要去看源代码时再去找根本好书看看,这儿我引荐一本好书倪继利的《linux内核的剖析与编程》,这是一本针对linux-2.6.11内核的书,说得很深,主张先进步自己的C言语编程水平再去看。
至于每个部分的移植网上也能够找到许多吨的材料,自己研讨研讨吧,不过要提示的是,许多介绍自己经历的东西都或多或少有所保存,你依照他说的去做总有一些问题,可是他不会告知你怎样处理,这时就要靠自己,假如自己都靠不住就找我一同研讨研讨吧,我也不能确保能处理你的问题,由于我未必遇到过你的问题,不过我信任能给你一点主张,或许有助你处理问题。
这一步的终究意图是,从源代码的官方主页上(都是外国的,悲痛)下载规范的源代码包,然后进行修正,终究运转在板子上。
盗用阿基米德的一句话:“给我一根网线,我能将linux搞定”。
移植体系并不是终究的意图,终究的意图是开发产品,做项目,这些都要进行驱动程序的开发。
Linux的驱动程序能够说是形形色色,linux2.4和linux2.6的编写有适当大的差异,便是同为linux2.6可是不同版别间的驱动程序也有差异,因而编写linux的驱动程序变都不是那么简单的工作,关于最新版别的驱动程序的编写乃至还没有满足的参阅材料。那么我的主张便是运用、移植一个不算很新的版别内核,这样届时学驱动的编程就有满足的材料了。这部分的引荐书本能够参阅另一篇文章《引荐几本学习嵌入式linux的书本》。
做著作做项目除了编写驱动程序,最终还要编写应用程序。现在的趋势是图形应用程序的开发,而图形应用程序中用得最多的仍是qt/e函数库。我一向就运用这个函数库来开发自己的应用程序,与Windows下的VC编程很类似,比较简单上手,作用应该说是适当不错的,我曾运用过来开发ARM7的程序。完结这一步你根本就学完了嵌入式linux的全部内容了。
还有一个小小的经历想和咱们共享。我在学习嵌入式linux的进程中很少问人,客观原因是身边的教师、同学师兄都没有这方面的高手,片面原因是我不喜爱问人,喜爱自己研讨处理问题。这样做有个优点,便是能够进步自己处理问题的才能,由于做这些东西总有许多问题你难以了解,他人也没有这方面的经历,也不是一切问题都有人给你答案,这时有必要要自己处理问题,这样,个人的处理问题才能就显得十分要害了。因而我的主张便是一般的问题到网上查找一下,的确找不到答案了就问问高手,仍是不行了就自己去研讨,不要一味去等他人帮你处理问题。记住,问题是学习的最好时机。