GNU工具開發基於ARM嵌入式系統的方法

2021-06-16 04:54:38 字數 3575 閱讀 6003

當 前,arm公司的32位risc處理器,以其核心耗電少、成本低、功能強、特有16/32位雙指令集,已成為移動通訊、手持計算、多**數字消費等嵌入式 解決方案的risc標準,市場占有率超過了75 %。多家公司都推出了自己的基於arm核心的處理器產品,越來越多的開發人員開始了針對arm平台的開發。通常開發人員需要購買晶元廠商或第三方提供的開 發板,還需要購買開發軟體,如c編譯器或者整合了實時作業系統的開發環境。開發板的**從數百到上千美元,而編譯器、實時作業系統**更是動輒數千到數萬 美元。這樣,在開發初期,軟硬體上的投資就需要上萬美元,對於國內大多數開發人員來說,無疑是太貴了。 bdmlinux聯盟

慶 幸的是,gnu所倡導的自由軟體給開發者帶來了福音。1984 年,旨在開發乙個類似 unix 的,並且是完全免費的完整作業系統和配套工具:gnu 系統(發音為"guh-new")。gnu的作業系統和開發工具都是免費的,遵循gnu 通用公共許可證 (gpl)協議,任何人都可以從網上獲取全部的源**。關於gnu和公共許可證協議的詳細資料,讀者可參看gnu**的中文介 紹: bdmlinux聯盟

除 了大家熟知的linux作業系統外,gnu的軟體還包括編譯器(gcc,g++)、二進位制轉換工具(objdump,objcopy)、除錯工具 (gdb,gdbserver,kgdb)和基於不同硬體平台的開發庫。gnu開發工具的主要缺點是採用命令列方式,使用者掌握和使用比較困難,不如基於 windows系統的開發工具好用。但是,gnu工具的複雜性是由於它更貼近編譯器和作業系統的底層,並提供了更大的靈活性。一旦學習和掌握了相關工具, 也就了解了系統設計的基礎知識,為今後的開發工作打下基礎。gnu的開發工具都是免費的,遵循gpl協議,任何人都可以從網上獲取。筆者參與了乙個基於 arm平台的嵌入式linux系統開發,採用的是摩托羅拉龍珠系列的mc928mx1。從測試**、引導程式、嵌入式linux移植、應用程式、圖形介面 都可以用gnu工具進行開發,不需要在開發工具上做額外的投入。本文所介紹的開發方法同樣適用於其它公司的基於arm的產品。 bdmlinux聯盟

1 硬體平台 bdmlinux聯盟

圖1中sdram接片選端cs2,flash接片選端cs3,其餘為sdram/flash的控制訊號。最小系統還包括至少1個序列介面,可以採用mx1內建的uart控制器,圖略。 bdmlinux聯盟

2 自舉模式 bdmlinux聯盟

3 gnu的編譯器和開發工具 bdmlinux聯盟

(1)編寫c、c++語言或彙編源程式 bdmlinux聯盟

(2)用gcc或g++生成目標檔案 bdmlinux聯盟

如果應用程式包括多個檔案,就需要進行分別編譯,最後用聯結器連線起來。如筆者的引導程式包括3個檔案:init.s(彙編**、初始化硬體) xmrecever.c(通訊模組,採用xmode協議)和flash.c(flash擦寫模組)。 bdmlinux聯盟

分別用如下命令生成目標檔案: bdmlinux聯盟

arm-linux-gcc-c-o2-o init.o init.s bdmlinux聯盟

arm-linux-gcc-c-o2-o xmrecever.o xmrecever.c bdmlinux聯盟

arm-linux-gcc-c-o2-o flash.o flash.c bdmlinux聯盟

其中-c命令表示只生成目標**,不進行連線;-o 命令指明目標檔案的名稱;-o2表示採用二級優化,採用優化後可使生成的**更短,執行速度更快。如果專案包含很多檔案,則需要編寫makefile檔案。關於makefile的內容,請感興趣的讀者參考相關資料。 bdmlinux聯盟

(3)編寫連線指令碼檔案 bdmlinux聯盟

gcc 等編譯器內建有預設的連線指令碼。如果採用預設指令碼,則生成的目標**需要作業系統才能載入執行。為了能在嵌入式系統上直接執行,需要編寫自己的連線指令碼文 件。編寫連線指令碼,首先要對目標檔案的格式有一定了解。gnu編譯器生成的目標檔案預設為elf格式。elf檔案由若干段(section)組成,如不特 殊指明,由c源程式生成的目標**中包含如下段:.text(正文段)包含程式的指令**;.data(資料段)包含固定的資料,如常量、字元 串;.bss(未初始化資料段)包含未初始化的變數、陣列等。c++源程式生成的目標**中還包括.fini(析構函式**)和.init(建構函式代 碼)等。有關elf檔案格式,讀者可自行參考相關資料。聯結器的任務就是將多個目標檔案的.text、.data和.bss等段連線在一起,而連線指令碼文 件是告訴聯結器從什麼位址開始放置這些段。例如筆者的引導程式連線檔案link.lds為: bdmlinux聯盟

entry(begin) 

section

.data:

.bss:

}

其 中,entry(begin)指明程式的入口點為begin標號;.=0x00300000指明目標**的起始位址為0x00300000,這一段位址為 mx1的片內ram;.text : 表示從0x00300000開始放置所有目標檔案的**段,隨後的.data: 表示資料段從**段的末尾開始,再後是.bss段。 bdmlinux聯盟

(4)用聯結器生成最終目標檔案 bdmlinux聯盟

arm-linux-ld-nostadlib-o bootstrap.elf-t link.lds init.o xmrecever.o flash.o bdmlinux聯盟

其中,ostadlib表示不連線系統的執行庫,而是直接從begin入口;-o指明目標檔案的名稱;-t指明採用的連線指令碼檔案;最後是需要連線的目標檔案列表。 bdmlinux聯盟

(5)生成二進位制** bdmlinux聯盟

arm-linux-objcopy-o binary bootstrap.elf bootstrap.bin bdmlinux聯盟

其中-obinary指定生成為二進位制格式檔案。objcopy還可以生成s格式的檔案,只需將引數換成-o srec。如果想將生成的目標**反彙編,還可以用objdump工具: bdmlinux聯盟

arm-linux-objdump-d bootstrap.elf bdmlinux聯盟

掌 握了gnu工具後,開發者就可以開發或移植c或c++**的程式。使用者可以不需要作業系統,直接開發簡單應用程式。但對於更複雜的應用來說,作業系統必不 可少。目前流行的源**公開的作業系統如linux、μc/os都可以用gnu工具編譯。arm的linux已有很多成熟的版本,可以支援arm720、 arm920、arm1020等多種處理器,讀者可從www.uclinux.org或www.armdevzone.com上獲取最新資訊。linux 移植過程中和處理器相關的**都放在arch/arm目錄下。對於核心,使用者需要做的是設定自己系統的記憶體映像,ram起始位址,i/o位址空間和虛擬i /o位址空間,參看arch/arm/mach-integrator/arch.c檔案。除了核心外,使用者還需要為自己的系統編制各種各樣的驅動程式。 bdmlinux聯盟

4 除錯工具 bdmlinux聯盟

對於linux核心的除錯,可以採用kgdb工具,同樣需要通過串列埠與上位機上的gdb通訊,對目標板的linux核心進行除錯。由於篇幅所限,感興趣的讀者可以從上了解具體的使用方法。 bdmlinux聯盟

結束語 bdmlinux聯盟

本文以乙個具體的例項為例,對gnu工具中的常用功能作了介紹。其實gnu工具的功能還遠不止這些,更進一步的操作有:針對不同處理器,不同演算法的軟體優化、高效的內嵌彙編、大型專案管理功能等。相信gnu能成為越來越多開發人員的選擇。

基於ARM的Qt Creator嵌入式開發環境搭建

平台 ubnutu10.04 交叉編譯器 arm linux gcc 3.4.1 在qtqt everywhere opensource src 4.8.1.tar 解壓為3 份,可分別命名為 qt x11 qt x86 qt armqt x11版本可以產生 qt開發工具 designer qt介面...

16 華清嵌入式 GNU工具

gnu工具 一 gnu工具分類 編譯工具 源程式編譯為乙個可執行程式 gcc 除錯工具 對執行程式進行原碼或者彙編除錯 gdb 軟體工程工具 協助多人開發或大型軟軟體專案管理 其他工具 鏈結器或者格式轉換器等。二.gcc 1.gcc 執行效率高,可編譯多種語言。2.gcc編譯器主要元件 分析器 c轉...

嵌入式arm開發學習

今天是學習arm的第二天.感覺又懂了一點.記錄下來,以便以後不時之需.今天先是看了一些linux應用開發的東西,由於之前自己對linux程式設計還算是有過了解,這部分看得很快,基本沒有什麼閱讀障礙.個人建議想學嵌入式linux的人,最好先把unix環境高階程式設計看一遍.你會發現一切都會順其自然.之...