ARM与Linux入门学习建议建议收藏.docx
- 文档编号:11673965
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:16
- 大小:27.85KB
ARM与Linux入门学习建议建议收藏.docx
《ARM与Linux入门学习建议建议收藏.docx》由会员分享,可在线阅读,更多相关《ARM与Linux入门学习建议建议收藏.docx(16页珍藏版)》请在冰点文库上搜索。
ARM与Linux入门学习建议建议收藏
ARM与Linux入门学习建议
由于很多人总问这个问题,所以这里做一个总结文档供大家参考。
这里必须先说明,以下的步骤都是针对Linux系统的,并不面向WinCE。
也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做WinCE的人多,很多产家提供的资料也是以linux为主。
我一直很难理解,其实WinCE的界面比linux的界面好看多了,使用起来也很方便,更为重要的是,WinCE的开发和Windows下的开发基本一样,学起来简单得多,但是学linux或者使用linux做嵌入式的人就是远比WinCE多。
在和很多工作的人交流时我了解到,他们公司从没考虑使用WinCE,因为成本高,都是使用linux进行开发。
我读研究生的的实验室中也没有使用WinCE的,大都研究linux,也有少部分项目使用vxwork,但是就没有听说过使用WinCE的,原因就是开源!
当然现在WinCE6.0听说也开源,不过在成本和资源上linux已经有了无人能挡的优势。
与此相对应的是,越来越多的电子厂商已经开始使用linux开发产品。
举个例子,Google近期开发的智能手机操作系统Android其实就是使用linux-2.6.23内核进行改进得到的。
第一,学习基本的裸机编程。
对于学硬件的人而言,必须先对硬件的基本使用方法有感性的认识,更必须深刻认识该硬件的控制方式,如果一开始就学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、linuxkernel(linux内核)、rootfie(根文件系统)。
那么这3部分是怎么相互协作来构成这个系统的呢?
各自有什么用呢?
三者有什么联系?
怎么联系?
系统的执行流程又是怎么样的呢?
搞清楚这个问题你对整个系统的运行就很清楚了,对于下一步制作这个linux系统就打下了另一个重要的根基。
介绍这方面的资料网上可以挖掘到几吨,自己好好研究吧。
第四,开始做系统移植。
上面说到完整的linux有3部分,而且你也知道了他们之间的关系和作用,那么现在你要做的便是自己动手学会制作这些东西。
当然我不可能叫你编写这些代码,这不实现。
事实上这个3者都能在网下载到相应的源代码,但是这个源代码不可能下载编译后就能在你的系统上运行,需要很多的修改,直到他能运行在你的板子上,这个修改的过程就叫移植。
在进行移植的过程中你要学的东西很多,要懂的相关知识也很多,等你完成了这个过程你会发现你已经算是一个初出茅庐的高手了。
在这个过程中如果你很有研究精神的话你必然会想到看源代码。
很多书介绍你怎么阅读linux源代码,我不提倡无目的地去看linux源代码,用许三多的话说,这没有意义。
等你在做移植的时候你觉得你必须去看源代码时再去找基本好书看看,这里我推荐一本好书倪继利的《linux内核的分析与编程》,这是一本针对linux-2.6.11内核的书,说得很深,建议先提高自己的C语言编程水平再去看。
至于每个部分的移植网上也可以找到好多吨的资料,自己研究研究吧,不过要提醒的是,很多介绍自己经验的东西都或多或少有所保留,你按照他说的去做总有一些问题,但是他不会告诉你怎么解决,这时就要靠自己,如果自己都靠不住就找我一起研究研究吧,我也不能保证能解决你的问题,因为我未必遇到过你的问题,不过我相信能给你一点建议,也许有助你解决问题。
这一步的最终目的是,从源代码的官方主页上(都是外国的,悲哀)下载标准的源代码包,然后进行修改,最终运行在板子上。
盗用阿基米德的一句话:
“给我一根网线,我能将linux搞定”。
第五,研究linux驱动程序的编写。
移植系统并不是最终的目的,最终的目的是开发产品,做项目,这些都要进行驱动程序的开发。
Linux的驱动程序可以说是五花八门,linux2.4和linux2.6的编写有相当大的区别,就是同为linux2.6但是不同版本间的驱动程序也有区别,因此编写linux的驱动程序变都不是那么容易的事情,对于最新版本的驱动程序的编写甚至还没有足够的参考资料。
那么我的建议就是使用、移植一个不算很新的版本内核,这样到时学驱动的编程就有足够的资料了。
这部分的推荐书籍可以参考另一篇文章《推荐几本学习嵌入式linux的书籍》。
第六,研究应用程序的编写。
做作品做项目除了编写驱动程序,最后还要编写应用程序。
现在的趋势是图形应用程序的开发,而图形应用程序中用得最多的还是qt/e函数库。
我一直就使用这个函数库来开发自己的应用程序,不过我希望你能使用国产的MiniGUI函数库。
盗用周杰伦的广告词就是“支持国产,支持MiniGUI”。
MiniGUI的编程比较相似Windows下的VC编程,比较容易上手,效果应该说是相当不错的,我曾使用过来开发ARM7的程序。
不过MiniGUI最大的不好就是没有像qtopia这样的图形操作平台,这大大限制了他的推广,我曾经幻想过与北京飞漫公司(就是MiniGUI的版权拥有者)合作使用MiniGUI函数库开发像qtopia这样的图形操作平台,不过由于水平有限这只能是幻想了,呵呵。
完成这一步你基本就学完了嵌入式linux的全部内容了。
还有一个小小的经验想和大家分享。
我在学习嵌入式linux的过程中很少问人,客观原因是身边的老师、同学师兄都没有这方面的高手,主观原因是我不喜欢问人,喜欢自己研究解决问题。
这样做有个好处,就是可以提高自己解决问题的能力,因为做这些东西总有很多问题你难以理解,别人也没有这方面的经验,也不是所有问题都有人给你答案,这时必须要自己解决问题,这样,个人的解决问题能力就显得非常关键了。
因此我的建议就是一般的问题到网上搜索一下,确实找不到答案了就问问高手,还是不行了就自己去研究,不要一味去等别人帮你解决问题。
记住,问题是学习的最好机会。
就嵌入式系统的设计和实现而言,基本上需要四种不同的工作:
系统设计工作,硬件设计工作,驱动程式和操作系统移植工作和应用程式设计研发工作。
系统设计工作
在系统的设计阶段,系统分析师将根据需求确定系统的硬件的基本构成,根据系统的需求选择使用那种处理器,使用哪种操作系统,使用那些软件研发工具。
系统分析师往往是较为完整的参和过嵌入式系统设计的全过程,对于系统应用的行业较为了解,对于嵌入式系统本身的研发流程十分清晰的人。
硬件设计工作
系统硬件设计人员需要根据系统分析师的设计结果,进行硬件原理图的设计。
通常需要硬件设计人员熟悉嵌入式系统的硬件构成。
硬件设计人员需要了解常用的嵌入式系统处理器,存储器(Flash,SDRAM),以太网MAC芯片,音频/视频编解码芯片,电源管理芯片,总线接口电路(USB,PCI),液晶显示模块,可编程逻辑器件(FPGA/CPLD),无线网络通信模块(Bluetooth,WLAN,GPRS)等硬件电路构成元素的基本工作原理,连接使用方法,使用注意事项,基本调试方法等内容。
在网络上能找到非常多公司的评估板的原理图,对于这些原理图要仔细研究,摸清处理器同存储器,网卡,液晶模块等器件的连接方法和原因。
通过对这些电路的研究,能够较快地了解整个嵌入式系统的构成,这些电路同实际产品中的电路虽有一定差别的,特别是对于手持设备,但这些差别不影响初学者学习嵌入式系统的硬件设计基本构成。
以上这些知识,往往需要较长时间的学习和积累,需要亲自参和实践的机会。
对于刚刚接触嵌入式系统硬件研发的学生来讲,一般不可能全部了解这些知识,但也不会是通通一无所知。
笔者结合自己研发和教学的经验认为:
首先应该选定一款主流且较为简单的嵌入式系统处理器,比如基于ARM7TDMI内核的AT91M40800,S3C44B0等嵌入式系统处理器,学习32位RISC处理器的编程模型,指令集。
高校教学中,单片计算机课程一般以8051系列单片为核心讲解,由于现代32位处理器的结构和研发方式同8位单片机有着较大的差别,学习者还是需要花一点力气来研究以下32位处理器的。
以ARM处理器为例,学习者就需要理解处理器的多种工作模式,备份寄存器,RISC指令集的特点,MMU和虚拟地址,中断处理过程等内容。
在学习指令集的过程中,最佳能够每学习几条指令,就使用这几条指令在模拟器上实验以下,观察处理器执行的结果。
这个过程一方面是学习者对于指令本身的学习能够取得一个比较好的效果,另外也是对研发工具本身的一种学习。
接着,就能开始学习片上资源的使用和设置方法。
这时就需要一个方便使用的研发板,学习者能够通过JTAG仿真器将研发板同调试PC机相连,进行程式的下载,调试。
特别是要仔细研究系统的初始化过程和中断处理的过程。
在研发过程中如果遇见问题,应自己分析问题产生的原因,通过分析缩小问题可能产生的范围,最终找到问题的所在。
最重要的就是要保持一种解决问题的信心,面对困难怎么处理,往往能够决定最终系统是否能够调试成功。
然后,学习者能开始仔细学习处理器同存储器的连接,存储空间的设置,各种外扩器件,如网卡,AC97声卡的工作原理和使用方法。
嵌入式系统硬件设计中往往需要使用可编程器件,学习者还需要一定的时间来学习使用常用的可编程器件(CPLD/FPGA),常用的有Xilinx和Altera公司的产品。
进行系统硬件原理图设计,就需要使用原理图设计的EDA工具,常用的EDA原理图设计工具主要包括Cadence公司的Capture,Protel公司的Protel99SE等。
接下来就能参照评估板的电路图,根据系统的设计需求,开始进行原理图的绘制了。
在原理图绘制过程中,一定要搞清评估板电路连接的原因,对于一时没有搞清晰的问题切不可蒙混过关。
例如,有些处理器的地址线是以字节位单位的,而另一些处理器的地址线则是以两个字节为单位的,当连接16位的存储器的时候,切不可想当然的把处理器的A0直接连接到存储器的A0上面。
常用嵌入式系统处理器和操作系统
处理器
常用嵌入式系统处理器主要包括ARM处理器,PowerPC处理器,基于MIPS内核的嵌入式处理器,软核处理器(如Alter的Nios和Xilinx的MicroBlaze等)和DSP(数字信号处理器)等。
ARM处理器的主要特点是具有较高的性能功耗比。
ARM处理器被广泛的应用在手机,PDA等领域,其中较为著名的有Intel公司生产的基于ARM内核的XScale系列处理器。
由于所有公司生产的基于ARM内核的处理器具有相同的编程模型,在手持和电池供电的系统中,基于ARM的嵌入式系统处理器往往被首先选用。
PowerPC(简称PPC)处理器具有较强的运算性能和数据吞吐能力,在网络和数据通信领域基于PPC的嵌入式系统处理器有着广泛的应用。
其中Motorola公司生产的MPC860/MPC8260被大量地应用在嵌入式网络产品中。
MIPS处理器的特点表目前十分强大的处理能力上。
作为高性能处理器,MIPS处理器适用于网络、企业及高级消费类电子应用,特别是在机顶盒系统中,MIPS处理器具有较高的市场占有率。
随着可编程器件的规模不断扩大,使得人们能够根据需要制定处理器,并方便的将针对某种特别应用制定的处理器方便的在可编程器件内部实现。
除了处理器外,计算机系统还需要许多其他构成部分,比如在多通道媒体数据处理系统中,经常需要使用可编程器件来实现高速的数据处理功能,使用软核DSP来实现复杂的数字信号处理算法,同时还需要处理器进行事务处理,软核处理器将可编程器件,DSP同处理器结合在一起,为系统级设计提供了极大的灵活性。
DSP(数字信号处理器)有别于通用处理器,集中表目前其强大的数字信号处理能力上。
在DSP内部提供了硬件乘累加器,处理器在设计上对于特别的寻址方式做了优化,一些DSP还支持零耗循环(ZeroOverheadLoop)。
为了方便嵌入式系统设计,主流DSP一般也都提供了丰富的外设。
特别值得一提的是ADI公司的Blackfin系列DSP和TI公司的DM64X系列DSP,两种处理器都提供了丰富的片上外设,非常适用嵌入式系统应用。
嵌入式系统研发过程中的常见问题和解决方法
Bootloader怎么写入Flash?
初学者一般都会遇见怎么将程式写入处理器的问题。
对于不同的处理器,能采用不同的方法。
例如Intel的Xscale处理器能使用Intel公司提
供的JFlash工具烧写。
对于具有JTAG(jointtestactiongroup联合测试行动小组)调试工具软件的处理器,能使用如下思路:
编写一段程式,这段程式能将位于SDRAM/S.RAM固定地址中的数据写入Flash中。
烧写时,首先,将这段软件下载到SDRAM中,然后通过调试软件将要写入Flash的数据下载到SDRAM/SRAM的某个固定地址开始的缓冲区,然后通过调试器开始执行程式,将数据写入Flash。
除此以外,网络上还提供了非常多专用的写Flash的工具,研发者能根据自己的需要选用。
(目前明白了我在学的那个BF533为什么先下个flashProgramer.dxe先了)
什么是arm-elf-gcc?
arm-elf-gcc是个交叉C语言编译器。
我们在PC平台下编译程式,编译器运行的处理器同生成的代码将要运行的处理器相同。
不过,在PC机上编译ARM程式时,编译器运行的处理器同生成的代码运行的处理器不同,这种编译器叫做交叉编译器。
其中的elf是指编译器生成的目标文件格式。
(其实我们平时用的单片机编译器如GCC?
AVR等已是交叉编译器了,我到目前才弄清晰什么是交叉编译器)
走了哪条编译路径?
系统程式和驱动程式往往包含非常多的编译选项,非常多选项都是在编译时通过命令行定义的,如果想知道编译的是那一段程式能使用如下的方法:
#ifdefPLAT_AAA
#errorCodeforPlatformAAA
#else
#errorCodeNOTforPlatformAAA
#endif
这样在编译的时候就知道,编译的是哪一条路经了。
对于支持
#pragmamessage(“Iamhere”)的编译器也可使用#pragmamessage预编译指令。
我怎么知道那段代码在那个文件中?
系统编程中经常需要使用在多个文件中搜索字符串,在windows平台下能使用平台提供的多文件字符串搜索工具。
在linux平台下,能使用grep来搜索字符串。
Grep的搜索功能十分强大,支持正则表达式搜索,熟练使用grep对于阅读系统和驱动程式代码是非常有帮助的。
系统是从那个文件开始运行的?
对于WindowsCE系统,一般从WINCE420\PLATFORM\YourPlatform\KERNEL\HAL目录的某个汇编文件中。
对于Linux系统版本不同会存在一定差异,以arm处理器为例,一般会在linux2.4.x\arch\arm\kernel的head-armv.S中。
程式执行到了那里?
能在程式中插入如下代码来实现
printf(“Iamhere%s,%d\n”,__FILE__,__LINE__);
代码将打出printf语句所在的文件名和行号。
推荐书目
JeanMicroC/OS-IITheReal-TimeKernel,SecondEdition
这本书是笔者接触嵌入式实时系统的入门书,在国内能够买到中文版。
这本书较为清晰地讲述了实时系统的概念,各个组成部分的工作原理,特别是公开了实时系统内核的原始码,仔细研究定会受益匪浅。
有个小的提示,对于初学者,这本书能先不看第一章,直接从第二章看起。
AbrahamSilberschatz,PeterBaerGalvin,GregGagneOperatingSystemConcepts
笔者在教学过程中发现,无论是计算机还是电子工程专业都有非常多学生对于操作系统的基本概念都没有搞清,非常少有学生有完整的系统编程经验。
OperatingSystemConcepts这本书对操作系统的感念讲述只能用经典来形容。
对于嵌入式系统有兴趣深入研究的同学,首先要把基础打好,这本书就成了必读之物了。
AndrewS.TanenbaumComputerNetworks
提起AndrewS.Tanenbaum学习计算机的同学一定都知道OPERATINGSYSTEMsesignandImplementation这本书,笔者对于Tanenbaum这样的教授由衷佩服。
网络协议栈是嵌入式系统中的支柱性组成部分。
愿意致力于网络深层技术研究的同学,这本书将你们建立一个坚实的网络基础。
个部分。
全书篇幅较小,可谓短小精悍。
即能作为嵌入式linux系统的入门读物,又是研发过程各个部分的指南。
学习嵌入式系统不了解当前应用最广泛的嵌入式处理器怎么行?
ARM7TDMI的datasheet是学习ARM编程模型,指令集的好东西。
在嵌入式系统中,MMU(内存管理单元)是非常重要的部分,又是较难理解和掌控的部分。
ARM920TTechnicalReferenceManual正好能帮你讲解这方面的内容。
PerterVanDerLinDenExpertCProgramming
嵌入式系统级编程最常用的语言还是C。
非常多同学都自认为自己的C什么是嵌入式编程,什么是ARM如何学习
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。
嵌入式系统一般指非PC系统,它包括硬件和软件两部分。
硬件包括处理器/微处理器、存储器及外设器件和I/O
端口、图形控制器等。
软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序编程。
有时设计人员把这两种软件组合在一起。
应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。
现在所说的嵌入式开发,通常都是指有嵌入式操作系统的那种,产品功能复杂了,单片机开发无法实现,需要用到嵌入式操作系统,也能体现出嵌入式操作系统的优势。
嵌入式产品在航空、医疗、家电、消费电子、汽车电子、移动等众多领域都可以看到,应用领域极为广泛,所以现在嵌入式开发相当热门,并且具备非常好的发展前景!
!
嵌入式系统的核心是嵌入式微处理器。
嵌入式微处理器一般就具备以下4个特点:
1)对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核心的执行时间减少到最低限度。
2)具有功能很强的存储区保护功能。
这是由于嵌入式系统的软件结构已模块化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。
3)可扩展的处理器结构,以能最迅速地开展出满足应用的最高性能的嵌入式微处理器。
4)嵌入式微处理器必须功耗很低,尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统更是如此,如需要功耗只有mW甚至μW级。
嵌入式计算机系统同通用型计算机系统相比具有以下特点:
1.嵌入式系统通常是面向特定应用的嵌入式CPU与通用型的最大不同就是嵌入式CPU大多工作在为特定用户群设计的系统中,它通常都具有低功耗、体积小、集成度高等特点,能够把通用CPU中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统设计趋于小型化,移动能力大大增强,跟网络的耦合也越来越紧密。
2.嵌入式系统是将先进的计算机技术、半导体技术和电
子技术与各个行业的具体应用相结合后的产物。
这一点就决
定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。
3.嵌入式系统的硬件和软件都必须高效率地设计,量体
裁衣、去除冗余,力争在同样的硅片面积上实现更高的性
能,这样才能在具体应用中对处理器的选择更具有竞争力。
4.嵌入式系统和具体应用有机地结合在一起,它的升级
换代也是和具体产品同步进行,因此嵌入式系统产品一旦进
入市场,具有较长的生命周期。
5.为了提高执行速度和系统可靠性,嵌入式系统中的软
件一般都固化在存储器芯片或单片机本身中,而不是存贮于
磁盘等载体中。
6.嵌入式系统本身不具备自举开发能力,即使设计完成
以后用户通常也是不能对其中的程序功能进行修改的,必须
有一套开发工具和环境才能进行开发!
====================
可以尝试以下路线:
(1)c语言是所有编程语言中的强者,单片机、dsp、类似arm的种种芯片的编程都可以用c语言搞定),因此必须非常
熟练的掌握。
推荐书籍:
《thecprogramminglanguage》这本经典的教材是老外写的,也
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM Linux 入门 学习 建议 收藏