入門向導:ARM與嵌入式linux
由於(yu) 很多人總問這個(ge) 問題,所以這裏做一個(ge) 總結文檔供大家參考。這裏必須先說明,以下的步驟都是針對Linux係統的,並不麵向WinCE。也許你會(hui) 注意到,現在做嵌入式的人中,做linux研究的人遠比做WinCE的人多,很多產(chan) 家提供的資料也是以linux為(wei) 主。我一直很難理解,其實WinCE的 界麵比linux的界麵好看多了,使用起來也很方便,更為(wei) 重要的是,WinCE的開發和Windows下的開發基本一樣,學起來簡單得多,但是學 linux或者使用linux做嵌入式的人就是遠比WinCE多。在和很多工作的人交流時我了解到,他們(men) 公司從(cong) 沒考慮使用WinCE,因為(wei) 成本高,都是使 用linux進行開發。我讀研究生的的實驗室中也沒有使用WinCE的,大都研究linux,也有少部分項目使用vxwork,但是就沒有聽說過使用 WinCE的,原因就是開源!當然現在WinCE6.0聽說也開源,不過在成本和資源上linux已經有了無人能擋的優(you) 勢。與(yu) 此相對應的是,越來越多的電 子廠商已經開始使用linux開發產(chan) 品。舉(ju) 個(ge) 例子,Google開發的智能手機操作係統androids其實就是使用linux-2.6.23內(nei) 核進行改進 得到的。
第一、學習(xi) 基本的裸機編程
對於(yu) 學硬件的人而言,必須先對硬件的基本使用方法有感性的認識,更必須深刻認識該硬件的控製方式,如果一開始就學linux係統、學移植那麽(me) 隻會(hui) 馬上就陷 入一個(ge) 很深的漩渦。我在剛剛開始學ARM的時候是選擇ARM7(主意是當時ARM9還很貴),學ARM7的時候還是保持著學51單片機的思維,使用ADS 去編程,第一個(ge) 實驗就是控製led。學過一段時間ARM的人都會(hui) 笑這樣很笨,實際上也不是,我倒是覺得有這個(ge) 過程會(hui) 好很多,因為(wei) 無論做多複雜的係統最終都 會(hui) 落實到這些最底層的硬件控製,因此對這些硬件的控製有了感性的認識就好很多了。
學習(xi) 裸機的編程的同時要好好理解這個(ge) 硬件的構架、控製原理,這些我稱他為(wei) 理解硬件。所謂的理解硬件就是說,理解這個(ge) 硬件是怎麽(me) 組織這麽(me) 多資源的,這 些資源又是怎麽(me) 由cpu、由編程進行控製的。比如說,s3c2410中有AD轉換器,有GPIO(通用IO口),還有nandflash控製器,這些東(dong) 西 都有一些寄存器來控製,這些寄存器都有一個(ge) 地址,那麽(me) 這些地址是什麽(me) 意思?又怎麽(me) 通過寄存器來控製這些外圍設備的運轉?還有,norflash內(nei) 部的每一 個(ge) 單元在這個(ge) 芯片的內(nei) 存中都有一個(ge) 相應的地址單元,那麽(me) 這些地址與(yu) 剛剛說的寄存器地址又有什麽(me) 關(guan) 係?他們(men) 是一樣的嗎?而與(yu) norflash相對應的 nandflash內(nei) 部的儲(chu) 存單元並不是線性排放的,那麽(me) s3c2410怎麽(me) 將nandflash的地址映射在內(nei) 存空間上進行使用?或者簡單地說應該怎麽(me) 用nandflash?再有,使用ADS進對ARM9行編程時都需要使用到一個(ge) 初始化的匯編文件,這個(ge) 文件究竟有什麽(me) 用?他裏麵的代碼是什麽(me) 意思?不要這 個(ge) 可以嗎?
諸如此類都是對硬件的理解,理解了這些東(dong) 西就對硬件有很深的理解了,這對以後更深一步的學習(xi) 將有很大的幫助,如果跳過這一步,我相信越往後學越會(hui) 覺得迷茫,越覺得這寫(xie) 東(dong) 西深不可測。因為(wei) ,你的根基沒打好。
不過先聲明一下,本人並沒有使用ADS對ARM9進行編程,我是學完ARM7後直接就使用ARM9學linux係統的,因此涉及使用ADS對ARM9進行編程的問題我很難回答^_^,自己去研究研究吧。
對於(yu) 這部分不久將提供一份教程,這個(ge) 教程中的例程並不是我為(wei) 我們(men) 所代理的板子寫(xie) 的,是我在我們(men) 學院實驗室拿的,英培特為(wei) 他們(men) 自己 的實驗箱寫(xie) 的,不過很有借鑒意義(yi) ,可以作為(wei) 一份有價(jia) 值的參考。
第二、使用linux係統進行一些基本的實驗
在買(mai) 一套板子的時候一般會(hui) 提供一些linux的試驗例程,好好做一段時間這個(ge) 吧,這個(ge) 過程也是很有意義(yi) 的,也是為(wei) 進一步的學習(xi) 積累感性認識,你能想 象一個(ge) 從(cong) 沒有使用過linux係統的人能學好linux的編程嗎?好好按照手冊(ce) 上的例程做一做裏麵的實驗,雖然有點娃娃學走路,有點弱智,但是我想很多高 手都會(hui) 經曆這個(ge) 過程。
在這方麵我們(men) 深藍科技目前沒有計劃提供相應的例程,主要是開發板的提供商會(hui) 提供很豐(feng) 富的例程,我們(men) 不做重複工作,隻提供他們(men) 沒有的、最有價(jia) 值的東(dong) 西給大家。
第三、研究完整的linux係統的的運行過程
所謂完整的linux係統包括哪些部分呢?
三部分:bootloader、linux kernel(linux內(nei) 核)、rootfile(根文件係統)。
那麽(me) 這3部分是怎麽(me) 相互協作來構成這個(ge) 係統的呢?各自有什麽(me) 用呢?三者有什麽(me) 聯係?怎麽(me) 聯係?係統的執行流程又是怎麽(me) 樣的呢?搞清楚這個(ge) 問題你對整 個(ge) 係統的運行就很清楚了,對於(yu) 下一步製作這個(ge) linux係統就打下了另一個(ge) 重要的根基。介紹這方麵的資料網上可以挖掘到幾噸,自己好好研究吧。
第四、開始做係統移植
上麵說到完整的linux有3部分,而且你也知道了他們(men) 之間的關(guan) 係和作用,那麽(me) 現在你要做的便是自己動手學會(hui) 製作這些東(dong) 西。
當然我不可能叫你編寫(xie) 這些代碼,這不實現。事實上這個(ge) 3者都能在網下載到相應的源代碼,但是這個(ge) 源代碼不可能下載編譯後就能在你的係統上運行,需要 很多的修改,直到他能運行在你的板子上,這個(ge) 修改的過程就叫移植。在進行移植的過程中你要學的東(dong) 西很多,要懂的相關(guan) 知識也很多,等你完成了這個(ge) 過程你會(hui) 發 現你已經算是一個(ge) 初出茅廬的高手了。
在這個(ge) 過程中如果你很有研究精神的話你必然會(hui) 想到看源代碼。很多書(shu) 介紹你怎麽(me) 閱讀linux源代碼,我不提倡無目的地去看linux源代碼,用許三 多的話說,這沒有意義(yi) 。等你在做移植的時候你覺得你必須去看源代碼時再去找基本好書(shu) 看看,這裏我推薦一本好書(shu) 倪繼利的《linux內(nei) 核的分析與(yu) 編程》,這 是一本針對linux-2.6.11內(nei) 核的書(shu) ,說得很深,建議先提高自己的C語言編程水平再去看。
至於(yu) 每個(ge) 部分的移植網上也可以找到好多噸的資料,自己研究研究吧,不過要提醒的是,很多介紹自己經驗的東(dong) 西都或多或少有所保留,你按照他說的去做總 有一些問題,但是他不會(hui) 告訴你怎麽(me) 解決(jue) ,這時就要靠自己,如果自己都靠不住就找我一起研究研究吧,我也不能保證能解決(jue) 你的問題,因為(wei) 我未必遇到過你的問 題,不過我相信能給你一點建議,也許有助你解決(jue) 問題。
這一步的最終目的是,從(cong) 源代碼的官方主頁上(都是外國的,悲哀)下載標準的源代碼包,然後進行修改,最終運行在板子上。
盜用阿基米德的一句話:“給我一根網線,我能將linux搞定”。
本文鏈接:https://www.kjddy.com/Read/79.html 轉載需授權!