


版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、ARMADS集成開發環境的使用在這一章里,將介紹ARM開發軟件ADS(ARMDeveloperSuite)。通過學習如何在CodeWarriorIDE集成開發環境下編寫,編譯一個工程的例子,使讀者能夠掌握在ADS軟件平臺下開發用戶應用程序。本章還描述了如何使用AXD調試工程,使讀者對于調試工程有個初步的理解,為進一步的使用和掌握調試工具起到拋磚引玉的作用。本章主要內容有:ADS軟件組成介紹-使用ADS創建工程-用AXD進行代碼調試ADS集成開發環境組成介紹ARMADS全稱為ARMDeveloperSuite。是ARM公司推出的新一代ARM集成開發工具。現在ADS的最新版本是1.2,它取代了早期
2、的ADS1.1和ADS1.0。它除了可以安裝在WindowsNT4,Windows2000,Windows98和Windows95操作系統下,還支持WindowsXP和WindowsMe操作系統。ADS由命令行開發工具,ARM時實庫,GUI開發環境(CodeWarrior和AXD),實用程序和支持軟件組成。有了這些部件,用戶就可以為ARM系列的RISC處理器編寫和調試自己的開發應用程序了。下面就詳細介紹一下ADS的各個組成部分。8.1.1命令行開發工具這些工具完成將源代碼編譯,鏈接成可執行代碼的功能。ADS提供下面的命令行開發工具:armccarmcc是ARMC編譯器。這個編譯器通過了Plum
3、HallCValidationSuite為ANSIC的一致性測試。armcc用于將用ANSIC編寫的程序編譯成32位ARM指令代碼。因為armcc是我們最常用的編譯器,所以對此作一個詳細的介紹。在命令控制臺環境下,輸入命令:armcc-help可以查看armcc的語法格式以及最常用的一些操作選項armcc最基本的用法為:armccoptionsfile1file2.filen這里的option是編譯器所需要的選項,fiel1,file2-fileS相關的文件名。這里簡單介紹一些最常用的操作選項。-c:表示只進行編譯不鏈接文件;-C:(注意:這是大寫的C)禁止預編譯器將注釋行移走;-D<s
4、ymbol>:定義預處理宏,相當于在源程序開頭使用了宏定義語句#definesymbol,這里symbol默認為1;-E:僅僅是對C源代碼進行預處理就停止;-g<options>:指定是否在生成的目標文件中包含調試信息表;-I<directory>:將directory所指的路徑添加到#include的搜索路徑列表中去;-J<directory>:用directory所指的路徑代替默認的對#include的搜索路徑;-o<file>:指定編譯器最終生成的輸出文件名。-O0:不優化;-O1:這是控制代碼優化的編譯選項,大寫字母O后面跟的數字不
5、同,表示的優化級別就不同,-O1關閉了影響調試結果的優化功能;-O2:該優化級別提供了最大的優化功能;-S:對源程序進行預處理和編譯,自動生成匯編文件而不是目標文件;-U<symbol>:取消預處理宏名,相當于在源文件開頭,使用語句#undefsymbol;-W<options>:關閉所有的或被選擇的警告信息;有關更詳細的選項說明,讀者可查看ADS軟件的在線幫助文件。armcpparmcpp是ARMC+編譯器。它將ISOC+或EC+編譯成32位ARM指令代碼。tcctcc是ThumbC編譯器。該編譯器通過了PlumHallCValidationSuite為ANSI一致性
6、的測試。tcc將ANSIC源代碼編譯成16位的Thumb指令代碼。tcpptcpp是ThumbC+編譯器。它將ISOC+和EC+源碼編譯成16位Thumb指令代碼。armasmarmasm是ARM和Thumb的匯編器.它對用ARM匯編語言和Thumb匯編語言寫的源代碼進行匯編。armlinkarmlink是ARM連接器。該命令既可以將編譯得到的一個或多個目標文件和相關的一個或多個庫文件進行鏈接,生成一個可執行文件,也可以將多個目標文件部分鏈接成一個目標文件,以供進一步的鏈接。ARM鏈接器生成的是ELF格式的可執行映像文件。armsdarmsd是ARM和Thumb的符號調試器。它能夠進行源碼級的
7、程序調試。用戶可以在用C或匯編語言寫的代碼中進行單步調試,設置斷點,查看變量值和內存單元的內容。armcc用法詳解下面為讀者介紹上述的4種ARMC和C+編譯器的命令通用語法。compilerPCS-optionssource-languagesearch-pathspreprocessor-optionsoutput-formattarget-optionsdebug-optionscode-generation-optionswarning-optionsadditional-checkserror-optionssource用戶可以通過命令行操作選項控制編譯器的執行。所有的選項都是以符號”
8、-”開始,有些選項后面還跟有參數。在大多數情況下,ARMC和C+編譯器允許在選項和參數之間存在空格。命令行中各個選項出現順序可以任意。這里的compiler是指armcc,tcc,armcpp和tcpp中的一個;PCS-options:指定了要使用的過程調用標準;source-language:指定了編譯器可以接受的編寫源程序的語言種類。對于C編譯器默認的語言是ANSIC,對于C+編譯器默認是ISO標準C+;search-paths:該選項指定了對包含的文件(包括源文件和頭文件)的搜索路徑;preprocessor-options:該選項指定了預處理器的行為,其中包括預處理器的輸出和宏定義等特
9、性;output-format:該選項指定了編譯器的輸出格式,可以使用該項生成匯編語言輸出列表文件和目標文件;target-options:該選項指定目標處理器或ARM體系結構;debug-options:該選項指定調試信息表是否生成,和該調試信息表生成時的格式;code-generation-options:該選項指定了例如優化,字節順序和由編譯器產生的數據對齊格式等選項;warning-options:該選項決定警告信息是否產生;additional-checks:該選項指定了幾個能用于源碼的附加檢查,例如檢查數據流異常,檢查沒有使用的聲明等;error-options:該選項可以關閉指定
10、的可恢復的錯誤,或者將一些指定的錯誤降級為警告;source:該選項提供了包含有C或C+源代碼的一個或多個文件名,默認的,編譯器在當前路徑尋找源文件和創建輸出文件。如果源文件是用匯編語言編寫的(也就是說該文件的文件名是以.s作為擴展名),匯編器將被調用來處理這些源文件。如果操作系統對命令行的長度有限制,可以使用下面的操作,從文件中讀取另外的命令行選項:-viafilename該命令打開文件名為filename的文件,并從中讀取命令行選項。用戶可以對-via進行嵌套調用,亦即,在文件filename中又通過-viafinlename2包含了另外一個文件。在下面的例子中,從input.txt文件中
11、讀取指定的選項,作為armcpp的操作選項:armcpp-viainput.txtsource.c以上是對編譯器選項的一個簡單概述。它們(包括后面還要介紹的其他一些命令工具)既可以在命令控制臺環境下使用,同時由于它們被嵌入到了ADS的圖形界面中,所以也可以在圖形界面下使用。armlink用法詳解在介紹armlink的使用方法之前,先介紹要涉及到的一些術語。映像文件(image):是指一個可執行文件,在執行的時候被加載到處理器中。一個映像文件有多個線程。它是ELF(Executableandlinkingformat)格式的。段(Section):描述映像文件的代碼或數據塊。RO:是Read-o
12、nly的簡寫形式。RW:是Read-write.的簡寫形式。ZI:是Zero-initialized的簡寫形式。輸入段(inputsection):它包含著代碼,初始化數據或描述了在應用程序運行之前必須要初始化為0的一段內存。輸出段(outputsection):它包含了一系列具有相同的RO,RW或ZI屬性的輸入段。域(Regions):在一個映像文件中,一個域包含了1至3個輸出段。多個域組織在一起,就構成了最終的映像文件。ReadOnlyPositionIndependent(ROPI):它是指一個段,在這個段中代碼和只讀數據的地址在運行時候可以改變。ReadWritePositionInd
13、ependent(RWPI):它是指一個段,在該段中的可讀/寫的數據地址在運行期間可以改變。加載時地址:是指映像文件位于存儲器(在該映像文件沒有運行時)中的地址。運行時地址:是指映像文件在運行時的地址。下面介紹一下armlink命令的語法完整的連接器命令語法如下:armlink-help-vsn-partial-outputfile-elf-reloc-ro-baseaddress-ropi-rw-baseaddress-rwpi-split-scatterfile-debug|-nodebug-remove?RO/RW/ZI/DBG|-noremove-entrylocation-keeps
14、ection-id-firstsection-id-lastsection-id-libpathpathlist-scanlib|-noscanlib-locals|-nolocals-callgraph-infotopics-map-symbols-symdefsfile-editfile-xref-xreffromobject(section)-xreftoobject(section)-errorsfile-listfile-verbose-unmangled|-mangled-matchcrossmangled-viafile-strict-unresolvedsymbol-MI|-L
15、I|-BIinput-file-list上面各選項的含義分別為:-help這個選項會列出在命令行中常用的一些選項操作。-vsn這個選項顯示出所用的armlink的版本信息。-partial用這個選項創建的是部分鏈接的目標文件而不是可執行映像文件。-outputfile這個選項指定了輸出文件名,該文件可能是部分鏈接的目標文件,也可能是可執行映像文件。如果輸出文件名沒有特別指定的話,armlink將使用下面的默認:如果輸出是一個可執行映像文件,則生成的輸出文件名為_image.axf;如果輸出是一個部分鏈接的目標文件,在生成的文件名為_object.o;如果沒有指定輸出文件的路徑信息,則輸出文件就
16、在當前目錄下生成。如果指定了路徑信息,則所指定的路徑成為輸出文件的當前路徑。-elf這個選項生成ELF格式的映像文件,這也是armlink所支持的唯一的一種輸出格式,這是默認選項。-reloc這個選項生成可重定址的映像。一個可重定址的映像具有動態的段,這個段中包含可重定址信息,利用這些信息可以在鏈接后,進行映像文件的重新定址;-reloc,-rw-base一起使用,但是如果沒有-split選項,鏈接時會產生錯誤。-ro-baseaddress這個選項將包含有RO(Read-Only屬性)輸出段的加載地址和運行地址設置為address,該地址必須是字對齊的,如果沒有指定這個選項,則默認的RO基地
17、址值為0x8000。-ropi這個選項使得包含有RO輸出段的加載域和運行域是位置無關的。如果該選項沒有使用,則相應的域被標記為絕對的。通常每一個只讀屬性的輸入段必須是只讀位置無關的。如果使用了這個選項,armlink將會進行以下操作:檢查各段之間的重定址是否有效;確保任何由armlink自身生成的代碼是只讀位置無關的。這里希望讀者注意的是,ARM工具直到armlink完成了對輸入段的處理后,才能夠決定最終的生成映像是否為只讀位置無關的。這就意味著,即使為編譯器和匯編器指定了ROPI選項,armlink也可能會產生ROPI錯誤信息。-rw-baseaddress這個選項設置包含RW(Read/W
18、rite屬性)輸出段的域的運行時地址,該地址必須是字對齊的。如果這個選項和-split選項一起使用,將設置包含RW輸出段的域的加載和運行時地址都設置在address處。-rwpi這個選項使得包含有RW和ZI(ZeroInitialization,初始化為0)屬性的輸出段的加載和運行時域為位置無關的。如果該選項沒有使用,相應域標記為絕對的。這個選項要求-rw-base選項后有值,如果-rw-base沒有指定的話,默認其值為0,即相當于-rw-base0。通常每一個可寫的輸入段必須是可讀/可寫的位置無關的。如果使用了該選項,armlink會進行以下的操作:檢查可讀/可寫屬性的運行域的輸入段是否設置
19、了位置無關屬性;檢查在各段之間的重定址是否有效;生成基于靜態寄存器sb的條目,這些在RO和RW域被拷貝和初始化的時候會用到。編譯器并不會強制可寫的數據一定要為位置無關的,這就是說,即使在為編譯器和匯編器指定了RWPI選項,armlink也可能生成數據不是RWPI的信息。-split這個選項將包含RO和RW屬性的輸出段的加載域,分割成2個加載域。一個是包含RO輸出段的加載域,默認的加載地址為0x8000,但是可以用-ro-base選項設置其他的地址值,另一個加載域包含RO屬性的輸出段,由-rw-base選項指定加載地址,如果沒有使用-rw-base選項的話,默認使用的是-rw-base0。-sc
20、atterfile這個選項使用在file中包含的分組和定位信息來創建映像內存映射。注意,如果使用了該選項的話,必須要重新實現堆棧初始化函數user_initial_stackheap()。-debug這個選項使輸出文件包含調試信息,調試信息包括,調試輸入段,符號和字符串表。這是默認的選項。-nodebug這個選項使得在輸出文件中不包含調試信息。生成的映像文件短小,但是不能進行源碼級的調試。armlink對在輸入的目標文件和庫函數中發現的任何調試輸入段都不予處理,當加載映像文件到調試器中的時候,也不包含符號和字符串信息表。這個選項僅僅是對裝載到調試器的映像文件的大小有影響,但是對要下載到目標板上
21、的二進制代碼的大小沒有任何影響。則雖然在生成的目標文件中不如果用armlink進行部分鏈接生成目標文件而不是映像文件,含有調試輸入段,但是會包含符號和字符串信息表。這里特別請讀者注意的是:-nodebug選項,這是因為如果生成如果要在鏈接完成后使用fromELF工具的話,不可使用的映像文件中不包含調試信息的話,則有下面的影響:fromELF不能將映像文件轉換成其他格式的文件;fromELF不能生成有意義的反匯編列表。-remove(RO/RW/ZI/DBG)如果輸入段中含有映像文件入口使用這個選項會將在輸入段未使用的段從映像文件中刪除。點或者該輸入段被一個使用的段所引用,則這樣的輸入段會當作已
22、使用的段。在使用這個選項時候要注意,不要刪除異常處理函數。使用-keep選項來標識異常處理函數,或用ENTRY偽指令標明是入口點。為了更精確的控制刪除未使用的段,可以使用段屬性限制符。可以使用以下的段屬性限制符:RORO屬性的段;刪除所有未使用的RW刪除所有未使用的RW屬性的段;ZI刪除所有未使用的DBG刪除所有未使用的ZI屬性的段;這些限制符出現的順序是任意的,DEBUG屬性的段。但是它們必須要有”)”括住,多個限制符之間要用符號”/”?進行間隔。ADS軟件中默認選項是-remove(RO/RW/ZI/DBG)。如果沒有指定段屬性限制符,則所有未使用的段都會被刪除。因為-remove就等價于
23、-remove(RO/RW/ZI/DBG)選項。-noremove這個選項保留映像文件中所有未被使用的段。-entrylocation這個選項指定映像文件中唯一的初始化入口點。一個映像文件可以包含多個入口點,使用這個命令定義的初始化入口點是存放在可執行文件的頭部,以供加載程序加載時使用。當一個映像文件被裝載時,ARM調試器使用這個入口點地址來初始化PC指針。初始化入口點必須滿足下面的條件:映像文件的入口點必須位于運行域內;運行域必須是非覆蓋的,并且必須是固定域(就是說,加載域和運行域的地址相同)。在這里可以用以下的參數代替location參數:1. 入口點地址:這是一個數值,例如-entry0
24、x0;符號:該選項指定映像文件的入口點為該符號所代表的地址處,比如:-entryint_handler表示程序入口點在符號int_handler所在處。如果該符號有多處定義存在,armlink將產生出錯信息。offset+object(section):該選項指定在某個目標文件的段的內部的某個偏移量處為映像文件的入口地址,例如:-entry8+startup(startupseg)如果偏移量值為0,可以簡寫成object(section),如果輸入段只有一個,則可以簡化為object。-keepsection-id使用該選項,可以指定保留一個輸入段,這樣的話,即使該輸入段沒有在映像文件中使用,
25、也不會被刪除。參數section-id取下面一些格式:symbol該選項指定定義symbol的輸入段不會在刪除未使用的段時被刪除。如果映像文件中有多處symbol定義存在,則所有包含symbol定義的輸入段都不會被刪除。例如:-keepint_handler則所有定義int_handler的符號的段都會保留,而不被刪除。為了保留所有含有以_handler結尾的符號的段,可以使用如下的選項:-keep*_handlerobject(section)這個選項指定了在刪除未使用段時,保留目標文件中的section段。輸入段和目標名是不區分大小寫的,例如,為了在目標文件vectors.o中保留vect
26、段,使用:-keepvectors.o(vect)為了保留vectors.o中的所有以vec開頭的段名,可以使用選項:-keepvectors.o(vec*)object這個選項指定在刪除未使用段時,保留該目標文件唯一的輸入段。目標名是不區分大小寫的,如果使用這個選項的時候,目標文件中所含的輸入段不止一個的話,armlink會給出出錯信息。比如,為了保留每一個以dsp開頭的只含有唯一輸入段的目標文件,可以使用如下的選項:-keepdsp*.o-firstsection-id這個選項將被選擇的輸入段放在運行域的開始。段放置在映像文件的開始,可以用下面的參數代替symbol選擇定義symbol的段
27、。禁止指定在多處定義的的開始。object(section)從目標文件中選擇段放在映像文件的開始位置。如通過該選項,將包含復位和中斷向量地址的section-id:symbol,因為多個段不能同時放在映像文件在目標文件和括號之間不允許存在空格,例-firstinit.o(init)object選擇只有一個輸入段的目標文件。如果這個目標文件包含多個輸入段,armlink會產生錯誤信息。用這個選項的例子如下:-firstinit.o這里希望讀者注意的是:使用-first不能改變在域中按照RO段放在開始,接著放置RW段,最后放置ZI段的基本屬性排放順序。如果一個域含有RO段,則RW或ZI段就不能放在
28、映像文件的開頭。類似地,如果一個域有RO或RW段,則ZI段就不能放在文件開頭。兩個不同的段不能放在同一個運行時域的開頭,所以使用該選項的時候只允許將一個段放在映像文件的開頭。-lastsection-id這個選項將所選擇的輸入段放在運行域的最后。例如,用這個選項能夠強制性的將包含校驗和的輸入段放置在RW段的最后。使用下面的參數可以替換section-idosymbol選擇定義symbol的段放置在運行域的最后。不能指定一個有多處定義的symbol。使用該參數的例子如下:-lastchecksumobject(section)從目標文件中選擇section段。在目標文件和后面的括號間不能有空格,
29、用該參數的例子為:-lastchecksum.o(check)object選擇只有一個輸入段的目標,如果該目標文件中有多個輸入段,armlink會給出出錯信息。和-first選項一樣,需要讀者注意的是;使用-last選項不能改變在域中將RO段放在開始,接著放置RW段,最后放置ZI段的輸出段基本的排放順序。如果一個域含有ZI段,則RW段不能放在最后,如果一個域含有RW或ZI段,則RO段不能放在最后。在同一個運行域中,兩個不同的段不能同時放在域的最后位置。-libpathpathlist這個選項為ARM標準的C和C+庫指定了搜索路徑列表。注意,這個選項不會影響對用戶庫的搜索路徑。這個選項覆蓋了環境
30、變量ARMLIB所指定的路徑。參數pathlist是一個以逗號分開的多個路徑列表,即為path1,path2,.pathn,這個路徑列表只是用來搜索要用到的ARM庫函數。默認的,對于包含ARM庫函數的默認路徑是由環境變量ARMLIB所指定的。-scanlib這個選項啟動對默認庫(標準ARMC和C+庫)的掃描以解析引用的符號。這個選項是默認的設置。-noscanlib該選項禁止在鏈接時候掃描默認的庫。-locals這個選項指導鏈接器在生成一個可執行映像文件的時候,將本地符號添加到輸出符號信息表中。該選項是默認設置。-nolocals這個選項指導鏈接器在生成一個可執行映像文件的時候,不要將本地符號
31、添加到輸出符號信息表中。如果想減小輸出符號表的大小,可以使用該選項。-callgraph該選項創建一個HTML格式的靜態函數調用圖。這個調用圖給出了映像文件中所有函數的定義和引用信息。對于每一個函數它列出了:1. 函數編譯時候的處理器狀態(ARM狀態還是Thumb狀態);調用func函數的集合;被func調用的函數的集合;在映像文件中使用的func尋址的次數。此外,調用圖還標識了下面的函數:被interworkingveneers所調用的函數;在映像文件外部定義的函數;允許未被定義的函數(以weak方式的引用);靜態調用圖還提供了堆棧使用信息,它顯示出了:1. 每個函數所使用的堆棧大小;在全部
32、的函數調用中,所用到的最大堆棧大小。-infotopics這個選項打印出關于指定種類的信息,這里的參數topics是指用逗號間隔的類型標識符列表。類型標識符列表可以是下面所列出的任意一個:sizes為在映像文件中的每一個輸入對象和庫成員列出了代碼和數據(這里的數據包括,RO數據,RW數據,ZI數據和Debug數據)的大小;totals為輸入對象文件和庫,列出代碼和數據(這里的數據包括,RO數據,RW數據,ZI數據和Debug數據)總的大小;veneers給出由armlink生成的veneers的詳細信息;unused列出由于使用-remove選項而從映像文件中被刪除的所有未使用段。注意:在信息
33、類型標識符列表之間不能存在空格,比如可以輸入-infosizes,totals但是不能是-infosizes,totals(即在逗號和totals之間有空格是不允許的)-map這個選項創建映像文件的信息圖。映像文件信息圖包括映像文件中的每個加載域,運行域和輸入段的大小和地址,這里的輸入段還包括調試信息和鏈接器產生的輸入段。-symbols這個選項列出了鏈接的時候使用的每一個局部和全局符號。該符號還包括鏈接生成的符號。-symdefsfile這個選項創建一個包含來自輸出映像文件的全局符號定義的符號定義文件。默認的,所有的全局符號都寫入到符號定義文件中。如果文件file已經存在,鏈接器將限制生成在
34、已存在的symdefs文件中已列出的符號。如果文件file沒有指明路徑信息,鏈接器將在輸出映像文件的路徑搜索文件。如果文件沒有找到,就會在該目錄下面創建文件。在鏈接另一個映像文件的時候,可以將符號定義文件作為鏈接的輸入文件。-editfile這個選項指定一個steering類型的文件,該文件包含用于修改輸出文件中的符號信息表的命令。可以在steering文件中指定具有以下功能的命令:隱藏全局符號。使用該選項可以在目標文件中隱藏指定的全局符號。重命名全局符號。使用這個選項可以解決符號命名沖突的現象。-xref該選項列出了在輸入段間的所有交叉引用。-xreffromobject(section)這
35、個選項列出了從目標文件中的輸入段對其他輸入段的交叉引用。如果想知道某個指定的輸入段中的引用情況,就可以使用該選項。-xreftoobject(section)該選項列出了從其他輸入段到目標文件輸入段的引用。-errorsfile使用該選項會將診斷信息從標準輸出流重定向到文件file中。-listfile該選項將-info,-map,-symbols,-xref,-xreffrom和以refto這幾個選項的輸出重新定向到文件file中。如果文件file沒有指定路徑信息,就會在輸出路徑創建該文件,該路徑是輸出映像文件所在的路徑。-verbose這個選項將有關鏈接操作的細節打印出來,包括所包括的目標
36、文件和要用到的庫。-unmangled該選項指定鏈接器在由xref,-xreffrom,-xrefto,和-symbols所生成的診斷信息中顯示出unmangledC+符號名。如果使用了這個選項,鏈接器將unmangleC+符號名以源碼的形式顯示出來。這個選項是默認的。-mangled這個選項指定鏈接器顯示由-xref,-xreffrom,-xrefto,和-symbols所產生的診斷信息中的mangledC+符號名。如果使用了該選項,鏈接器就不會unmangleC+符號名了。符號名是按照它們在目標符號表中顯示的格式顯示的。-viafile該選項表示從文件file中讀取輸入文件名列表和鏈接器選
37、項。在armlink命令行可以輸入多個-via選項,當然,-via選項也能夠不含在一個via文件中。-strict這個選項告訴鏈接器報告可能導致錯誤而不是警告的條件。-unresolvedsymbol這個選項將未被解析的符號指向全局符號symboloSymbol必須是已定義的全局符號,否則,symbol會當作一個未解析的符號,鏈接將以失敗告終。這個選項在自上而下的開發中尤為有用,在這種情況下,通過將無法指向相應函數的引用指向一個偽函數的方法,可以測試一個部分實現的系統。該選項不會顯示任何警告信息。input-file-list這是一個以空格作為間隔符的目標或庫的列表。有一類特殊的目標文件,即s
38、ymdef文件,也可以包含在文件列表中,為生成的映像文件提供全局的symbol值。在輸入文件列表中有兩種使用庫的方法。1. 指定要從庫中提取并作為目標文件添加到映像文件中的特定的成員。2. 指定某庫文件,鏈接器根據需要從其中提取成員。armlink按照以下的順序處理輸入文件列表:1. 無條件的添加目標文件使用匹配模式從庫中選擇成員加載到映像文件中去。例如使用下面的命令:armlinkmain.omylib(stdio.o)mylib(a*.o).將會無條件的把mylib庫中所有的以字母a開頭的目標文件和stdio.o在鏈接的時候鏈接到生成的映像文件中去。2. 添加為解析尚未解析的引用的庫到庫文
39、件列表。ARM運行時庫本小節為讀者介紹一下ARMC/C+庫方面的相關內容。運行時庫類型和建立選項ADS提供以下的運行時庫來支持被編譯的C和C+代碼:ANSIC庫函數:這個C函數庫是由以下幾部分組成:1. 在ISOC標準中定義的函數;在semihosted環境下(semihosting是針對ARM目標機的一種機制,它能夠根據應用程序代碼的輸入/輸出請求,與運行有調試功能的主機通訊。這種技術允許主機為通常沒有輸入和輸出功能的目標硬件提供主機資源)用來實現C庫函數的與目標相關的函數;被C和C+編譯器所調用的支持函數。ARMC庫提供了額外的一些部件支持C+,并為不同的結構體系和處理器編譯代碼。C+庫函
40、數:C+庫函數包含由ISOC+庫標準定義的函數。C+庫依賴于相應的C庫實現與特定目標相關的部分,在C+庫的內部本身是不包含與目標相關的部分。這個庫是由以下幾部分組成的:1. 版本為2.01.01的RogueWaveStandardC+庫;C+編譯器使用的支持函數;RogueWave庫所不支持的其他的C+函數。正如上面所說,ANSIC庫使用標準的ARMsemihosted環境提供例如,文件輸入/輸出的功能。Semihosting是由已定義的軟件中斷(SoftwareInterrupt)操作來實現的。在大多數的情況下,semihostingSWI是被庫函數內部的代碼所觸發,用于調試的代理程序處理S
41、WI異常。調試代理程序為主機提供所需要的通信。Semihosted被ARMulator,Angel和Multi-ICE所支持。用戶可以使用在ADS軟件中的ARM開發工具去開發用戶應用程序,然后在ARMulator或在一個開發板上運行和調試該程序。用戶可以把C庫中的與目標相關的函數作為自己應用程序中的一部分,重新進行代碼的實現。這就為用戶帶來了極大的方便,用戶可以根據自己的執行環境,適當的裁剪C庫函數。除此之外,用戶還可以針對自己的應用程序的要求,對與目標無關的庫函數進行適當的裁剪。在C庫中有很多函數是獨立于其他函數的,并且與目標硬件沒有任何依賴關系。對于這類函數,用戶可以很容易地從匯編代碼中使
42、用它們。在建立自己的用戶應用程序的時候,用戶必須指定一些最基本的操作選項。例如:字節順序,是大端模式(bigendian:字數據的高字節存放在低地址,低字節存放在高地址),還是小端模式(littleendian:字數據的高字節存放在高地址,低字節存放在低地址);浮點支持:可能是FPA,VFP,軟件浮點處理或不支持浮點運算;堆棧限制:是否檢查堆棧溢出;位置無關(PID):數據是從與位置無關的代碼還是從與位置相關的代碼中讀/寫,代碼是位置無關的只讀代碼還是位置相關的的只讀代碼。當用戶對匯編程序,C程序或C+程序進行鏈接的時候,鏈接器會根據在建立時所指定的選項,選擇適當的C或C+運行時庫的類型。選項
43、各種不同組合都有一個相應的ANSIC庫類型。庫路徑結構庫路徑是在ADS軟件安裝路徑的lib目錄下的兩個子目錄。假設,ADS軟件安裝在e:armadsv1_2目錄,則在e:armadsv1_2lib目錄下的兩個子目錄armlib和cpplib是ARM的庫所在的路徑。armlib這個子目錄包含了ARMC庫,浮點代數運算庫,數學庫等各類庫函數。與這些庫相應的頭文件在e:armadsv1_2include目錄中。cpplib這個子目錄包含了RogueWaveC+庫和C+支持函數庫。RogueWaveC+庫和C+支持函數庫合在一起被稱為ARMC+庫。與這些庫相應的頭文件安裝在e:armadsv1_2in
44、clude目錄下。環境變量ARMLIB必須被設置成指向庫路徑。另外一種指定ARMC和ARMC+庫路徑的方法是,在鏈接的時候使用操作選項-libpathdirectory(directory代表庫所在的路徑),來指明要裝載的庫的路徑。無需對armlib和cpplib這兩個庫路徑分開指明,鏈接器會自動從用戶所指明的庫路徑中找出這兩個子目錄。這里需要讓讀者特別注意的以下幾點:ARMC庫函數是以二進制格式提供的;ARM庫函數禁止修改。如果讀者想對庫函數創建新的實現的話,可以把這個新的函數編譯成目標文件,然后在鏈接的時候把它包含進來。這樣在鏈接的時候,使用的是新的函數實現而不是原來的庫函數。1. 通常情
45、況下,為了創建依賴于目標的應用程序,在ANSIC庫中只有很少的幾個函數需要實現重建。2. RogueWaveStandardC+函數庫的源代碼不是免費發布的,可以從RogueWaveSoftwareInc.,或ARM公司通過支付許可證費用來獲得源文件。GUI開發環境(CodeWarrior和AXD)CodeWarrior集成開發環境CodeWarriorforARM是一套完整的集成開發工具,充分發揮了ARMRISC的優勢,使產品開發人員能夠很好的應用尖端的片上系統技術.該工具是專為基于ARMRISC的處理器而設計的,它可加速并簡化嵌入式開發過程中的每一個環節,使得開發人員只需通過一個集成軟件開
46、發環境就能研制出ARM產品,在整個開發周期中,開發人員無需離開CodeWarrior開發環境,因此節省了在操做工具上花的時間,使得開發人員有更多的精力投入到代碼編寫上來,CodeWarrior集成開發環境(IDE)為管理和開發項目提供了簡單多樣化的圖形用戶界面。用戶可以使用ADS的CodeWarriorIDE為ARM和Thumb處理器開發用C,C+,或ARM匯編語言的程序代碼。通過提供下面的功能,CodeWarriorIDE縮短了用戶開發項目代碼的周期。1. 全面的項目管理功能;子函數的代碼導航功能,使得用戶迅速找到程序中的子函數。可以在CodeWarriorIDE為ARM配置在8.1.1中介
47、紹的各種命令工具,實現對工程代碼的編譯,匯編和鏈接。在CodeWarriorIDE中所涉及到的target有兩種不同的語義。目標系統(Targetsystem)是特指代碼要運行的環境,是基于ARM的硬件。比如,要為ARM開發板上編寫要運行在它上面的程序,這個開發板就是目標系統。生成目標(Buildtarget)是指用于生成特定的目標文件的選項設置(包括匯編選項,編譯選項,鏈接選項以及鏈接后的處理選項)和所用的文件的集合。CodeWarriorIDE能夠讓用戶將源代碼文件,庫文件還有其他相關的文件以及配置設置等放在一個工程中。每個工程可以創建和管理生成目標設置的多個配置。例如,要編譯一個包含調試
48、信息的生成目標和一個基于ARM7TDMI的硬件優化生成目標,生成目標可以在同一個工程中共享文件,同時使用各自的設置。CodeWarriorIDE為用戶提供下面的功能:源代碼編輯器,它集成在CodeWarriorIDE的瀏覽器中,能夠根據語法格式,使用不同的顏色顯示代碼;源代碼瀏覽器,它保存了在源碼中定義的所有符號,能夠使用戶在源碼中快速方便的跳轉;查找和替換功能,用戶可以在多個文件中,利用字符串通配符,進行字符串的搜索和替換;文件比較功能,可以使用戶比較路徑中的不同文本文件的內容。ADS的CodeWarriorIDE是基于MetrowerksCodeWarriorIDE4.2版本的。它經過適當
49、的裁剪以支持ADS工具鏈。針對ARM的配置面板為用戶提供了在CodeWarriorIDE集成環境下配置各種ARM開發工具的能力,這樣用戶可以不用在命令控制臺下就能夠使用在8.1.1和將在8.1.4中介紹的各種命令。以ARM為目標平臺的工程創建向導,可以使用戶以此為基礎,快速創建ARM和Thumb工程。盡管大多數的ARM工具鏈已經集成在CodeWarriorIDE,但是仍有許多功能在該集成環境中沒有實現,這些功能大多數是和調試相關的,因為ARM的調試器沒有集成到CodeWarriorIDE中。由于ARM調試器(AXD)沒有集成在CodeWarriorIDE中,這就意味著,用戶不能在CodeWar
50、riorIDE中進行斷點調試和查看變量。對于熟悉CodeWarriorIDE的用戶會發現,有許多的功能已經從CodeWarriorIDEForARM中移走,比如快速應用程序開發模板等。在CodeWarriorIDEForARM中有很多的菜單或子菜單是不能使用的。下面介紹一下這些不能使用的選項。1. View菜單下不能使用的菜單選項有:2. ProcessesExpressions,GlobalVariable,Breakpoints,RegistersoProject菜單不能使用的菜單選項:Precompile子菜單。因為ARM編譯器不支持預編譯的頭文件。Debug菜單該菜單中沒有一個子菜單是
51、可以使用的。3. Browser菜單中不能使用的菜單選項:NewProperty,NewMethod和NewEventSet。4. Helpmenu中不能用于ADS的菜單選項有:CodeWarriorHelp,Index,Search和OnlineManualso有關CodeWarriorIDE中一些常用菜單的使用,將在后面的舉例中具體說明的,在此,不在贅述。ADS調試器調試器本身是一個軟件,用戶通過這個軟件使用debugagent可以對包含有調試信息的,正在運行的可執行代碼進行比如變量的查看,斷點的控制等調試操作。ADS中包含有3個調試器:AXD(ARMeXtendedDebugger):A
52、RM擴展調試器;armsd(ARMSymbolicDebugger):ARM符號調試器;與老版本兼容的Windows或Unix下的ARM調試工具,ADW/ADU(ApplicationDebuggerWindows/Unix)。下面對在調試映像文件中所涉及到的一些術語做一個簡單的介紹。Debugtarget在軟件開發的最初階段,可能還沒有具體的硬件設備。如果要測試所開發的軟件是否達到了預期的效果,這可以由軟件仿真來完成。即使調試器和要測試的軟件運行在同一臺PC上,也可以把目標當作一個獨立的硬件來看待。當然,也可以搭建一個PCB板,這個板上可以包含一個或多個處理器,在這個板上可以運行和調試應用軟
53、件。只有當通過硬件或者是軟件仿真所得到的結果達到了預期的效果,才算是完成了應用程序的編寫工作。調試器能夠發送以下指令:1. 裝載映像文件到目標內存;啟動或停止程序的執行;顯示內存,寄存器或變量的值;允許用戶改變存儲的變量值。DebugagentDebugagent執行調試器發出的命令動作,比如:設置斷點,從存儲器中讀數據,把數據寫到存儲器等。Debugagent既不是被調試的程序,也不是調試器。在ARM體系中,它有這幾種方式:Multi-ICE(Multi-processorin-circuitemulator),ARMulator和Angel。其中Multi-ICE是一個獨立的產品,是ARM
54、公司自己的JTAG在線仿真器,不是由ADS提供的。AXD可以在Windows和UNIX下,進行程序的調試。它為用C,C+,和匯編語言編寫的源代碼提供了一個全面的Windows和UNIX環境。在后面的章節中,會結合具體實例為讀者介紹如何使用AXD調試器。實用程序ADS提供以下的實用工具來配合前面介紹的命令行開發工具的使用fromELF這是ARM映像文件轉換工具。該命令將ELF格式的文件作為輸入文件,將該格式轉換為各種輸出格式的文件,包括plainbinary(BIN格式映像文件),Motorola32-bitS-recordformat(Motorola32位S格式映像文件),IntelHex3
55、2format(Intel32位格式映像文件),和Verilog-likehexformat(Verilog16進制文件)。FromELF命令也能夠為輸入映像文件產生文本信息,例如代碼和數據長度。armarARM庫函數生成器將一系列ELF格式的目標文件以庫函數的形式集合在一起,用戶可以把一個庫傳遞給一個鏈接器以代替幾個ELF文件。Flashdownloader用于把二進制映像文件下載到ARM開發板上的Flash存儲器的工具支持的軟件ADS為用戶提供下面的軟件,使用戶可以在軟件仿真的環境下或者在基于ARM的硬件環境調試用戶應用程序。ARMulator這是一個ARM指令集仿真器,集成在ARM的調試
56、器AXD中,它提供對ARM處理器的指令集的仿真,為ARM和Thumb提供精確的模擬。用戶可以在硬件尚未做好的情況下,開發程序代碼。使用ADS創建工程本節通過一個具體實例,為讀者介紹如何使用該集成開發環境,利用CodeWarrior提供的建立工程的模板建立自己的工程,并學會如何進行編譯鏈接,生成包含調試信息的映像文件和可以直接燒寫的Flash中的.bin格式的二進制可執行文件。建立一個工程工程將所有的源碼文件組織在一起,并能夠決定最終生成文件存放的路徑,輸出的格式等。在CodeWarrior中新建一個工程的方法有兩種,可以在工具欄中單擊“NeW按鈕,也可以在“File'單中選擇“New萊
57、單。這樣就會打開一個如圖8.1所示的對話框。圖8.1新建工程對話框在這個對話框中為用戶提供了7種可選擇的工程類型。ARMExecutablImage:用于由ARM指令的代碼生成一個ELF格式的可執行映像文件;ARMObjectLibrary:用于由ARM指令的代碼生成一個armar格式的目標文件庫;EmptyProject:用于創建一個不包含任何庫或源文件的工程;MakefileImporterWizard:用于將VisualC的nmake或GNUmake文件轉入至UCodeWarriorIDE工程文件;ThumbARMExecutableImage:用于由ARM指令和Thumb指令的混和代碼生成一個可執行的ELF格式的映像文件;ThumbExecutableimage:用于由Thumb指令創建一個可執行的ELF格式的映像文件;ThumbObjectLibrary:用于由Thumb指令的代碼生成一個arm
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年法律職業資格考試民法專項深度解析練習試卷
- 2025年小學英語畢業考試模擬試卷:語音語調訓練與聽力策略
- 物流運輸服務合同協議內容詳實版
- 2025年注冊建筑師專業知識考核建筑抗震加固規范案例分析與應用試題試卷
- 環境保護項目掛靠管理流程探討
- 《古絲綢之路的興衰歷程:初中歷史課程教案》
- 2025年中學教師資格考試《綜合素質》教師職業道德深度剖析試題匯編與答案試卷
- 醫療器械舊件處理管理流程
- 醫療健康信息服務平臺合同
- 漢末三國襄陽大族研究
- 2023年鄭州工業應用技術學院單招考試面試題庫及答案解析
- 《電子制造技術-電子封裝》配套教學課件
- 二月份循證護理查房課件
- 粉筆國考行測模考大賽第八季
- JJF(湘) 09-2018 純水-超純水系統監測儀表(電導率)計量校準規范-(高清現行)
- 大一下【世界古代史】期末復習資料
- 延安市幼兒教師心理健康現狀調查分析
- 尾礦庫筑壩施工組織方案
- 中藥斗譜排序
- 數學建模“如何進行人員分配”問題
- 空調系統維保記錄表格模板
評論
0/150
提交評論