由於很多人總問這個問題,所以這裡做一個總結文檔供大家參考。這裡必須先說明,以下的步驟都是針對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系統就打下了另一個重要的根基。介紹這方面的資料網上可以挖掘到幾噸,自己好好研究吧。