 ARM與嵌入式linux的入門(men)建議
							時間:2012-06-18      來源:未知(zhi)
							ARM與嵌入式linux的入門(men)建議
							時間:2012-06-18      來源:未知(zhi) 
							
	由于很多人總問這個問題,所以這里做一個總結文檔供大家參考。這里必須先說明,以下的步驟都是針對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內核進行改進得到的。
	  
	   第一、學習(xi)基本(ben)的裸機編程
	   對于學(xue)(xue)硬件的(de)(de)人而言,必須先(xian)對硬件的(de)(de)基本使用(yong)(yong)方(fang)法有(you)感(gan)性的(de)(de)認識(shi),更(geng)必須深刻認識(shi)該硬件的(de)(de)控制(zhi)方(fang)式,如果一開(kai)始就學(xue)(xue)linux系統、學(xue)(xue)移植(zhi)那(nei)么(me)只會馬(ma)上就陷(xian)入一個(ge)很深的(de)(de)漩渦。我(wo)在剛剛開(kai)始學(xue)(xue)ARM的(de)(de)時候(hou)是選擇ARM7(主意是當時ARM9還(huan)很貴),學(xue)(xue)ARM7的(de)(de)時候(hou)還(huan)是保持(chi)著學(xue)(xue)51單片機的(de)(de)思維(wei),使用(yong)(yong)ADS去(qu)編程(cheng),第一個(ge)實驗就是控制(zhi)led。學(xue)(xue)過一段時間ARM的(de)(de)人都會笑這(zhe)樣(yang)很笨,實際上也不是,我(wo)倒是覺得有(you)這(zhe)個(ge)過程(cheng)會好很多,因(yin)(yin)為無論做多復雜的(de)(de)系統終都會落實到這(zhe)些底(di)層的(de)(de)硬件控制(zhi),因(yin)(yin)此對這(zhe)些硬件的(de)(de)控制(zhi)有(you)了(le)感(gan)性的(de)(de)認識(shi)就好很多了(le)。
學習裸機(ji)的(de)編(bian)程的(de)同時(shi)要(yao)好好理(li)解這(zhe)(zhe)(zhe)(zhe)(zhe)個(ge)(ge)硬件(jian)(jian)(jian)的(de)構架、控(kong)制(zhi)原理(li),這(zhe)(zhe)(zhe)(zhe)(zhe)些(xie)我稱(cheng)他為理(li)解硬件(jian)(jian)(jian)。所謂的(de)理(li)解硬件(jian)(jian)(jian)就是說(shuo)(shuo),理(li)解這(zhe)(zhe)(zhe)(zhe)(zhe)個(ge)(ge)硬件(jian)(jian)(jian)是怎(zen)(zen)么(me)組織這(zhe)(zhe)(zhe)(zhe)(zhe)么(me)多資(zi)源的(de),這(zhe)(zhe)(zhe)(zhe)(zhe)些(xie)資(zi)源又(you)是怎(zen)(zen)么(me)由cpu、由編(bian)程進(jin)(jin)行控(kong)制(zhi)的(de)。比如(ru)說(shuo)(shuo),s3c2410中有(you)AD轉換器(qi)(qi)(qi),有(you)GPIO(通用(yong)IO口),還(huan)有(you)nandflash控(kong)制(zhi)器(qi)(qi)(qi),這(zhe)(zhe)(zhe)(zhe)(zhe)些(xie)東西都有(you)一(yi)些(xie)寄(ji)存(cun)器(qi)(qi)(qi)來(lai)控(kong)制(zhi),這(zhe)(zhe)(zhe)(zhe)(zhe)些(xie)寄(ji)存(cun)器(qi)(qi)(qi)都有(you)一(yi)個(ge)(ge)地址(zhi),那么(me)這(zhe)(zhe)(zhe)(zhe)(zhe)些(xie)地址(zhi)是什(shen)么(me)意思(si)?又(you)怎(zen)(zen)么(me)通過寄(ji)存(cun)器(qi)(qi)(qi)來(lai)控(kong)制(zhi)這(zhe)(zhe)(zhe)(zhe)(zhe)些(xie)外圍設備的(de)運轉?還(huan)有(you),norflash內部(bu)的(de)每一(yi)個(ge)(ge)單元(yuan)在這(zhe)(zhe)(zhe)(zhe)(zhe)個(ge)(ge)芯片(pian)的(de)內存(cun)中都有(you)一(yi)個(ge)(ge)相(xiang)應的(de)地址(zhi)單元(yuan),那么(me)這(zhe)(zhe)(zhe)(zhe)(zhe)些(xie)地址(zhi)與剛(gang)剛(gang)說(shuo)(shuo)的(de)寄(ji)存(cun)器(qi)(qi)(qi)地址(zhi)又(you)有(you)什(shen)么(me)關系?他們是一(yi)樣的(de)嗎?而與norflash相(xiang)對應的(de)nandflash內部(bu)的(de)儲存(cun)單元(yuan)并不(bu)是線性排(pai)放的(de),那么(me)s3c2410怎(zen)(zen)么(me)將nandflash的(de)地址(zhi)映射在內存(cun)空(kong)間上進(jin)(jin)行使用(yong)?或者簡單地說(shuo)(shuo)應該怎(zen)(zen)么(me)用(yong)nandflash?再有(you),使用(yong)ADS進(jin)(jin)對ARM9行編(bian)程時(shi)都需要(yao)使用(yong)到一(yi)個(ge)(ge)初(chu)始化(hua)的(de)匯編(bian)文(wen)件(jian)(jian)(jian),這(zhe)(zhe)(zhe)(zhe)(zhe)個(ge)(ge)文(wen)件(jian)(jian)(jian)究(jiu)竟(jing)有(you)什(shen)么(me)用(yong)?他里(li)面的(de)代碼是什(shen)么(me)意思(si)?不(bu)要(yao)這(zhe)(zhe)(zhe)(zhe)(zhe)個(ge)(ge)可以嗎?
諸如(ru)此(ci)類都是對(dui)硬件的(de)理(li)解(jie),理(li)解(jie)了這(zhe)些(xie)東(dong)(dong)西(xi)就對(dui)硬件有(you)很(hen)深的(de)理(li)解(jie)了,這(zhe)對(dui)以后更(geng)深一步的(de)學習將有(you)很(hen)大的(de)幫(bang)助(zhu),如(ru)果(guo)跳過這(zhe)一步,我相信越(yue)往后學越(yue)會覺得(de)迷(mi)茫,越(yue)覺得(de)這(zhe)寫東(dong)(dong)西(xi)深不可測(ce)。因為(wei),你(ni)的(de)根基沒打好(hao)。
不過先聲明一下,本人并(bing)沒有使用(yong)ADS對(dui)ARM9進行(xing)(xing)編(bian)(bian)程,我是學完ARM7后直接就(jiu)使用(yong)ARM9學linux系統的(de),因此(ci)涉及使用(yong)ADS對(dui)ARM9進行(xing)(xing)編(bian)(bian)程的(de)問題我很難回答^_^,自己去研(yan)究(jiu)研(yan)究(jiu)吧。
對于這部分不(bu)久將提供一份教程,這個教程中的例程并(bing)不(bu)是(shi)我為我們(men)所代(dai)理的板(ban)子(zi)寫(xie)的,是(shi)我在我們(men)學(xue)院實(shi)驗(yan)室拿的,英培(pei)特為他們(men)自己 的實(shi)驗(yan)箱寫(xie)的,不(bu)過很(hen)有借(jie)鑒意義,可(ke)以(yi)作為一份有價值的參考。
第二(er)、使用linux系統進行一些基本(ben)的實驗
在買一(yi)(yi)套板子(zi)的(de)(de)(de)時候一(yi)(yi)般(ban)會提供一(yi)(yi)些linux的(de)(de)(de)試驗例程(cheng),好(hao)好(hao)做(zuo)一(yi)(yi)段時間(jian)這個(ge)吧,這個(ge)過程(cheng)也是很(hen)有(you)意義(yi)的(de)(de)(de),也是為進一(yi)(yi)步的(de)(de)(de)學習積累(lei)感性(xing)認識,你能(neng)想(xiang)象(xiang)一(yi)(yi)個(ge)從沒(mei)有(you)使用過linux系(xi)統的(de)(de)(de)人能(neng)學好(hao)linux的(de)(de)(de)編程(cheng)嗎?好(hao)好(hao)按照手冊上(shang)的(de)(de)(de)例程(cheng)做(zuo)一(yi)(yi)做(zuo)里面的(de)(de)(de)實驗,雖然(ran)有(you)點娃娃學走(zou)路,有(you)點弱智,但是我想(xiang)很(hen)多高手都會經歷這個(ge)過程(cheng)。
在這方面我們深藍科技目前沒有(you)計劃提供相應的例(li)(li)程,主要是開發板(ban)的提供商會提供很豐富的例(li)(li)程,我們不(bu)做(zuo)重復工作,只提供他們沒有(you)的、有(you)價值的東(dong)西給大(da)家(jia)。
第(di)三、研究完整的(de)linux系(xi)統的(de)的(de)運行(xing)過(guo)程
所謂完整的linux系統包括哪(na)些部(bu)分呢?
三部分:bootloader、linux kernel(linux內(nei)核)、rootfile(根文件系統)。
那么(me)這3部分(fen)是怎(zen)么(me)相互(hu)協作來構成這個系統(tong)的(de)呢?各(ge)自有(you)(you)什么(me)用呢?三者有(you)(you)什么(me)聯(lian)系?怎(zen)么(me)聯(lian)系?系統(tong)的(de)執行流程(cheng)又是怎(zen)么(me)樣的(de)呢?搞清楚這個問題你(ni)對(dui)整個系統(tong)的(de)運行就很清楚了,對(dui)于下一步制作這個linux系統(tong)就打(da)下了另一個重要(yao)的(de)根基。介紹這方面的(de)資料網上可以挖(wa)掘到幾(ji)噸(dun),自己(ji)好好研究吧。
第四、開始做系(xi)統(tong)移植
上(shang)面說到完整的linux有3部分,而且你也(ye)知(zhi)道了他們之間(jian)的關系(xi)和作(zuo)用,那么現在你要(yao)做的便(bian)是自己動手學會制(zhi)作(zuo)這些(xie)東西。
當然(ran)我(wo)不(bu)可(ke)能(neng)(neng)叫你(ni)編寫這(zhe)(zhe)些代碼(ma),這(zhe)(zhe)不(bu)實現。事實上這(zhe)(zhe)個(ge)(ge)3者(zhe)都能(neng)(neng)在(zai)(zai)網下載到相應(ying)的(de)源代碼(ma),但是這(zhe)(zhe)個(ge)(ge)源代碼(ma)不(bu)可(ke)能(neng)(neng)下載編譯后就(jiu)能(neng)(neng)在(zai)(zai)你(ni)的(de)系統上運行(xing),需(xu)要很(hen)多(duo)的(de)修(xiu)改(gai),直到他能(neng)(neng)運行(xing)在(zai)(zai)你(ni)的(de)板子(zi)上,這(zhe)(zhe)個(ge)(ge)修(xiu)改(gai)的(de)過(guo)程就(jiu)叫移植。在(zai)(zai)進行(xing)移植的(de)過(guo)程中你(ni)要學的(de)東西很(hen)多(duo),要懂的(de)相關知識也很(hen)多(duo),等你(ni)完(wan)成(cheng)了這(zhe)(zhe)個(ge)(ge)過(guo)程你(ni)會發現你(ni)已(yi)經算是一個(ge)(ge)初出(chu)茅廬的(de)高手了。
在這(zhe)個過程中如果你(ni)很有研究精神的(de)(de)(de)(de)話(hua)你(ni)必然會想到看源(yuan)代(dai)碼(ma)。很多(duo)書(shu)(shu)介紹你(ni)怎么閱讀linux源(yuan)代(dai)碼(ma),我不提(ti)(ti)倡無目的(de)(de)(de)(de)地去看linux源(yuan)代(dai)碼(ma),用許三多(duo)的(de)(de)(de)(de)話(hua)說,這(zhe)沒(mei)有意義。等(deng)你(ni)在做移植的(de)(de)(de)(de)時(shi)候你(ni)覺(jue)得(de)你(ni)必須去看源(yuan)代(dai)碼(ma)時(shi)再去找(zhao)基本(ben)好(hao)書(shu)(shu)看看,這(zhe)里我推(tui)薦(jian)一本(ben)好(hao)書(shu)(shu)倪繼利的(de)(de)(de)(de)《linux內(nei)核的(de)(de)(de)(de)分析與編(bian)(bian)程》,這(zhe)是(shi)一本(ben)針對linux-2.6.11內(nei)核的(de)(de)(de)(de)書(shu)(shu),說得(de)很深(shen),建議(yi)先提(ti)(ti)高自己的(de)(de)(de)(de)C語言編(bian)(bian)程水平再去看。
至于每個部分的(de)(de)移植(zhi)網上(shang)也可(ke)以找(zhao)到好多(duo)噸(dun)的(de)(de)資(zi)料(liao),自(zi)己研(yan)究研(yan)究吧,不(bu)過(guo)要提醒(xing)的(de)(de)是,很多(duo)介(jie)紹(shao)自(zi)己經驗的(de)(de)東(dong)西(xi)都或(huo)多(duo)或(huo)少有(you)(you)所保留(liu),你(ni)(ni)(ni)按照(zhao)他說的(de)(de)去(qu)做總(zong)有(you)(you)一(yi)些問(wen)(wen)題(ti)(ti),但是他不(bu)會告訴你(ni)(ni)(ni)怎么解(jie)決(jue)(jue),這(zhe)時就(jiu)要靠自(zi)己,如果自(zi)己都靠不(bu)住就(jiu)找(zhao)我一(yi)起研(yan)究研(yan)究吧,我也不(bu)能保證能解(jie)決(jue)(jue)你(ni)(ni)(ni)的(de)(de)問(wen)(wen)題(ti)(ti),因(yin)為我未必遇到過(guo)你(ni)(ni)(ni)的(de)(de)問(wen)(wen)題(ti)(ti),不(bu)過(guo)我相(xiang)信能給(gei)你(ni)(ni)(ni)一(yi)點建議,也許有(you)(you)助(zhu)你(ni)(ni)(ni)解(jie)決(jue)(jue)問(wen)(wen)題(ti)(ti)。
這一步的(de)終目的(de)是,從(cong)源代碼(ma)(ma)的(de)官方(fang)主頁上(都是外國的(de),悲哀)下載(zai)標準(zhun)的(de)源代碼(ma)(ma)包(bao),然后(hou)進行修改,終運行在(zai)板(ban)子上。
盜(dao)用阿基米(mi)德的(de)一句(ju)話:“給我(wo)一根(gen)網(wang)線,我(wo)能將linux搞定”。
第(di)五、研究linux驅動程序的(de)編寫
移植系統(tong)并(bing)不是(shi)終(zhong)的目(mu)的,終(zhong)的目(mu)的是(shi)開發(fa)產品(pin),做項目(mu),這些都要進行(xing)驅動(dong)程(cheng)序(xu)的開發(fa)。
Linux的(de)(de)驅(qu)動(dong)(dong)程序(xu)(xu)可以說是五(wu)花八門(men),linux2.4和linux2.6的(de)(de)編(bian)寫有相當大的(de)(de)區別,就(jiu)是同為linux2.6但(dan)是不(bu)同版本(ben)間(jian)的(de)(de)驅(qu)動(dong)(dong)程序(xu)(xu)也有區別,因此編(bian)寫linux的(de)(de)驅(qu)動(dong)(dong)程序(xu)(xu)變都不(bu)是那(nei)么容易的(de)(de)事情(qing),對于新(xin)版本(ben)的(de)(de)驅(qu)動(dong)(dong)程序(xu)(xu)的(de)(de)編(bian)寫甚至(zhi)還沒有足夠(gou)(gou)的(de)(de)參(can)考資料。那(nei)么我(wo)的(de)(de)建議就(jiu)是使用、移植(zhi)一個不(bu)算(suan)很(hen)新(xin)的(de)(de)版本(ben)內核,這樣(yang)到時學驅(qu)動(dong)(dong)的(de)(de)編(bian)程就(jiu)有足夠(gou)(gou)的(de)(de)資料了。
第(di)六、研究應(ying)用程(cheng)序的(de)編寫
做(zuo)作(zuo)(zuo)品做(zuo)項(xiang)目除了(le)編寫(xie)驅(qu)動程(cheng)序(xu)(xu),后(hou)還(huan)(huan)要編寫(xie)應(ying)用(yong)(yong)程(cheng)序(xu)(xu)。現在的(de)(de)(de)趨(qu)勢是(shi)圖(tu)形應(ying)用(yong)(yong)程(cheng)序(xu)(xu)的(de)(de)(de)開(kai)發(fa),而(er)圖(tu)形應(ying)用(yong)(yong)程(cheng)序(xu)(xu)中用(yong)(yong)得(de)多的(de)(de)(de)還(huan)(huan)是(shi)qt/e函(han)數庫。我(wo)一直就使(shi)用(yong)(yong)這個函(han)數庫來開(kai)發(fa)自己的(de)(de)(de)應(ying)用(yong)(yong)程(cheng)序(xu)(xu),不過我(wo)希望你能(neng)使(shi)用(yong)(yong)國產的(de)(de)(de)MiniGUI函(han)數庫。盜用(yong)(yong)周杰倫的(de)(de)(de)廣(guang)告詞就是(shi)“支持國產,支持MiniGUI”。MiniGUI的(de)(de)(de)編程(cheng)比較相(xiang)似Windows下的(de)(de)(de)VC編程(cheng),比較容易上(shang)手,效果應(ying)該說是(shi)相(xiang)當不錯的(de)(de)(de),我(wo)曾使(shi)用(yong)(yong)過來開(kai)發(fa)ARM7的(de)(de)(de)程(cheng)序(xu)(xu)。不過MiniGUI大(da)的(de)(de)(de)不好就是(shi)沒有(you)像qtopia這樣(yang)的(de)(de)(de)圖(tu)形操作(zuo)(zuo)平臺,這大(da)大(da)限制了(le)他(ta)的(de)(de)(de)推(tui)廣(guang),我(wo)曾經幻想過與北京飛(fei)漫公司(就是(shi)MiniGUI的(de)(de)(de)版權擁有(you)者)合作(zuo)(zuo)使(shi)用(yong)(yong)MiniGUI函(han)數庫開(kai)發(fa)像qtopia這樣(yang)的(de)(de)(de)圖(tu)形操作(zuo)(zuo)平臺,不過由于水平有(you)限這只(zhi)能(neng)是(shi)幻想了(le),呵(he)呵(he)。
完(wan)成這一(yi)步你基本就學完(wan)了嵌入(ru)式linux的全(quan)部(bu)內容(rong)了。
還有(you)一(yi)(yi)個(ge)小小的(de)(de)經驗(yan)(yan)想(xiang)和(he)大家分享。我(wo)在學習嵌(qian)入(ru)式(shi)linux的(de)(de)過程中很少問(wen)人,客(ke)觀原因(yin)是(shi)(shi)身邊(bian)的(de)(de)老師、同學師兄都沒有(you)這(zhe)(zhe)方面(mian)的(de)(de)高手,主觀原因(yin)是(shi)(shi)我(wo)不(bu)(bu)喜(xi)歡(huan)問(wen)人,喜(xi)歡(huan)自己(ji)研究(jiu)解(jie)(jie)決(jue)問(wen)題(ti)(ti)。這(zhe)(zhe)樣做(zuo)(zuo)有(you)個(ge)好處(chu),就是(shi)(shi)可以提高自己(ji)解(jie)(jie)決(jue)問(wen)題(ti)(ti)的(de)(de)能力,因(yin)為做(zuo)(zuo)這(zhe)(zhe)些東西(xi)總有(you)很多問(wen)題(ti)(ti)你(ni)難以理解(jie)(jie),別(bie)人也沒有(you)這(zhe)(zhe)方面(mian)的(de)(de)經驗(yan)(yan),也不(bu)(bu)是(shi)(shi)所有(you)問(wen)題(ti)(ti)都有(you)人給你(ni)答(da)案,這(zhe)(zhe)時必須(xu)要自己(ji)解(jie)(jie)決(jue)問(wen)題(ti)(ti),這(zhe)(zhe)樣,個(ge)人的(de)(de)解(jie)(jie)決(jue)問(wen)題(ti)(ti)能力就顯得(de)非常關鍵了(le)(le)。因(yin)此我(wo)的(de)(de)建(jian)議就是(shi)(shi)一(yi)(yi)般的(de)(de)問(wen)題(ti)(ti)到網上搜索一(yi)(yi)下,確(que)實找(zhao)不(bu)(bu)到答(da)案了(le)(le)就問(wen)問(wen)高手,還是(shi)(shi)不(bu)(bu)行(xing)了(le)(le)就自己(ji)去研究(jiu),不(bu)(bu)要一(yi)(yi)味(wei)去等(deng)別(bie)人幫你(ni)解(jie)(jie)決(jue)問(wen)題(ti)(ti)。
記(ji)住,問題(ti)是學習的好機會(hui)。

