ADS所提供的命令列開發工具

來源:互聯網
上載者:User

 ADS提供下面的命令列開發工具:armccarmcc是ARM C編譯器。這個編譯器通過了Plum Hall C Validation Suite為ANSI C的一致性測試。armcc用於將用ANSI C編寫的程式編譯成32位ARM指令代碼。因為armcc是我們最常用的編譯器,所以對此作一個詳細的介紹。在命令控制台環境下,輸入命令:armcc –help。可以查看armcc的文法格式以及最常用的一些操作選項。armcc最基本的用法為: armcc [options] file1 file2 ... filen這裡的option是編譯器所需要的選項,fiel1,file2…filen是相關的檔案名稱。這裡簡單介紹一些最常用的操作選項。-c:表示只進行編譯不連結檔案;-C:(注意:這是大寫的C)禁止先行編譯器將注釋行移走;-D:定義預先處理宏,相當於在來源程式開頭使用了宏定義語句#define
symbol ,這裡symbol預設為1;-E:僅僅是對C原始碼進行預先處理就停止;-g:指定是否在產生的目標檔案中包含調試資訊表;-I:將directory所指的路徑添加到#include的搜尋路徑列表中去; -J:用directory所指的路徑代替預設的對#include的搜尋路徑;-o:指定編譯器最終產生的輸出檔案名。-O0:不最佳化;-O1:這是控制碼最佳化的編譯選項,大寫字母O後面跟的數字不同,表示的最佳化層級就不同,-O1關閉了影響調試結果的最佳化功能;-O2:該最佳化層級提供了最大的最佳化功能;-S:對來源程式進行預先處理和編譯,自動產生彙編檔案而不是目標檔案;-U:取消預先處理宏名,相當於在源檔案開頭,使用語句#undef
symbol;-W:關閉所有的或被選擇的警告資訊;有關更詳細的選項說明,讀者可查看ADS軟體的線上協助檔案。armcpparmcpp是ARM C++編譯器。它將ISO C++ 或EC++ 編譯成32位ARM指令代碼。tcctcc是Thumb C 編譯器。該編譯器通過了Plum Hall C Validation Suite為ANSI 一致性的測試。tcc將ANSI C原始碼編譯成16位的Thumb指令代碼。tcpptcpp是Thumb C++ 編譯器。 它將ISO C++ 和EC++ 源碼編譯成16位Thumb指令代碼。armasmarmasm是ARM和Thumb的彙編器。它對用ARM組合語言和Thumb組合語言寫的原始碼進行彙編。armlinkarmlink是ARM連接器。該命令既可以將編譯得到的一個或多個目標檔案和相關的一個或多個庫檔案進行連結,產生一個可執行檔,也可以將多個目標檔案部分連結成一個目標檔案,以供進一步的連結。ARM連結器產生的是ELF格式的可執行映像檔案。armsdarmsd是ARM
和Thumb的符號調試器。它能夠進行源碼級的程式調試。使用者可以在用C或組合語言寫的代碼中進行單步調試,設定斷點,查看變數值和記憶體單元的內容。armcc用法詳解下面為讀者介紹上述的4種ARM C和C++編譯器的命令通用文法。compiler [PCS-options] [source-language] [search-paths] [preprocessor-options] [output-format] [target-options] [debug-options] [code-generation-options]
[warning-options] [additional-checks] [error-options] [source]使用者可以通過命令列操作選項控制編譯器的執行。所有的選項都是以符號”-”開始,有些選項後面還跟有參數。在大多數情況下,ARM C和C++編譯器允許在選項和參數之間存在空格。命令列中各個選項出現順序可以任意。這裡的compiler是指armcc,tcc, armcpp和 tcpp中的一個;PCS-options:指定了要使用的程序呼叫標準;source-language:指定了編譯器可以接受的編寫來源程式的語言種類。對於C編譯器預設的語言是ANSI
C,對於C++編譯器預設是ISO標準C++;search-paths:該選項指定了對包含的檔案(包括源檔案和標頭檔)的搜尋路徑;preprocessor-options:該選項指定了前置處理器的行為,其中包括前置處理器的輸出和宏定義等特性;output-format:該選項指定了編譯器的輸出格式,可以使用該項產生組合語言輸出資料行表檔案和目標檔案;target-options:該選項指定目標處理器或ARM體繫結構;debug-options:該選項指定調試資訊表是否產生,和該調試資訊表產生時的格式;code-generation-options:該選項指定了例如最佳化,位元組順序和由編譯器產生的資料對齊格式等選項;warning-options:該選項決定警告資訊是否產生;additional-checks:該選項指定了幾個能用於源碼的附加檢查,例如檢查資料流異常,檢查沒有使用的聲明等;error-options:該選項可以關閉指定的可恢複的錯誤,或者將一些指定的錯誤降級為警告;source:該選項提供了包含有C或C++原始碼的一個或多個檔案名稱,預設的,編譯器在當前路徑尋找源檔案和建立輸出檔案。如果源檔案是用組合語言編寫的(也就是說該檔案的檔案名稱是以.s作為副檔名),彙編器將被調用來處理這些源檔案。如果作業系統對命令列的長度有限制,可以使用下面的操作,從檔案中讀取另外的命令列選項:-via
filename該命令開啟檔案名稱為filename的檔案,並從中讀取命令列選項。使用者可以對-via進行嵌套調用,亦即,在檔案filename中又通過-via finlename2包含了另外一個檔案。在下面的例子中,從input.txt檔案中讀取指定的選項,作為armcpp的操作選項:armcpp -via input.txt source.c以上是對編譯器選項的一個簡單概述。它們(包括後面還要介紹的其他一些命令工具)既可以在命令控制台環境下使用,同時由於它們被嵌入到了ADS的圖形介面中,所以也可以在圖形介面下使用。armlink用法詳解在介紹armlink的使用方法之前,先介紹要涉及到的一些術語:映像檔案(image):是指一個可執行檔,在執行的時候被載入到處理器中。一個映像檔案有多個線程。它是ELF(Executable
and linking format)格式的。段(Section):描述映像檔案的代碼或資料區塊。RO:是Read-only的簡寫形式。RW:是Read-write的簡寫形式。ZI:是Zero-initialized的簡寫形式。輸入段(input section):它包含著代碼,初始化資料或描述了在應用程式運行之前必須要初始化為0的一段記憶體。輸出段(output section):它包含了一系列具有相同的RO,RW或ZI屬性的輸入段。域(Regions):在一個映像檔案中,一個域包含了1至3個輸出段。多個域組織在一起,就構成了最終的映像檔案。Read
Only Position Independent(ROPI):它是指一個段,在這個段中代碼和唯讀資料的地址在運行時候可以改變。Read Write Position Independent(RWPI):它是指一個段,在該段中的可讀/寫的資料地址在運行期間可以改變。載入時地址:是指映像檔案位於儲存空間(在該映像檔案沒有運行時)中的地址。運行時地址:是指映像檔案在運行時的地址。下面介紹一下armlink命令的文法:完整的連接器命令文法如下:armlink [-help] [-vsn] [-partial] [-output
file] [-elf] [-reloc][-ro-base address] [-ropi][-rw-base address] [-rwpi] [-split][-scatter file][-debug|-nodebug][-remove?RO/RW/ZI/DBG]|-noremove] [-entry location ][-keep section-id] [-first section-id] [-last section-id] [-libpath pathlist] [-scanlib|-noscanlib]
[-locals|-nolocals] [-callgraph] [-info topics] [-map] [-symbols] [-symdefs file] [-edit file] [-xref] [-xreffrom object(section)] [-xrefto object(section)] [-errors file] [-list file] [-verbose][-unmangled |-mangled] [-match crossmangled][-via file] [-strict][-unresolved
symbol][-MI|-LI|-BI] [input-file-list]上面各選項的含義分別為:-help:這個選項會列出在命令列中常用的一些選項操作。-vsn:這個選項顯示出所用的armlink的版本資訊。-partial:用這個選項建立的是部分連結的目標檔案而不是可執行映像檔案。-output file:這個選項指定了輸出檔案名,該檔案可能是部分連結的目標檔案,也可能是可執行映像檔案。如果輸出檔案名沒有特別指定的話,armlink將使用下面的預設:如果輸出是一個可執行映像檔案,則產生的輸出檔案名為__image.axf;如果輸出是一個部分連結的目標檔案,在產生的檔案名稱為__object.o;如果沒有指定輸出檔案的路徑資訊,則輸出檔案就在目前的目錄下產生。如果指定了路徑資訊,則所指定的路徑成為輸出檔案的當前路徑。-elf:這個選項產生ELF格式的映像檔案,這也是armlink所支援的唯一的一種輸出格式,這是預設選項。-reloc:這個選項產生可重定址的映像。一個可重定址的映像具有動態段,這個段中包含可重定址資訊,利用這些資訊可以在連結後,進行映像檔案的重新定址;-reloc,-rw-base
一起使用,但是如果沒有-split選項,連結時會產生錯誤。-ro-base address:這個選項將包含有RO(Read-Only屬性)輸出段的載入地址和運行地址設定為address,該地址必須是字對齊的,如果沒有指定這個選項,則預設的RO基地址值為0x8000。-ropi:這個選項使得包含有RO輸出段的載入域和運行域是位置無關的。如果該選項沒有使用,則相應的域被標記為絕對的。通常每一個唯讀屬性的輸入段必須是唯讀位置無關的。如果使用了這個選項,armlink將會進行以下操作:檢查各段之間的重定址是否有效;確保任何由armlink自身產生的程式碼是唯讀位置無關的。這裡希望讀者注意的是,ARM工具直到armlink完成了對輸入段的處理後,才能夠決定最終的產生映像是否為唯讀位置無關的。這就意味著,即使為編譯器和彙編器指定了ROPI選項,armlink也可能會產生ROPI錯誤資訊。-rw-base
address:這個選項設定包含RW(Read/Write屬性)輸出段的域的運行時地址,該地址必須是字對齊的。如果這個選項和-split選項一起使用,將設定包含RW輸出段的域的載入和運行時地址都設定在address處。-rwpi:這個選項使得包含有RW和ZI(Zero Initialization,初始化為0)屬性的輸出段的載入和運行時域為位置無關的。如果該選項沒有使用,相應域標記為絕對的。這個選項要求-rw-base選項後有值,如果-rw-base沒有指定的話,預設其值為0,即相當於-rw-base 0。通常每一個可寫的輸入段必須是可讀/
可寫的位置無關的。如果使用了該選項,armlink會進行以下的操作:檢查可讀/可寫屬性的運行域的輸入段是否設定了位置無關屬性;檢查在各段之間的重定址是否有效;產生基於靜態寄存器sb的條目,這些在RO和RW域被拷貝和初始化的時候會用到。編譯器並不會強制可寫的資料一定要為位置無關的,這就是說,即使在為編譯器和彙編器指定了RWPI選項,armlink也可能產生資料不是RWPI的資訊。-split:這個選項將包含RO和RW屬性的輸出段的載入域,分割成2個載入域。一個是包含RO輸出段的載入域,預設的載入地址為0x8000,但是可以用-ro-base選項設定其他的地址值,另一個載入域包含RO屬性的輸出段,由-rw-base選項指定載入地址,如果沒有使用-rw-base選項的話,預設使用的是-rw-base
0。-scatter file:這個選項使用在file中包含的分組和定位資訊來建立映像記憶體映射。注意,如果使用了該選項的話,必須要重新實現堆棧初始化函數__user_initial_stackheap()。-debug:這個選項使輸出檔案包含調試資訊,調試資訊包括,調試輸入段,符號和字串表。這是預設的選項。-nodebug:這個選項使得在輸出檔案中不包含調試資訊。產生的映像檔案短小,但是不能進行源碼級的調試。armlink對在輸入的目標檔案和庫函數中發現的任何調試輸入段都不予處理,當載入映像檔案到調試器中的時候,也不包含符號和字串資訊表。這個選項僅僅是對裝載到調試器的映像檔案的大小有影響,但是對要下載到目標板上的二進位代碼的大小沒有任何影響。如果用armlink進行部分連結產生目標檔案而不是映像檔案,則雖然在產生的目標檔案中不含有調試輸入段,但是會包含符號和字串資訊表。這裡特別請讀者注意的是:如果要在連結完成後使用fromELF工具的話,不可使用-nodebug選項,這是因為如果產生的映像檔案中不包含調試資訊的話,則有下面的影響:fromELF不能將映像檔案轉換成其他格式的檔案;fromELF不能產生有意義的反組譯碼列表。-remove
(RO/RW/ZI/DBG):使用這個選項會將在輸入段未使用的段從映像檔案中刪除。如果輸入段中含有映像檔案進入點或者該輸入段被一個使用的段所引用,則這樣的輸入段會當作已使用的段。在使用這個選項時候要注意,不要刪除異常處理函數。使用-keep選項來標識異常處理函數,或用ENTRY偽指令標明是進入點。為了更精確的控制刪除未使用的段,可以使用段屬性限制符。可以使用以下的段屬性限制符:RO:刪除所有未使用的RO屬性的段;RW:刪除所有未使用的RW屬性的段;ZI:刪除所有未使用的ZI屬性的段;DBG:刪除所有未使用的DEBUG屬性的段。這些限制符出現的順序是任意的,但是它們必須要有”(
)”括住,多個限制符之間要用符號”/”進行間隔。ADS軟體中預設選項是-remove (RO/RW/ZI/DBG)。如果沒有指定段屬性限制符,則所有未使用的段都會被刪除。因為-remove就等價於-remove(RO/RW/ZI/DBG)選項。-noremove:這個選項保留映像檔案中所有未被使用的段。-entry location:這個選項指定映像檔案中唯一的初始化進入點。一個映像檔案可以包含多個進入點,使用這個命令定義的初始化進入點是存放在可執行檔的頭部,以供載入程式載入時使用。當一個映像檔案被裝載時,ARM調試器使用這個進入點地址來初始化PC指標。初始化進入點必須滿足下面的條件:映像檔案的進入點必須位於運行域內;運行域必須是非覆蓋的,並且必須是固定域(就是說,載入域和運行域的地址相同)。在這裡可以用以下的參數代替location參數:1.
進入點地址:這是一個數值,例如-entry 0x0;2. 符號:該選項指定映像檔案的進入點為該符號所代表的地址處,比如:-entry int_handler:表示程式進入點在符號int_handler所在處。如果該符號有多處定義存在,armlink將產生出錯資訊。offset+object(section):該選項指定在某個目標檔案的段的內部的某個位移量處為映像檔案的入口地址,例如:-entry 8+startup(startupseg):如果位移量值為0,可以簡寫成object(section),如果輸入段只有一個,則可以簡化為object。-keep
section-id:使用該選項,可以指定保留一個輸入段,這樣的話,即使該輸入段沒有在映像檔案中使用,也不會被刪除。參數section-id取下面一些格式:1. symbol:該選項指定定義symbol的輸入段不會在刪除未使用的段時被刪除。如果映像檔案中有多處symbol定義存在,則所有包含symbol定義的輸入段都不會被刪除。例如:-keep int_handler:則所有定義int_handler的符號的段都會保留,而不被刪除。為了保留所有含有以_handler結尾的符號的段,可以使用如下的選項:-keep
*_handler。2. object(section):這個選項指定了在刪除未使用段時,保留目標檔案中的section段。輸入段和目標名是不區分大小寫,例如,為了在目標檔案vectors.o中保留vect段,使用:-keep vectors.o(vect)。為了保留vectors.o中的所有以vec開頭的段名,可以使用選項:-keep vectors.o(vec*)。3. object:這個選項指定在刪除未使用段時,保留該目標檔案唯一的輸入段。目標名是不區分大小寫,如果使用這個選項的時候,目標檔案中所含的輸入段不止一個的話,armlink會給出出錯資訊。比如,為了保留每一個以dsp開頭的只含有唯一輸入段的目標檔案,可以使用如下的選項:-keep
dsp*.o-first section-id:這個選項將被選擇的輸入段放在運行域的開始。通過該選項,將包含複位和中斷向量地址的段放置在映像檔案的開始,可以用下面的參數代替section-id:1.symbol:選擇定義symbol的段。禁止指定在多處定義的symbol,因為多個段不能同時放在映像檔案的開始。2.object(section):從目標檔案中選擇段放在映像檔案的開始位置。在目標檔案和括弧之間不允許存在空格,例如-first init.o(init)。3.object:選擇只有一個輸入段的目標檔案。如果這個目標檔案包含多個輸入段,armlink會產生錯誤資訊。用這個選項的例子如下:-first
init.o。 這裡希望讀者注意的是:使用-first不能改變在域中按照RO段放在開始,接著放置RW段,最後放置ZI段的基本屬性排放順序。如果一個域含有RO段,則RW或ZI段就不能放在映像檔案的開頭。類似地,如果一個域有RO或RW段,則ZI段就不能放在檔案開頭。兩個不同的段不能放在同一個運行時域的開頭,所以使用該選項的時候只允許將一個段放在映像檔案的開頭。-last section-id:這個選項將所選擇的輸入段放在運行域的最後。例如,用這個選項能夠強制性的將包含校正和的輸入段放置在RW段的最後。使用下面的參數可以替換section-id。1.
symbol:選擇定義symbol的段放置在運行域的最後。不能指定一個有多處定義的symbol。使用該參數的例子如下:-last checksum。2. object(section):從目標檔案中選擇section段。在目標檔案和後面的括弧間不能有空格,用該參數的例子為:-last checksum.o(check)。3. object:選擇只有一個輸入段的目標,如果該目標檔案中有多個輸入段,armlink會給出出錯資訊。和-first選項一樣,需要讀者注意的是;使用-last選項不能改變在域中將RO段放在開始,接著放置RW段,最後放置ZI段的輸出段基本的排放順序。如果一個域含有ZI段,則RW段不能放在最後,如果一個域含有RW或ZI段,則RO段不能放在最後。在同一個運行域中,兩個不同的段不能同時放在域的最後位置。-libpath
pathlist:這個選項為ARM標準的C和C++庫指定了搜尋路徑列表。注意,這個選項不會影響對使用者庫的搜尋路徑。這個選項覆蓋了環境變數ARMLIB所指定的路徑。參數pathlist是一個以逗號分開的多個路徑列表,即為path1, path2,... pathn,這個路徑列表只是用來搜尋要用到的ARM庫函數。預設的,對於包含ARM庫函數的預設路徑是由環境變數ARMLIB所指定的。-scanlib:這個選項啟動對預設庫(標準ARM C和C++庫)的掃描以解析引用的符號。這個選項是預設的設定。-noscanlib:該選項禁止在連結時候掃描預設的庫。-locals:這個選項指導連結器在產生一個可執行映像檔案的時候,將本地符號添加到輸出符號資訊表中。該選項是預設設定。-nolocals:這個選項指導連結器在產生一個可執行映像檔案的時候,不要將本地符號添加到輸出符號資訊表中。如果想減小輸出符號表的大小,可以使用該選項。-callgraph:該選項建立一個HTML格式的靜態函數調用圖。這個調用圖給出了映像檔案中所有函數的定義和引用資訊。對於每一個函數它列出了:1.
函數編譯時間候的處理器狀態(ARM狀態還是Thumb狀態);2. 調用func函數的集合;3. 被func調用的函數的集合;4. 在映像檔案中使用的func定址的次數。此外,調用圖還標識了下面的函數:1. 被interworking veneers所調用的函數;2. 在映像檔案外部定義的函數;3. 允許未被定義的函數(以weak方式的引用);靜態調用圖還提供了堆棧使用資訊,它顯示出了:1. 每個函數所使用的堆棧大小;2. 在全部的函數調用中,所用到的最大堆棧大小。-info topics:這個選項列印出關於指定種類的資訊,這裡的參數topics是指用逗號間隔的類型標識符列表。類型標識符列表可以是下面所列出的任意一個:1.
sizes為在映像檔案中的每一個輸入對象和庫成員列出了代碼和資料(這裡的資料包括,RO資料,RW資料,ZI 資料和Debug 資料)的大小;2. totals為輸入對象檔案和庫,列出代碼和資料(這裡的資料包括,RO資料,RW資料,ZI 資料和Debug 資料) 總的大小;3. veneers給出由armlink產生的veneers的詳細資料;4. unused列出由於使用-remove選項而從映像檔案中被刪除的所有未使用段。注意:在資訊類型標識符列表之間不能存在空格,比如可以輸入-info sizes,totals但是不能是-info
sizes, totals(即在逗號和totals之間有空格是不允許的)-map這個選項建立映像檔案的資訊圖。映像檔案資訊圖包括映像檔案中的每個載入域,運行域和輸入段的大小和地址,這裡的輸入段還包括調試資訊和連結器產生的輸入段。-symbols:這個選項列出了連結的時候使用的每一個局部和全域符號。該符號還包括連結產生的符號。-symdefs file:這個選項建立一個包含來自輸出映像檔案的全域符號定義的符號定義檔案。預設的,所有的全域符號都寫入到符號定義檔案中。如果檔案file已經存在,連結器將限制產生在已存在的symdefs檔案中已列出的符號。如果檔案file沒有指明路徑資訊,連結器將在輸出映像檔案的路徑搜尋檔案。如果檔案沒有找到,就會在該目錄下面建立檔案。在連結另一個映像檔案的時候,可以將符號定義檔案作為連結的輸入檔案。-edit
file:這個選項指定一個steering類型的檔案,該檔案包含用於修改輸出檔案中的符號資訊表的命令。可以在steering檔案中指定具有以下功能的命令:隱藏全域符號。使用該選項可以在目標檔案中隱藏指定的全域符號。重新命名全域符號。使用這個選項可以解決符號命名衝突的現象。-xref:該選項列出了在輸入段間的所有交叉引用。-xreffrom object(section):這個選項列出了從目標檔案中的輸入段對其他輸入段的交叉引用。如果想知道某個指定的輸入段中的引用情況,就可以使用該選項。-xrefto object(section):該選項列出了從其他輸入段到目標檔案輸入段的引用。-errors
file:使用該選項會將診斷資訊從標準輸出資料流重新導向到檔案file中。-list file:該選項將-info,-map,-symbols,-xref,-xreffrom和 –xrefto這幾個選項的輸出重新定向到檔案file中。如果檔案file沒有指定路徑資訊,就會在輸出路徑建立該檔案,該路徑是輸出映像檔案所在的路徑。-verbose:這個選項將有關連結操作的細節列印出來,包括所包括的目標檔案和要用到的庫。-unmangled:該選項指定連結器在由xref,-xreffrom,-xrefto,和-symbols所產生的診斷資訊中顯示出unmangled
C++符號名。如果使用了這個選項,連結器將unmangle C++符號名以源碼的形式顯示出來。這個選項是預設的。-mangled:這個選項指定連結器顯示由-xref,-xreffrom,-xrefto,和-symbols所產生的診斷資訊中的mangled C++符號名。如果使用了該選項,連結器就不會unmangle C++符號名了。符號名是按照它們在目標符號表中顯示的格式顯示的。-via file:該選項表示從檔案file中讀取輸入檔案名稱列表和連結器選項。在armlink命令列可以輸入多個-via選項,當然,-via選項也能夠不含在一個via檔案中。-strict:這個選項告訴連結器報告可能導致錯誤而不是警告的條件。-unresolved
symbol:這個選項將未被解析的符號指向全域符號symbol。Symbol必須是已定義的全域符號,否則,symbol會當作一個未解析的符號,連結將以失敗告終。這個選項在自上而下的開發中尤為有用,在這種情況下,通過將無法指向相應函數的引用指向一個偽函數的方法,可以測試一個部分實現的系統。該選項不會顯示任何警告資訊。input-file-list:這是一個以空格作為間隔符的目標或庫的列表。有一類特殊的目標檔案,即symdef檔案,也可以包含在檔案清單中,為產生的映像檔案提供全域的symbol值。在輸入檔案清單中有兩種使用庫的方法。1.
指定要從庫中提取並作為目標檔案添加到映像檔案中的特定的成員。2. 指定某庫檔案,連結器根據需要從其中提取成員。armlink按照以下的順序處理輸入檔案清單:1. 無條件的添加目標檔案2. 使用匹配模式從庫中選擇成員載入到映像檔案中去。例如使用下面的命令:armlink main.o mylib(stdio.o) mylib(a*.o).將會無條件的把mylib庫中所有的以字母a開頭的目標檔案和stdio.o在連結的時候連結到產生的映像檔案中去。3. 添加為解析尚未解析的引用的庫到庫檔案清單。ARM執行階段程式庫本小節為讀者介紹一下ARM
C/C++庫方面的相關內容。1、執行階段程式庫類型和建立選項ADS提供以下的執行階段程式庫來支援被編譯的C和C++代碼:ANSI C庫函數:這個C函數庫是由以下幾部分組成:1.在ISO C標準中定義的函數;2.在semihosted環境下(semihosting是針對ARM目標機的一種機制,它能夠根據應用程式代碼的輸入/輸出請求,與運行有調試功能的主機通訊。這種技術允許主機為通常沒有輸入和輸出功能的目標硬體提供主機資源)用來實現C庫函數的與目標相關的函數;3.被C和C++編譯器所調用的支援函數。ARM C 庫提供了額外的一些組件支援C++,並為不同的結構體系和處理器編譯代碼。C++庫函數:C++庫函數包含由ISO
C++庫標準定義的函數。C++庫依賴於相應的C庫實現與特定目標相關的部分,在C++庫的內部本身是不包含與目標相關的部分。這個庫是由以下幾部分組成的:1. 版本為2.01.01的Rogue Wave Standard C++庫;2. C++編譯器使用的支援函數;3. Rogue Wave庫所不支援的其他的C++函數。正如上面所說,ANSI C庫使用標準的ARM semihosted 環境提供例如,檔案輸入/輸出的功能。Semihosting是由已定義的軟體中斷(Software Interrupt)操作來實現的。在大多數的情況下,semihosting
SWI是被庫函數內部的代碼所觸發,用於調試的代理程式處理SWI異常。調試代理程式為主機提供所需要的通訊。Semihosted被ARMulator ,Angel和Multi-ICE所支援。使用者可以使用在ADS軟體中的ARM開發工具去開發使用者應用程式,然後在ARMulator或在一個開發板上運行和調試該程式。使用者可以把C庫中的與目標相關的函數作為自己應用程式中的一部分,重新進行代碼的實現。這就為使用者帶來了極大的方便,使用者可以根據自己的執行環境,適當的裁剪C庫函數。除此之外,使用者還可以針對自己的應用程式的要求,對與目標無關的庫函數進行適當的裁剪。在C庫中有很多函數是獨立於其他函數的,並且與目標硬體沒有任何依賴關係。對於這類函數,使用者可以很容易地從彙編代碼中使用它們。在建立自己的使用者應用程式的時候,使用者必須指定一些最基本的操作選項。例如:位元組順序,是大端模式(big
endian:字資料的高位元組存放在低地址,低位元組存放在高地址),還是小端模式(little endian:字資料的高位元組存放在高地址,低位元組存放在低地址);浮點支援:可能是FPA,VFP,軟體浮點處理或不支援浮點運算;堆棧限制:是否檢查堆疊溢位;位置無關(PID):資料是從與位置無關的代碼還是從與位置相關的代碼中讀/寫,代碼是位置無關的唯讀代碼還是位置相關的的唯讀代碼。當使用者對組譯工具,C程式或C++程式進行連結的時候,連結器會根據在建立時所指定的選項,選擇適當的C或C++執行階段程式庫的類型。選項各種不同組合都有一個相應的ANSI
C庫類型。2、庫路徑結構庫路徑是在ADS軟體安裝路徑的lib目錄下的兩個子目錄。假設,ADS軟體安裝在e:\arm\adsv1_2目錄,則在e:\arm\adsv1_2\lib目錄下的兩個子目錄armlib和cpplib是ARM的庫所在的路徑。armlib這個子目錄包含了ARM C 庫,浮點代數運算庫,數學庫等各類庫函數。與這些庫相應的標頭檔在e:\arm\adsv1_2\include目錄中。cpplib這個子目錄包含了Rogue Wave C++庫和C++支援函數庫。Rogue Wave C++庫和C++支援函數庫合在一起被稱為ARM
C++庫。與這些庫相應的標頭檔安裝在e:\arm\adsv1_2\include目錄下。環境變數ARMLIB必須被設定成指向庫路徑。另外一種指定ARM C和ARM C++庫路徑的方法是,在連結的時候使用操作選項-libpath directory(directory代表庫所在的路徑),來指明要裝載的庫的路徑。無需對armlib和cpplib這兩個庫路徑分開指明,連結器會自動從使用者所指明的庫路徑中找出這兩個子目錄。這裡需要讓讀者特別注意的以下幾點:1. ARM C庫函數是以二進位格式提供的;2. ARM 庫函數禁止修改。如果讀者想對庫函數建立新的實現的話,可以把這個新的函數編譯成目標檔案,然後在連結的時候把它包含進來。這樣在連結的時候,使用的是新的函數實現而不是原來的庫函數。3.
通常情況下,為了建立依賴於目標的應用程式,在ANSI C庫中只有很少的幾個函數需要實現重建。4. Rogue Wave Standard C++函數庫的原始碼不是免費發布的,可以從Rogue Wave Software Inc.,或ARM公司通過支付許可證費用來獲得源檔案。3、GUI開發環境(Code Warrior和AXD)CodeWarrior整合式開發環境:CodeWarrior for ARM是一套完整的整合開發工具,充分發揮了ARM RISC 的優勢, 使產品開發人員能夠很好的應用尖端的片上系統技術.
該工具是專為基於ARM RISC的處理器而設計的, 它可加速並簡化嵌入式開發過程中的每一個環節,使得開發人員只需通過一個整合軟體開發環境就能研製出ARM產品,在整個開發週期中,開發人員無需離開CodeWarrior開發環境, 因此節省了在操做工具上花的時間,使得開發人員有更多的精力投入到代碼編寫上來,CodeWarrior整合式開發環境(IDE)為管理和開發項目提供了簡單多樣化的圖形化使用者介面。使用者可以使用ADS的CodeWarrior IDE為ARM和Thumb處理器開發用C,C++,或ARM組合語言的程式碼。通過提供下面的功能,CodeWarrior
IDE縮短了使用者開發項目代碼的周期。1. 全面的專案管理功能;2. 子函數的代碼導航功能,使得使用者迅速找到程式中的子函數。可以在CodeWarrior IDE為ARM配置在8.1.1中介紹的各種命令工具,實現對工程代碼的編譯,彙編和連結。在CodeWarrior IDE中所涉及到的target有兩種不同的語義。目標系統(Target system)是特指代碼要啟動並執行環境,是基於ARM的硬體。比如,要為ARM開發板上編寫要運行在它上面的程式,這個開發板就是目標系統。產生目標(Build target)是指用於產生特定的目標檔案的選項設定(包括彙編選項,編譯選項,連結選項以及連結後的處理選項)和所用的檔案的集合。CodeWarrior
IDE 能夠讓使用者將原始碼檔案,庫檔案還有其他相關的檔案以及配置設定等放在一個工程中。每個工程可以建立和管理產生目標設定的多個配置。例如,要編譯一個包含調試資訊的產生目標和一個基於ARM7TDMI的硬體最佳化產生目標,產生目標可以在同一個工程中共用檔案,同時使用各自的設定。CodeWarrior IDE為使用者提供下面的功能:原始碼編輯器,它整合在CodeWarrior IDE的瀏覽器中,能夠根據文法格式,使用不同的顏色顯示代碼;原始碼瀏覽器,它儲存了在源碼中定義的所有符號,能夠使使用者在源碼中快速方便的跳轉;尋找和替換功能,使用者可以在多個檔案中,利用字串萬用字元,進行字串的搜尋和替換;檔案比較功能,可以使使用者比較路徑中的不同文字檔的內容。ADS的CodeWarrior
IDE是基於Metrowerks CodeWarrior IDE 4.2版本的。它經過適當的裁剪以支援ADS工具鏈。針對ARM的配置面板為使用者提供了在CodeWarrior IDEIntegration Environment下配置各種ARM開發工具的能力,這樣使用者可以不用在命令控制台下就能夠使用在8.1.1和將在8.1.4中介紹的各種命令。以ARM為目標平台的工程建立嚮導,可以使使用者以此為基礎,快速建立ARM和Thumb工程。儘管大多數的ARM工具鏈已經整合在CodeWarrior IDE,但是仍有許多功能在該Integration Environment中沒有實現,這些功能大多數是和調試相關的,因為ARM的調試器沒有整合到CodeWarrior
IDE中。由於ARM調試器(AXD)沒有整合在CodeWarrior IDE中,這就意味著,使用者不能在CodeWarrior IDE中進行斷點調試和查看變數。對於熟悉CodeWarrior IDE的使用者會發現,有許多的功能已經從CodeWarrior IDE For ARM中移走,比如快速應用程式開發模板等。在CodeWarrior IDE For ARM中有很多的菜單或子功能表是不能使用的。下面介紹一下這些不能使用的選項。1. View菜單下不能使用的菜單選項有:Processes,Expressions,Global
Variable,Breakpoints,Registers。2. Project菜單不能使用的菜單選項:Precompile子功能表。因為ARM編譯器不支援先行編譯的標頭檔。3. Debug菜單該菜單中沒有一個子功能表是可以使用的。4. Browser菜單中不能使用的菜單選項:New Property,New Method和New Event Set。5. Help menu中不能用於ADS的菜單選項有:CodeWarrior Help,Index,Search和Online Manuals。有關CodeWarrior
IDE中一些常用菜單的使用,將在後面的舉例中具體說明的,在此,不在贅述。ADS調試器:調試器本身是一個軟體,使用者通過這個軟體使用debug agent可以對包含有調試資訊的,正在啟動並執行可執行代碼進行比如變數的查看,斷點的控制等調試操作。ADS中包含有3個調試器:AXD(ARM eXtended Debugger):ARM擴充調試器;armsd(ARM Symbolic Debugger):ARM符號調試器;與老版本相容的Windows或Unix下的ARM調試工具,ADW/ADU(Application Debugger
Windows/Unix)。下面對在調試映像檔案中所涉及到的一些術語做一個簡單的介紹。Debug target在軟體開發的最初階段,可能還沒有具體的硬體裝置。如果要測試所開發的軟體是否達到了預期的效果,這可以由軟體模擬來完成。即使調試器和要測試的軟體運行在同一台PC上,也可以把目標當作一個獨立的硬體來看待。當然,也可以搭建一個PCB板,這個板上可以包含一個或多個處理器,在這個板上可以運行和調試應用軟體。只有當通過硬體或者是軟體模擬所得到的結果達到了預期的效果,才算是完成了應用程式的編寫工作。調試器能夠發送以下指令:1.
裝載映像檔案到目標記憶體;2. 啟動或停止程式的執行;3. 顯示記憶體,寄存器或變數的值;4. 允許使用者改變儲存的變數值。Debug agentDebug agent執行調試器發出的命令動作,比如:設定斷點,從儲存空間中讀資料,把資料寫到儲存空間等。Debug agent既不是被調試的程式,也不是調試器。在ARM體系中,它有這幾種方式:Multi-ICE(Multi-processor in-circuit emulator),ARMulator和Angel。其中Multi-ICE是一個獨立的產品,是ARM公司自己的JTAG線上模擬器,不是由ADS提供的。AXD可以在Windows
和UNIX下,進行程式的調試。它為用C,C++,和組合語言編寫的原始碼提供了一個全面的Windows 和UNIX 環境。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.