第一篇:ARM與嵌入式Linux的入門建議.
ARM與嵌入式linux的入門建議
ARM與嵌入式linux的入門建議
類別:嵌入式系統
由于很多人總問這個問題,所以這里做一個總結文檔供大家參考。這里必須先說明,以下的步驟都是針對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的驅動程序變都不是那么容易的事情,對于最新版本的驅動程序的編寫甚至還沒有足夠的參考資料。那么我的建議就是使用、移植一個不算很新的版本內核,這樣到時學驅動的編程就有足夠的資料了。這部分的推薦書籍可以參考另一篇文章《推薦幾本學習嵌入式linux的書籍》。第六,研究應用程序的編寫。做作品做項目除了編寫驅動程序,最后還要編寫應用程序。現在的趨勢是圖形應用程序的開發,而圖形應用程序中用得最多的還是qt/e函數庫。我一直就使用這個函數庫來開發自己的應用程序,不過我希望你能使用國產的MiniGUI函數庫。盜用周杰倫的廣告詞就是“支持國產,支持MiniGUI”。MiniGUI的編程比較相似Windows下的VC編程,比較容易上手,效果應該說是相當不錯的,我曾使用過來開發ARM7的程序。不過MiniGUI最大的不好就是沒有像qtopia這樣的圖形操作平臺,這大大限制了他的推廣,我曾經幻想過與北京飛漫公司(就是MiniGUI的版權擁有者)合作使用MiniGUI函數庫開發像qtopia這樣的圖形操作平臺,不過由于水平有限這只能是幻想了,呵呵。完成這一步你基本就學完了嵌入式linux的全部內容了。還有一個小小的經驗想和大家分享。我在學習嵌入式linux的過程中很少問人,客觀原因是身邊的老師、同學師兄都沒有這方面的高手,主觀原因是我不喜歡問人,喜歡自己研究解決問題。這樣做有個好處,就是可以提高自己解決問題的能力,因為做這些東西總有很多問題你難以理解,別人也沒有這方面的經驗,也不是所有問題都有人給你答案,這時必須要自己解決問題,這樣,個人的解決問題能力就顯得非常關鍵了。因此我的建議就是一般的問題到網上搜索一下,確實找不到答案了就問問高手,還是不行了就自己去研究,不要一味去等別人幫你解決問題。記住,問題是學習的最好機會。
第二篇:ARM與嵌入式linux的入門建議(六步曲).
【轉帖】 ARM與嵌入式linux的入門建議(六部曲)由于很多人總問這個問題,所以這里做一個總結供大家參考。這里必須先說明,以下的步驟都是針對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的驅動程序變都不是那么容易的事情,對于最新版本的驅動程 序的編寫甚至還沒有足夠的參考資料。那么我的建議就是使用、移植一個不算很新的版本內核,這樣到時學驅動 的編程就有足夠的資料了。這部分的推薦書籍可以參考另一篇文章《推薦幾本學習嵌入式linux的書籍》。
第六,研究應用程序的編寫。
做作品做項目除了編寫驅動程序,最后還要編寫應用程序。現在的趨勢是圖形應用程序的開發,而圖形應用 程序中用得最多的還是qt/e函數庫。我一直就使用這個函數庫來開發自己的應用程序,不過我希望你能使用國產 的MiniGUI函數庫。盜用周杰倫的廣告詞就是“支持國產,支持MiniGUI”。MiniGUI的編程比較相似Windows下的 VC編程,比較容易上手,效果應該說是相當不錯的,我曾使用過來開發ARM7的程序。不過MiniGUI最大的不好就 是沒有像qtopia這樣的圖形操作平臺,這大大限制了他的推廣,我曾經幻想過與北京飛漫公司(就是MiniGUI的 版權擁有者)合作使用MiniGUI函數庫
開發像qtopia這樣的圖形操作平臺,不過由于水平有限這只能是幻想了,呵呵。完成這一步你基本就學完了嵌入式linux的全部內容了。
還有一個小小的經驗想和大家分享。我在學習嵌入式linux的過程中很少問人,客觀原因是身邊的老師、同 學師兄都沒有這方面的高手,主觀原因是我不喜歡問人,喜歡自己研究解決問題。這樣做有個好處,就是可以提 高自己解決問題的能力,因為做這些東西總有很多問題你難以理解,別人也沒有這方面的經驗,也不是所有問題 都有人給你答案,這時必須要自己解決問題,這樣,個人的解決問題能力就顯得非常關鍵了。因此我的建議就是 一般的問題到網上搜索一下,確實找不到答案了就問問高手,還是不行了就自己去研究,不要一味去等別人幫你 解決問題。記住,問題是學習的最好機會。在網上看到了這篇好文章,跟大家分享一下,希望對大家的學習有所幫助!ARM與嵌入式linux的入門建議(六部曲)由于很多人總問這個問題,所以這里做一個總結供大家參考。這里必須先說明,以下的步驟都是針對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系統進行一些基本的實驗。
第三,研究完整的linux系統的的運行過程。
第四,開始做系統移植。
第五,研究linux驅動程序的編寫。
第六,研究應用程序的編寫。
在網上看到了這篇好文章,跟大家分享一下,希望對大家的學習有所幫助!深圳信盈達嵌入式、單片機、ARM、MIPS、FPGA、Android培訓!免費試聽,滿意后給您量身定制 課程(包學會),快速提高您的技能!教學特色:名師督學+工程師指導;項目案列解析+實際解決方案!技術顧問:曹老師:qq:2859780203 歡迎大家進入華南地區最大的單片機嵌入式學習群:247452389 共同交流、學習
第三篇:嵌入式linu學習心得
嵌入式Linux學習心得
1、Linux命令
ls:查看目錄-l以列表方式查看;ls –l 與ll的功能一樣 pwd: 查看當前的目錄
cd:改變當前操作目錄cd /直接跳到根目錄 cd..回到上一級目錄 cat: 打印顯示當前文件的內容信息
mkdir:創建目錄
fdisk: 查看硬盤分區信息,-l以列表方式查看
->代表是鏈接文件,類似window下的快捷方式。
cp: 復制命令,例子cp 文件名 /home/dir/
mv: 移動或改名,如mv sonf.confsonf.txt(改名)移動:mv sonf.conf / rm:刪除命令,如rm –f test.c;如刪除目錄rm –fr d
man:查看某個命令的幫助,man 命令
2、各系統目錄的功能
drw—r—w--:d代表是目錄,drw代表當前用戶的權限,r代表組用戶的權限,w代表其它用戶的權限。x代表有執行權限。
/boot/gruff.conf: 啟動引導程序
/dev:brw—rw--:b代表是塊設備。Linux設備有三種,塊設備(b開頭)、字符設備(c開頭)、網絡設備。had代表第一個硬盤,hdb代表第二個硬盤。Hdb2代表第二塊硬盤的第二個分區。3,67代表主設備為3,從設備為67./etc:存放的是系統的配置文件。Inittab文件存放不同啟動方式下必須啟動的進程。Inittab文件中有6個啟動level,wait中對應著6個level的目錄,respawn代表當一個進程被意外終止了,但會自動啟動的進程,如守護進程。rc.d目錄中存放了一個rc.sysinit文件,里面存放系統初始化配置信息。/etc還有一個vsftpd里面存放tcp、ftp的配置。
/home : 用戶目錄,存放用戶的文件,/lib:存放庫文件,后綴為so的文件代表動態鏈接庫。
/lost+found:系統意外終止,存放一些可以找回的文件。
/mnt:掛載外部設備,如掛載光驅:mount –t /dev/cdrom/mnt/cdrom,如
果在雙系統中,要查看windows中D盤的文件,首先應該將D盤的文件映射過來,mount –t /dev/hda2/mnt/windows/d
/opt:用戶安裝的應用程序
/proc:是系統運行的映射,比較重要。里面的文件數字代表進程號。每個進程號目錄下包含進程的基本信息。還有其他信息,如cpuinfo等,內核支持的文件系統filesystem等。系統支持的中斷interrupts,iomen代表內存分配情況。ioport存放IO端口號。還有分區信息,modole信息,狀態信息,版本信息
對于Linux的設備驅動程序,有兩種加載模式,一種是直接加載進linux內核,一種是以模塊的方式加載到內核。
/sbin: 系統管理的一些工具。如poweroff關機工具。
/usr: 安裝系統時很多文件放在此目錄下面,包含一些更新等,include包含的頭文件,lib 是Linux的庫文件,src包含Linux2.4的內核源碼
/var:存放是臨時變量
3、
第四篇:ARM與嵌入式實驗報告
ARM與嵌入式技術
實驗報告
專業班級:通信工程
姓名:**** 學號:******
實驗日期:2012年6月7日 指導老師:*****
一、實驗目的
1.學習使用Embest IDE開發環境及ARM 軟件模擬器;
2.掌握簡單ARM 匯編指令,進一步加強對嵌入式的熟悉和了解。
二、實驗設備
硬件:PC 機
軟件:Embest IDE 開發環境
三、實驗內容
例3:實現64位加法運算,要求【R1:R0】+【R3:R2】,結果放回【R1:R0】中; 例2:編寫程序將R2的高8位傳送到R3的低8位(不考慮R3的其它位); 例7:編寫一段程序計算10!;
例8:串拷貝(R1指向源數據串的首地址,R0指向目的數據串的首地址)。
四、實驗步驟
1)新建工程:
運行Embest IDE 集成開發環境,選擇菜單項File → New Workspace,如圖一,系統彈出一個對話框,鍵入文件名“沈”,如圖二,點擊OK 按鈕。將創建一個新工程,并同時創建一個與工程名相同的工作區。此時在工作區窗口將打開該工作區和工程.。
2)建立源文件:
點擊菜單項File → New,如圖三,系統彈出一個新的文本編輯窗,輸入源文件代碼。編輯完后,保存文件“沈.s”后綴,如圖四。
3)添加源文件:
選擇菜單項Project → Add To Project → Files,在工程目錄下選擇剛才建立的源文件.s后綴文件,如圖五,圖六。
4)基本配置:
選擇菜單項Project → Settings,彈出工程設置對話框。在工程設置對話框中。① 選擇Processor 設置對話框,按照圖七所示,進行配置:
圖七
② 選擇Remote設置對話框,按照下圖八所示,進行配置:
圖八 ③ 選擇最右邊一個進行編譯,顯示如圖九,則編譯成功。
圖九
④ 選擇Project → Settings → Debug設置對話框,按照圖十所示,進行配置:
圖十 ⑤
選擇
5)選擇菜單項Debug →Remote Connect 進行連接軟件仿真器,將存儲器地址改為0x1000,如圖十一,執行Debug →Download 命令下載程序,并打開寄存器窗口。打開memory 窗口,按F10進行單步跟蹤,觀察寄存器的數據變化并分析。最右邊一個進行編譯,顯示如圖九,則編譯成功。
圖十一
五、各實驗的參考程序及運行結果
實驗一:(例3)實現64位加法運算,要求【R1:R0】+【R3:R2】,結果放回【R1:R0】中; 1.程序代碼如下:
.global _start
.text _start:
mov R0,#11
/*R0=11*/ mov R1,#22
/*R1=22*/ mov R2,#33
/*R2=33*/ mov R3,#44
/*R3=44*/ ADDS R0,R0,R2
/*R0等于低32位相加,并影響標志位*/
ADC R1,R1,R3
/*R1等于高32位相加,并加上低位進位*/ stop:
b stop.end
2.分析調試:
①download下載:
② 讀入數據:
③ r0+r2→r0(低32位):
④ r1+r3→r1(帶進位的加法):
實驗二:(例2)編寫程序將R2高8位傳送到R3的低8位(不考慮R3的其它位);
1.程序代碼如下:
.global _start _start: ldr r2,=0x23453401 ldr r3,=0xabcd1200 and r2,r2,#0xff000000 /*保留R2的高8位,屏蔽低24位*/ and r3,r3,#0xffffff00 /*保留R3的高24位,屏蔽低8位*/
orr r3,r3,r2,lsr #24
/*將R2的高8位傳送到R3的低8位*/ stop:
b stop.end
2.分析調試:
①download下載:
②保留r2的高8位,屏蔽低24位:
③保留r3的高24位,屏蔽低8位:
④將R2的高8位傳送到R3的低8位:
實驗三:(例7)編寫一段程序計算10!
1.程序代碼如下:
.global _start.text.equ num,10 _start: mov r0,#num mov r1,r0 s1: subs r1,r1,#1
/*把r1-1放入r1*/ mul r0,r1,r0
/*r0*r1放入r0*/ cmp r1,#1
/*比較R1與1的大小*/ beq stop
bne s1 stop: b stop.end
2.分析調試:
① download下載:
② 第一次執行S1,r1=10-1=9,10*9=90,換成16進制是5a。
③ 第二次執行S1,r1=9-1=8,10*9*8=720,換成16進制是2d0。
④ 依次執行S1,到r1=1,停止,10*9*8??*1=3628800,換成16進制是375f00。
實驗四:(例8)串拷貝(R1指向源數據串首地址,R0指向目的數據串的首地址)。1.程序代碼如下:.global _start.text.EQU NUM,8 _start:
LDR R0,=srcstr
/*指向源數據串R0*/
LDR R1,=dststr
/*指向目標數據串R1*/
mov R3,#NUM
/*R3=8*/
mov LR,PC
/*返回*/
B strcopy
/*調用串拷貝子程序*/ stop: b stop
strcopy:
LDRB R2,[R0],#1
/*裝載字節同時更新地址*/
STRB R2,[R1],#1
/*存儲字節同時更新地址*/
SUBS R3,R3,#1
CMP R3,#0
/*判斷是否結束*/
BNE strcopy
/*不是,則繼續*/
MOV PC,LR
/*返回*/.data
srcstr:.long 1,2,3,4,5,6,7,0
/*定義源數據串*/
dststr:.long 5,3,2,1,4,6,8,0
/*定義目的字符串*/
2.分析調試:
①單步跟蹤后的結果及存儲器的結果顯示:
②寄存器的結果顯示:
六、實驗心得
今天在實驗室里,學習使用Embest IDE開發環境及ARM 軟件模擬器,掌握簡單ARM 匯編指令,進一步加強了對嵌入式的熟悉和了解。鄭老師在兢兢業業的向我們傳授實踐知識的同時也向我們提問相關理論問題,讓我們在學習的過程加深對實踐和理論兩者之間的聯系,知道每一個步驟的發生的原因及產生相應的結果,即對實驗的來龍去脈有了更清楚的認識,為今后的學習打下了一定的基礎。相信在接下來的實驗中,我們會在鄭老師的引導下,做起實驗來更能得心應手,輕車熟駕!
第五篇:嵌入式系統ARM實驗報告
南京郵電大學通信與信息工程學院
實驗報告
實驗名稱:實驗一基于ADS開發環境的設計
實驗二嵌入式Linux交叉開發環境的建立 實驗三嵌入式Linux環境下的程序設計
課程名稱嵌入式系統B
班級學號B13010711 姓名馬俊民
開課時間 2015/2016學年第1學期
實驗一基于ADS開發環境的程序設計
一、實驗目的
1、學習ADS開發環境的使用;
2、學習和掌握ADS環境下的匯編語言及C語言程序設計;
3、學習和掌握匯編語言及C語言的混合編程方法。
二、實驗內容
1、編寫和調試匯編語言程序;
2、編寫和調試C語言程序;
3、編寫和調試匯編語言及C語言的混合程序;
4、編寫程序測試多寄存器傳送指令的用法。
三、實驗原理
ADS全稱為ARM Developer Suite,是ARM公司推出的新一代ARM集成開發工具。現在常用的ADS版本是ADS1.2,它取代了早期的ADS1.1和ADS1.0。
ADS用于無操作系統的ARM系統開發,是對裸機(可理解成一個高級單片機)的開發。ADS具有極佳的測試環境和良好的偵錯功能,它可使硬件開發工作者更深入地從底層去理解ARM處理器的工作原理和操作方法,為日后自行設計打基礎,為BootLoader的編寫和調試打基礎。
1.ADS軟件的組成
ADS由命令行開發工具、ARM運行時庫、GUI開發環境(CodeWarrior和AXD)、實用程序、支持軟件等組成。
2.GUI開發環境
ADS GUI開發環境包含CodeWarrior和AXD兩種,其中Code Warrior是集成開發工具,而AXD是調試工具。
使用匯編語言進行編程簡單、方便,適用于初始化硬件代碼、啟動代碼等。匯編語言具有一些相同的基本特征:
1.一條指令一行。
2.使用標號(label)給內存單元提供名稱,從第一列開始書寫。3.指令必須從第二列或能區分標號的地方開始書寫。4.注釋必須跟在指定的注釋字符后面,一直書寫到行尾。
在ARM匯編程序中,每個段必須以AREA作為段的開始,以碰到下一個AREA作為該段的結束,段名必須唯一。程序的開始和結束需以ENTRY和END來標識。嵌入式C語言設計是利用基本的C語言知識,面向嵌入式工程實際應用進行程序設計。為了使單獨編譯的C語言程序和匯編程序之間能夠相互調用,必須為子程序之間的調用規定一定的規則。ATPCS就是ARM程序和Thumb程序中子程序調用的基本規則。
四、實驗過程與關鍵代碼分析
1.創建項目工程
在File菜單中選擇New命令,打開一個新建工程對話框。在Project選項卡下,選擇ARM Executable Image, 然后在Project name文本框里輸入項目名稱,點擊確定。彈出工程窗口。
選擇File菜單中的New命令,選擇File標簽頁,在File name文本框中輸入要創建的文件名。匯編程序以.s結尾,c程序以.c結尾。在Location文本框中指定文件的存放位置,選中Add to Project,在Targets中選中DebugRel,單擊確定關閉窗口。
2.用匯編語言設計程序實現10的階乘
AREA EXAMPLE, CODE, READONLY ENTRY start MOV R0, #10 MOV R1, #1 LOOP MUL R0, R0, R1 SUB R0, R0, 1 CMP R0, #1 BHI LOOP END 在這個程序中,我們首先對R0和R1賦值,將R0作為一個變量,而R1作為一個存貯階乘值的寄存器。在每進行一次乘法之后,將R0減1。同時在做完減法后進行判斷,如果此時R0大于1,則返回繼續乘法,否則結束程序,輸出結果。
3.用調用子程序的方法實現1!+2!+3!+?+10!,代碼如下: asmp.s
AREA JC, CODE, READONLY
EXPORT JCP
ENTRY JCP
ADD R3, R0, #1
MOV R2, #1
MOV R1, #1 LOOP MUL R0, R1, R2
MOV R1, R0
ADD R2, R2, #1
CMP R2, R3
BNE LOOP
NOP
NOP
MOV PC, LR
END
PROGC.c #include
int main(){ int res=0;int m=10;int i;for(i=1;i<=m;i++)
res=res+JCP(i);printf(“The result =%dn”,res);return 0;} 在這個程序中,主程序由c語言完成作求和,子程序由匯編語言寫成作階乘。
5.實現字符串的逆序復制TEXT1=“HELLO”=>TEXT2=“OLLEH”
AREA invstring, CODE, READONLY start
ADR R1,TEXT1
ADR R2,TEXT2
MOV R3, #0 LOOP
LDRB R0,[R1], #1
ADD R3,R3,#1
CMP R0,#0
BNE LOOP
SUB R1,R1,#2
LOOP1
LDRB R0,[R1], #-1
STRB R0,[R2], #1
SUB R3,R3, #1
CMP R3,#1
BNE LOOP1
MOV R5,#&55
TEXT1
TEXT2 NOP =“HELLO”,0 ALIGN =“OELLH” END
五、實驗小結
在這次實驗中,學會了如何使用匯編程序進行編程。對匯編程序編程一些基本的要求有了一定的了解,學習了C語言的語法和在其中調用匯編程序的方法。學會了利用CodeWarrior IDE開發C和ARM匯編代碼。學會了在AXD中進行代碼調試的方法和過程,對AXD的調試有初步的了解。,實驗二嵌入式Linux交叉開發環境的建立
一、實驗目的
1、掌握嵌入式Linux交叉開發環境的建立方法
2、學習和掌握Linux常用命令
3、學習和掌握vi編輯器的使用
二、實驗內容
1、搭建嵌入式Linux交叉開發環境
2、熟悉Linux的常用命令
3、熟悉vi編輯器的常用命令
三、實驗原理
Linux系統是UNIX系統的分支,是UNIX的微機版。Linux具有異常豐富的驅動程序資源,支持各種主流的硬件設備與技術。Linux包含了現代的UNIX操作系統的所有功能特性,這些功能包括多任務、虛擬內存、虛擬文件系統、進程間通信、對稱所處理器、多用戶支持等。
Vi編輯器是所有UNIX和Linux下的標準編輯器。它包含3種工作模式。嵌入式系統是專用的計算機系統,它對系統的功能、可靠性、成本、體積、功耗等有嚴格的要求。大部分嵌入式系統沒有大容量存儲設備,一般不能安裝大型開發軟件,系統的開發需要采用交叉開發模式。
四、實驗過程與關鍵代碼分析
實驗用的是UP-NetARM2410-S試驗箱,里面配有三星的芯片S3c2410X。打開電腦上VMWare軟件,在Windows系統下啟動虛擬機里的Linux系統。接著需要
1.宿主機的環境搭建
下載并運行VMWare,根據向導創建一臺新虛擬機并選擇Linux作為客戶操作系統,再根據向導安裝RedHat Linux 9.0。
2.虛擬機中啟動Linux操作系統
使用root登陸,用戶名為root,密碼為123456。之后對共享文件設置進行調整:打開settings界面,打開shared folders功能,同時將路徑設置到有課前下載的軟件的目錄下。
3.開發工具軟件的安裝(1)安裝gcc 打開Linux后,打開終端窗口,在共享的目錄下找到install.sh并運行,命令如下: ls./ install.sh 安裝程序將自動建立/arm2410s目錄,并將所有的開發軟件包安裝到/arm2410s 目錄下,同時自動配置編譯環境,建立合適的符號鏈接。安裝完成后在目錄/opt/host/armv4l/bin/下應該能看到主編譯器。(2)配置PATH路徑
vi.bash.profile 將里面PATH變量改為PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;存盤后執行
source.bash_profile 以后armv4l-unknown-linux-gcc將被自動搜索到
4.宿主機上的開發環境配置(1)配置IP地址
ifconfig eth0 192.168.0.121 命令配置了宿主機的IP地址。然后打開網絡配置窗口,重新探測MAC地址。重新激活。(2)關閉防火墻
單擊“Red”菜單→“系統設置”→“安全級別”→打開“安全級別配置”窗口,選擇“無防火墻選項。”(3)配置NFS。
單擊“Red”菜單→“系統設置”→“服務器設置”→“服務”,在“服務配置”窗口中勾選nfs,單擊“開始”(4)NFS設置
單擊“Red”菜單→“系統設置”→“服務器設置”→“NFS服務器”,打開“NFS服務器配置”窗口,設置NFS共享。
然后在NFS服務器中增加主機IP地址的鏈接許可和目錄。完成配置。
5.目標機的信息輸出
Windows系統下,“開始”→“所有程序”→“附件”→“通訊”→“超級終端”,新建一個通信終端。區號、電話號碼隨意輸入。設置每秒位數為“115200”,數據位為“8”,無奇偶校驗,停止位為“1”,無數據流控制。單擊“確定”。
6.程序的運行
打開超級終端,啟動Linux,屏幕顯示:
[/mnt/yaffs] 在超級終端上執行掛載命令:
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 掛載成功后可執行程序。
五、實驗小結
在這次實驗中,學會建立Linux交叉開發環境,學會了ls和vi,cd等常用的Linux命令,并掌握了Vi編輯器的使用方法。同時知道了如何在搭建失敗時尋找錯誤進行排錯。
實驗三嵌入式Linux環境下的程序設計
一、實驗目的
1、掌握嵌入式Linux環境下的程序設計方法
2、學會編寫Makefile文件
二、實驗內容
1、熟悉嵌入式教學實驗箱的使用
2、編寫C程序和Makefile文件
3、編譯程序產生可執行程序
4、完成主機的掛載和程序的執行
三、實驗原理
在嵌入式Linux環境下的程序設計方法有一下幾個步驟:
1.編寫源程序
2.編寫Makefile文件 3.編譯程序
4.運行和調試程序
5.將生產的可執行文件加入文件系統。
前三個步驟在宿主機上完成,后面的步驟在目標機上完成。
四、實驗過程與關鍵代碼分析
1.建立工作目錄
mkdir hello cd hello
2.編寫源程序
用vi編輯器編輯Hello.c文件
vi Hello.c 在Vi中輸入源程序如下:
#include
printf(“hello world n”);}
3.編寫Makefile文件
vi Makefile 在vi中編輯Makefile文件如下:
CC= armv4l-unknown-linux-gcc EXEC = hello OBJS = hello.o CFLAGS += LDFLAGS+=-static all: $(EXEC)$(EXEC):(OBJS)$(CC)$(LDFLAGS)–o $@ $(OBJS)clean:
-rm –f $(EXEC)*.elf *.gdb *.o
4.編譯程序
在hello目錄下運行“make”來編譯程序。
make clean
make 編譯成功后,生成可執行文件Hello.o。
5.下載調試
在宿主機上啟動nfs服務,并將/arms2410s設置為共享目錄。接下來啟動超級終端,建立通訊,掛載。
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 掛載成功后,進入/mnt/nfs,再進入/mnt/nfs/hello,直接運行剛剛編譯生成的可執行文件Hello.o,查看運行結果
cd hello./hello 可以看見“Hello world”
只需要掛載一次便可,只要實驗箱沒有重啟,就可以一直保持連接。反復修改、編譯、調試,直至程序調試通過。
6.可執行文件加入文件系統
程序調試通過后,可以把可執行文件拖放到usr/bin目錄下,然后使用mkcramfs制作工具生成新的文件系統。當系統啟動后,就可以在相應目錄下執行可執行程序hello.五、實驗小結 在這次實驗中,學會了在嵌入式Linux環境下設計程序。同時知道了如何對目標機進行掛載。以及如何在發現掛載不成功尋找錯誤進行修改。另外在編譯文件時需要注意的也都有所了解。
實驗四多線程程序設計
一、實驗目的1、2、二、實驗內容1、2、3、4、三、實驗原理
四、實驗過程與關鍵代碼分析
五、實驗小結
3+