大地资源网视频在线观看新浪,日本春药精油按摩系列,成人av骚妻潮喷,国产xxxx搡xxxxx搡麻豆

您現在的位置:智能制造網>技術中心>用GNU工具開發基于ARM的嵌入式系統

直播推薦

更多>

企業動態

更多>

推薦展會

更多>

用GNU工具開發基于ARM的嵌入式系統

2006年11月06日 09:25:21人氣:663來源:煙臺勾股通信技術有限公司

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

  慶幸的是,GNU所倡導的自由軟件給帶來了福音。1984 年,旨在開發一個類似 Unix 的,并且是*免費的完整操作系統和配套工具:GNU 系統(發音為"guh-NEW")。GNU的操作系統和開發工具都是免費的,遵循GNU 通用公共許可證 (GPL)協議,任何人都可以從網上獲取全部的源代碼。

  除了大家熟知的Linux操作系統外,GNU的軟件還包括編譯器(gcc,g++)、二進制轉換工具(objdump,objcopy)、調試工具(gdb,gdbserver,kgdb)和基于不同硬件平臺的開發庫。GNU開發工具的主要缺點是采用命令行方式,用戶掌握和使用比較困難,不如基于Windows系統的開發工具好用。但是,GNU工具的復雜性是由于它更貼近編譯器和操作系統的底層,并提供了更大的靈活性。一旦學習和掌握了相關工具,也就了解了系統設計的基礎知識,為今后的開發工作打下基礎。GNU的開發工具都是免費的,遵循GPL協議,任何人都可以從網上獲取。筆者參與了一個基于ARM平臺的嵌入式Linux系統開發,采用的是摩托羅拉龍珠系列的MC928MX1。從測試代碼、引導程序、嵌入式Linux移植、應用程序、圖形界面都可以用GNU工具進行開發,不需要在開發工具上做額外的投入。本文所介紹的開發方法同樣適用于其它公司的基于ARM的產品。

1 硬件平臺

  MC928MX1(以下簡稱MX1)是摩托羅拉公司基于ARM核心的*款MCU,主要面向嵌入式應用。內部采用ARM920T內核,并集成了SDRAM/Flash、LCD、USB、藍牙(bluetooth)、多媒體閃存卡(MMC)、CMOS攝像頭等控制器。作為應用開發的zui小系統必須包括RAM(程序運行空間)、Flash(存放目標代碼)和串行接口(用于調試和下載程序)。MX1提供了6個片選端(CS0~CS5),內置了SDRAM控制器,數據寬度32位。在筆者的系統中采用了2片8M×16位的SDRAM和2片4M×16位的同步Flash存儲器,分別接入數據線的低16位和高16位,如圖1所示。

  圖1中SDRAM接片選端CS2,Flash接片選端CS3,其余為SDRAM/Flash的控制信號。zui小系統還包括至少1個串行接口,可以采用MX1內置的UART控制器,圖略。


580)this.width=580" border=0>

圖 1 (小圖點擊放大)

2 自舉模式

  目前,許多嵌入式處理器都提供了自舉模式(Bootstrap),供用戶寫入引導代碼。自舉模式利用了固化在芯片內部的一段引導程序,當處理器復位時,如果在特定引腳上加信號,則處理器將在復位后執行固化ROM中的程序。例如,MX1提供了4條復位引腳,復位時引腳不同的電平組合可以從不同的片選端啟動系統。自舉ROM中的程序完成串口的初始化,然后等待用戶從串口寫入用戶代碼。自舉模式所能接受的是一種專門格式的文本文件,包括數據和要寫入/讀出的地址。關于自舉模式的代碼格式,可參考相關芯片的手冊。在摩托羅拉的還提供了許多小工具,幫助將其它格式的文件轉換成為自舉模式格式。通過自舉模式下載的通常是一段和上位機軟件(如超級終端)通信的程序,完成接收數據并寫入Flash的操作。寫入的數據可以是用戶自己的應用程序、數據或者操作系統的內核。通過自舉模式下載的引導程序同樣可以用GNU工具開發。

3 GNU的編譯器和開發工具

  GNU提供的編譯工具包括匯編器as、C編譯器gcc、C++編譯器g++、連接器ld和二進制轉換工具objcopy。基于ARM平臺的工具分別為arm-linux-as、arm-linux-gcc、arm-linux-g++、arm -linux-ld 和arm-linux-objcopy。GNU的所有開發工具都可以上下載,基于ARM的工具可以獲得。GNU的編譯器功能非常強大,共有上百個操作選項,這也是這類工具讓初學者頭痛的原因。不過,實際開發中只需要用到有限的幾個,大部分可以采用缺省選項。GNU工具的開發流程如下:編寫C、C++語言或匯編源程序,用gcc或g++生成目標文件,編寫連接腳本文件,用連接器生成zui終目標文件(elf格式),用二進制轉換工具生成可下載的二進制代碼。GNU工具都運行在Linux下,需要1臺運行Linux的PC作為上位機。由于篇幅所限,不能完整地介紹整個嵌入式操作系統的開發過程,將以第二節中提到的通過自舉模式下載的引導程序為例,說明開發的過程。對于像Linux這樣的大系統,基本的開發流程是一樣的。

  引導程序將通過自舉模式下載到MX1的片內RAM,從地址0x00300000開始并執行。完成串口和SDRAM的初始化后,引導程序將等待接收應用程序或操作系統內核,將接收到的數據放在SDRAM中。數據接收完畢后,引導程序將SDRAM中的數據寫入Flash,下一次就可以從Flash中直接引導系統了。由于操作系統的內核比較大,如Linux有1 MB以上,下載過程必須考慮糾錯。因此,接收部分采用Xmode協議,可以用Windows下超級終端的Xmode發送方式發送文件。

(1)編寫C、C++語言或匯編源程序

  通常匯編源程序用于系統zui基本的初始化,如初始化堆棧指針、設置頁表、操作ARM的協處理器等。初始化完成后就可以跳轉到C代碼執行。需要注意的是,GNU的匯編器遵循AT&T的匯編語法,讀者可以從GNU的站點上下載有關規范。匯編程序的缺省入口是start標號,用戶也可以在連接腳本文件中用ENTRY標志指明其它入口點(見下文關于連接腳本的說明)。

(2)用gcc或g++生成目標文件

  如果應用程序包括多個文件,就需要進行分別編譯,zui后用連接器連接起來。如筆者的引導程序包括3個文件:init.s(匯編代碼、初始化硬件) xmrecever.c(通信模塊,采用Xmode協議)和flash.c(Flash擦寫模塊)。
分別用如下命令生成目標文件:
arm-linux-gcc-c-O2-o init.o init.s
arm-linux-gcc-c-O2-o xmrecever.o xmrecever.c
arm-linux-gcc-c-O2-o flash.o flash.c
其中-c命令表示只生成目標代碼,不進行連接;-o 命令指明目標文件的名稱;-O2表示采用二級優化,采用優化后可使生成的代碼更短,運行速度更快。如果項目包含很多文件,則需要編寫makefile文件。關于makefile的內容,請感興趣的讀者參考相關資料。

(3)編寫連接腳本文件

  gcc等編譯器內置有缺省的連接腳本。如果采用缺省腳本,則生成的目標代碼需要操作系統才能加載運行。為了能在嵌入式系統上直接運行,需要編寫自己的連接腳本文件。編寫連接腳本,首先要對目標文件的格式有一定了解。GNU編譯器生成的目標文件缺省為elf格式。elf文件由若干段(section)組成,如不特殊指明,由C源程序生成的目標代碼中包含如下段:.text(正文段)包含程序的指令代碼;.data(數據段)包含固定的數據,如常量、字符串;.bss(未初始化數據段)包含未初始化的變量、數組等。C++源程序生成的目標代碼中還包括.fini(析構函數代碼)和.init(構造函數代碼)等。有關elf文件格式,讀者可自行參考相關資料。連接器的任務就是將多個目標文件的.text、.data和.bss等段連接在一起,而連接腳本文件是告訴連接器從什么地址開始放置這些段。例如筆者的引導程序連接文件link.lds為:

ENTRY(begin)
SECTION
{ .=0x00300000;
.text : { *(.text) }
.data: { *(.data) }
.bss: { *(.bss) }
}

  其中,ENTRY(begin)指明程序的入口點為begin標號;.=0x00300000指明目標代碼的起始地址為0x00300000,這一段地址為MX1的片內RAM;.text : { *(.text) }表示從0x00300000開始放置所有目標文件的代碼段,隨后的.data: { *(.data) }表示數據段從代碼段的末尾開始,再后是.bss段。

(4)用連接器生成zui終目標文件

  有了連接腳本文件,如下命令可生成zui終的目標文件:
arm-linux-ld-nostadlib-o bootstrap.elf-T link.lds init.o xmrecever.o flash.o
其中,ostadlib表示不連接系統的運行庫,而是直接從begin入口;-o指明目標文件的名稱;-T指明采用的連接腳本文件;zui后是需要連接的目標文件列表。

(5)生成二進制代碼

  連接生成的elf文件還不能直接下載執行,通過objcopy工具可生成zui終的二進制文件:
arm-linux-objcopy-O binary bootstrap.elf bootstrap.bin
其中-Obinary生成為二進制格式文件。Objcopy還可以生成S格式的文件,只需將參數換成-O srec。如果想將生成的目標代碼反匯編,還可以用objdump工具:
arm-linux-objdump-D bootstrap.elf

  至此,所生成的目標文件就可以直接寫入Flash中運行了。如果要通過自舉模式下載,還需要轉換為自舉模式的文件格式,相關轉換工具可以在摩托羅拉的上找到。

  掌握了GNU工具后,就可以開發或移植C或C++代碼的程序。用戶可以不需要操作系統,直接開發簡單應用程序。但對于更復雜的應用來說,操作系統*。目前流行的源代碼公開的操作系統如Linux、μC/OS都可以用GNU工具編譯。ARM的Linux已有很多成熟的版本,可以支持ARM720、ARM920、ARM1020等多種處理器。Linux移植過程中和處理器相關的代碼都放在arch/arm目錄下。對于內核,用戶需要做的是設定自己系統的內存映像,RAM起始地址,I/O地址空間和虛擬I/O地址空間,參看arch/arm/mach-integrator/arch.c文件。除了內核外,用戶還需要為自己的系統編制各種各樣的驅動程序。

4 調試工具

  Linux下的GNU調試工具主要是gdb、gdbserver和kgdb。其中gdb和gdbserver可完成對目標板上Linux下應用程序的遠程調試。gdbserver是一個很小的應用程序,運行于目標板上,可監控被調試進程的運行,并通過串口與上位機上的gdb通信。可以通過上位機的gdb輸入命令,控制目標板上進程的運行,查看內存和寄存器的內容。gdb5.1.1以后的版本加入了對ARM處理器的支持,在初始化時加入-target==arm參數可直接生成基于ARM平臺的gdbserver。  對于Linux內核的調試,可以采用kgdb工具,同樣需要通過串口與上位機上的gdb通信,對目標板的Linux內核進行調試.

結束語

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

全年征稿/資訊合作 聯系郵箱:1271141964@qq.com

免責聲明

  • 凡本網注明"來源:智能制造網"的所有作品,版權均屬于智能制造網,轉載請必須注明智能制造網,http://www.xashilian.com。違反者本網將追究相關法律責任。
  • 企業發布的公司新聞、技術文章、資料下載等內容,如涉及侵權、違規遭投訴的,一律由發布企業自行承擔責任,本網有權刪除內容并追溯責任。
  • 本網轉載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網贊同其觀點或證實其內容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網站或個人從本網轉載時,必須保留本網注明的作品來源,并自負版權等法律責任。
  • 如涉及作品內容、版權等問題,請在作品發表之日起一周內與本網聯系,否則視為放棄相關權利。

<
更多 >

工控網機器人儀器儀表物聯網3D打印工業軟件金屬加工機械包裝機械印刷機械農業機械食品加工設備制藥設備倉儲物流環保設備造紙機械工程機械紡織機械化工設備電子加工設備水泥設備海洋水利裝備礦冶設備新能源設備服裝機械印染機械制鞋機械玻璃機械陶瓷設備橡塑設備船舶設備電子元器件電氣設備


我要投稿
  • 投稿請發送郵件至:(郵件標題請備注“投稿”)1271141964.qq.com
  • 聯系電話0571-89719789
工業4.0時代智能制造領域“互聯網+”服務平臺
智能制造網APP

功能豐富 實時交流

智能制造網小程序

訂閱獲取更多服務

微信公眾號

關注我們

抖音

智能制造網

抖音號:gkzhan

打開抖音 搜索頁掃一掃

視頻號

智能制造網

公眾號:智能制造網

打開微信掃碼關注視頻號

快手

智能制造網

快手ID:gkzhan2006

打開快手 掃一掃關注
意見反饋
關閉
企業未開通此功能
詳詢客服 : 0571-87858618
主站蜘蛛池模板: 湖北省| 化德县| 江都市| 县级市| 肃北| 天水市| 望城县| 和龙市| 瓮安县| 仁布县| 太康县| 崇文区| 桦川县| 漳州市| 全南县| 上饶市| 汝南县| 汝阳县| 凤凰县| 英山县| 丁青县| 静宁县| 依安县| 斗六市| 南江县| 沈阳市| 长治市| 凉山| 昌乐县| 墨江| 叶城县| 德阳市| 章丘市| 双柏县| 平湖市| 丽江市| 诏安县| 青龙| 额济纳旗| 岚皋县| 桦川县|