打印
[资料分享]

arm与嵌入式linux的入门建议

[复制链接]
6449|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zzxyd—qiao|  楼主 | 2021-9-27 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
说明,以下的步骤都是针对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、linux kernel(linux 内核)、rootfile(根文件系统)。 那么这3部分是怎么相互协作来构成这个系统的呢?各自有什么用呢?三者有什么联系?怎 么联系?系统的执行流程又是怎么样的呢?搞清楚这个问题你对整个系统的运行就很清楚 了,对于下一步制作这个linux 系统就打下了另一个重要的根基。介绍这方面的资料网上可以 挖掘到几吨,自己好好研究吧。

第四,开始做系统移植。

上面说到完整的linux 有3部分,而且你也知道了他们之间的关系和作用,那么现在你要做的 便是自己动手学会制作这些东西。

当然我不可能叫你编写这些代码,这不实现。事实上这个3者都能在网下载到相应的源代码, 但是这个源代码不可能下载编译后就能在你的系统上运行,需要很多的修改,直到他能运行 在你的板子上,这个修改的过程就叫移植。在进行移植的过程中你要学的东西很多,要懂的 相关知识也很多,等你完成了这个过程你会发现你已经算是一个初出茅庐的高手了。 在这个过程中如果你很有研究精神的话你必然会想到看源代码。很多书介绍你怎么阅读linux 源代码,我不提倡无目的地去看linux 源代码,用许三多的话说,这没有意义。等你在做移植 的时候你觉得你必须去看源代码时再去找基本好书看看,这里我推荐一本好书倪继利的《linux 内核的分析与编程》,这是一本针对linux-2.6.11内核的书,说得很深,建议先提高自己的C 语言编程水平再去看。

至于每个部分的移植网上也可以找到好多吨的资料,自己研究研究吧,不过要提醒的是,很 多介绍自己经验的东西都或多或少有所保留,你按照他说的去做总有一些问题,但是他不会 告诉你怎么解决,这时就要靠自己,如果自己都靠不住就找我一起研究研究吧,我也不能保 证能解决你的问题,因为我未必遇到过你的问题,不过我相信能给你一点建议,也许有助你 解决问题。

这一步的最终目的是,从源代码的官方主页上(都是外国的,悲哀)下载标准的源代码包, 然后进行修改,最终运行在板子上。

盗用阿基米德的一句话:“给我一根网线,我能将linux 搞定”。

第五,研究linux驱动程序的编写。
移植系统并不是最终的目的,最终的目的是开发产品,做项目,这些都要进行驱动程序的开 发。

Linux 的驱动程序可以说是五花八门,linux2.4和linux2.6的编写有相当大的区别,就是同为 linux2.6但是不同版本间的驱动程序也有区别,因此编写linux 的驱动程序变都不是那么容易 的事情,对于最新版本的驱动程序的编写甚至还没有足够的参考资料。那么我的建议就是使 用、移植一个不算很新的版本内核,这样到时学驱动的编程就有足够的资料了。
第六,研究应用程序的编写。

做作品做项目除了编写驱动程序,最后还要编写应用程序。现在的趋势是图形应用程序的开 发,而图形应用程序中用得最多的还是qt/e 函数库。我一直就使用这个函数库来开发自己的 应用程序,不过我希望你能使用国产的MiniGUI 函数库。盗用周杰伦的广告词就是“支持国产, 支持MiniGUI”。MiniGUI 的编程比较相似Windows 下的VC 编程,比较容易上手,效果应该 说是相当不错的,我曾使用过来开发ARM7的程序。不过MiniGUI 最大的不好就是没有像 qtopia 这样的图形操作平台,这大大限制了他的推广,我曾经幻想过与北京飞漫公司(就是 MiniGUI 的版权拥有者)合作使用MiniGUI 函数库开发像qtopia 这样的图形操作平台,不过 由于水平有限这只能是幻想了,呵呵。

完成这一步你基本就学完了嵌入式linux 的全部内容了。

还有一个小小的经验想和大家分享。我在学习嵌入式linux 的过程中很少问人,客观原因是身 边的老师、同学师兄都没有这方面的高手,主观原因是我不喜欢问人,喜欢自己研究解决问 题。这样做有个好处,就是可以提高自己解决问题的能力,因为做这些东西总有很多问题你 难以理解,别人也没有这方面的经验,也不是所有问题都有人给你答案,这时必须要自己解 决问题,这样,个人的解决问题能力就显得非常关键了。因此我的建议就是一般的问题到网 上搜索一下,确实找不到答案了就问问高手,还是不行了就自己去研究,不要一味去等别人 帮你解决问题。

记住,问题是学习的最好机会。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

124

帖子

0

粉丝