本文源于 http://blog.sina.com.cn/s/blog_720b3485010166cx.html
以下均为引用2440技术交流群中ARM先生所提出来的一些体会,跟我自己想得不谋而合,所以分享给大家看看
首先说明,我没啥经验。只是说一下我的体会。也没有朝谁开火的意思。如果无意伤了谁,还望海涵;如果所言有误,还请高手多多指教。
好了,开始忽悠~~~~~~~~~~~~~~~~
在论坛里见到好多朋友学习裸机的时候都有一个习惯——做裸机开发时,过度依赖天嵌的裸机测试程序。怎么说呢,我觉得这样不是很好。尤其是对于一个新手。
也许是学习单片机出身的原因,我有一个毛病,就是对别人的代码不放心、凡事非得扣到底层。
一开始我看天嵌的裸奔三部曲,有一个体会——越看越迷茫。尤其是简单地修改了天嵌的程序,实现了显示几个自定义图片的时候。这里也算是给天嵌提一个建议吧。一般来讲,新手看到这里的感觉就是特迷茫:难道这就是学裸机程序吗?修改几行C代码?天嵌手册里说这样会迅速建立成就感,可是我丝毫没有。反而感到的是强烈的不安。毕竟天嵌的裸机程序对于一个新手来说太庞大,甚至会搞不清文件之间的关系。我们现在做的就是简单地修改几行现成的代码,然后看看效果。我就在想,此时我只会修改几行代码。底层硬件、ARM是如何启动的、启动代码2440init.s是如何支持ARM启动并跳转到C函数里的?这些东西都被天嵌的裸奔三部曲教程透明掉了,这些我都不会,我们只是做了做应用层的修改。而那些被透明掉的知识,现在完全都是依赖于天嵌的测试程序的。试想,一旦一天老板让我做一个新的东西,新的硬件配置,没有了天嵌裸机程序里的底层知识,我们将如之奈何?基本就废了吧。
也许是由于原先是搞单片机的缘故,所以总喜欢扣底层,做Linux或者WinCE上层应用的朋友也许会觉得我在这里瞎折腾,做无用功。但是,对于从单片机转过来的人来说,我说的这些是最重要的——他们要搞清楚ARM是如何工作的,如何用程序去控制硬件,如何靠自己的力气搭建出来一个裸机程序。和做上层的人不一样,做底层的人就喜欢扣这些东西,因为这些东西如果搞不懂,那搞其上层来就会觉得发飘,或者说总是不知道地下发生了什么导致心里没底。最要命的是以后做Linux设备驱动的时候。由于对底层的认识不够,必将导致非常吃力!
这些天狂啃了一顿启动代码2440init.s。忽然意识到,裸机应该换一个方法学。
第一步、狂啃启动代码。
啃过之后你就会发现,原来大家在三星原版基础上改的,然后互相抄,有的甚至都抄错了。这可能是个痛苦的过程,你要找各种版本的2440init.s,但却是必经的。一旦走过,你会发现你对ARM底层就有了和以前不是一个深度的理解。以后做起开发来底气也就足了。这个过程里,你会遇到很多汇编的基础,杜春雷的那本《ARM体系结构编程》就是本很不错的材料。但是千万记住,你拿它当字典用就行,千万别运气下决心要从头到尾看完。不然你真不知道你是怎么死的。以前还有人说一定要通读三星手册,我觉得这跟杀人没什么两样。学习一定要有目的性。当学习启动代码遇到问题时,再去查汇编语法和三星手册时,学习时最快的,记得最牢的。如果漫无目的地通读。。。。就算最后你活下来了,你也不知道之前你都看了些什么。。。。
第二步、跟着启动代码跳转到C程序来。
这个过程就像搞单片机一样了。自己写自己的第一个跑马灯程序、蜂鸣器程序、按键中断程序、定时器、LCD etc etc etc etc etc。最后你再把自己写的所有的东西组合起来,构建成一个属于自己的裸机测试程序。经历过这个过程,你就会发现,原来ARM不是不可战胜的。原来,你已经一步一步踏实的走过来了。这个时候,你回头再看一眼天嵌的逻辑测试程序,你就会淡然一笑,哦,这个啊,我自己已经写出来了。
至此,所谓“成就感”才建立起来。至此,你才可以丝毫不依赖别人地做出自己的东西。至此,你才学到了真正的东西。
因此,在这里我诚恳地向天嵌提出建议。如果写裸奔教程,请从最底层写起。贵公司对启动代码的介绍少之又少。而完全是在对上层做文章。我想,对于一个ARM新手,不管他之前学没学过单片机,你让他过度依赖测试程序的框架做开发,他真的会因为底层基础不好而发飘,导致以后的全部开发都过度依赖现有的测试程序。从本质上讲,