ADS 1.2 簡(jiǎn)單使用(轉(zhuǎn)載)
一.ADS 1.2 簡(jiǎn)介
-------------------------------------------------------
ARM ADS 全稱(chēng)為 ARM Developer Suite 。是 ARM 公司推出集成開(kāi)發(fā)工具,F(xiàn)在新版本已經(jīng)改名為RealView Developer Suite.簡(jiǎn)稱(chēng)RVDS .RVDS 2.2 就是MDK. 現(xiàn)在RVDS 4.0 采用Eclipse使用集成開(kāi)發(fā)環(huán)境。
但是ADS 1.2 仍然是很多開(kāi)發(fā)人員喜歡用的裸機(jī)開(kāi)發(fā)工具,因?yàn)榘惭b后體積小,操作簡(jiǎn)單,因此還是很多人在用。
ADS的定位是是針對(duì)ARM的專(zhuān)用開(kāi)發(fā)工具.與gcc以及使用gcc的IDE工具的定位有所不同.ADS只能使用自帶的標(biāo)準(zhǔn)C庫(kù)/C++庫(kù)來(lái)進(jìn)行開(kāi)發(fā).不能象GCC支持操作系統(tǒng)庫(kù).
ADS合適開(kāi)發(fā)和調(diào)試如下項(xiàng)目– 無(wú)操作系統(tǒng)的C程序.這個(gè)相當(dāng)把ARM作為一個(gè)32單片機(jī)來(lái)使用.– 底層程序.如bootloader– 能直接調(diào)試簡(jiǎn)單的操作系統(tǒng),如uC-OS-II,ucLinux,Nuclues– 驅(qū)動(dòng)程序和硬件的驗(yàn)證– 比如LCD屏的調(diào)試,往往先從ADS程序開(kāi)始測(cè)試,一個(gè)新的ARM硬件被調(diào)試好往往也先用ADS去測(cè)試
因此ADS與gcc的應(yīng)用領(lǐng)域是有所差別的,ADS主要集中比較底層的程序.由于ADS能直接用C來(lái)控制硬件,也廣泛用驅(qū)動(dòng)的驗(yàn)證,硬件功能演示等作用.
在實(shí)際應(yīng)用開(kāi)發(fā)中,市面上最流行的手機(jī)方案是MTK,展訊的方案.他們的操作系統(tǒng)是一個(gè)嵌入式操作系統(tǒng)Nuclues,CPU的內(nèi)核采用ARM.
因此,MTK方案的驅(qū)動(dòng)和內(nèi)核開(kāi)發(fā)環(huán)境就是ADS+Nuclues的庫(kù)為主.同時(shí)也用于應(yīng)用程序開(kāi)發(fā),但是他們手機(jī)界面程序(MMI)也能通VC++加模擬器的方法來(lái)調(diào)試.
完整的ADS環(huán)境由命令行開(kāi)發(fā)工具, ARM 實(shí)時(shí)庫(kù), GUI 開(kāi)發(fā)環(huán)境 (Code Warrior 和 AXD) ,實(shí)用程序和支持軟件組成。 有了這些部件,用戶(hù)就可以為 ARM 系列的 RISC 處理器編寫(xiě)和調(diào)試自己的開(kāi)發(fā)應(yīng)用程序了。
二.ADS開(kāi)發(fā)流程
--------------------------------------------------------------------------
ADS最后鏈接出來(lái)的是可執(zhí)行文件是AXF,它實(shí)際上是一個(gè)ELF的格式。因此ADS鏈接出來(lái)的程序跟LINUX的應(yīng)用程序結(jié)構(gòu)差不多,只在一些細(xì)微的段上有差別.
AXF文件可以直接用ADS的調(diào)試器AXD進(jìn)行在線(xiàn)調(diào)試,(在線(xiàn)的意思即不斷電情況下,直接從PC下載,調(diào)式,運(yùn)行)。
如果想燒錄到開(kāi)發(fā)板上,需要轉(zhuǎn)換成原始的bin文件。才能直接運(yùn)行。相對(duì)于ELF它有兩個(gè)變化。第一BIN只有基本的text/bss/data段,沒(méi)有調(diào)試信息。第二。因?yàn)閎in要下載到設(shè)備的。里面各段的地址是按相應(yīng)地址對(duì)齊燒錄的。因?yàn)閮啥沃g很可能補(bǔ)一些空間的0空間。
ADS命令行工具有
armcc.exe ARM C編譯器
armasm.exe ARM 匯編編譯器
armcpp.exe ARM C++編譯器
armlink.exe ARM 鏈接接器把上述編譯目標(biāo)文件鏈接成成AXF
armar.exe ARM 靜態(tài)庫(kù)制作工具,類(lèi)似于
fromElf.exe 把AXF 轉(zhuǎn)換成bin格式。
ADS的IDE實(shí)際上也是調(diào)用這一些工具來(lái)編譯程序。如果你愿意,可以寫(xiě)腳本直接調(diào)用命令行工具來(lái)編譯。象MTK就是這樣做的,它們寫(xiě)了一個(gè)Makefile腳本來(lái)直接調(diào)用編譯器來(lái)編譯器---因?yàn)檫@個(gè)項(xiàng)目文件太多了。。
AXF分區(qū)命名
一般的C程序?qū)τ诔绦蚍謪^(qū),一般采用TEXT/BSS/DATA這樣的分區(qū).Gcc 的編譯程序文件成功后,最后都會(huì)生一個(gè).out或ELF格式的可執(zhí)行文件,這個(gè)文件通常都包含三個(gè)段.text,.data和.bss段,運(yùn)行時(shí),會(huì)在進(jìn)程空間會(huì)生成.text,.data.bss和stack,heap五個(gè)區(qū).
AXF對(duì)于不同程序的分區(qū)采用另外命名.跟GCC程序?qū)?yīng),ADS編寫(xiě)的程序也有兩種狀態(tài),一個(gè)保存狀態(tài).對(duì)于ELF可執(zhí)行文件,一種是運(yùn)行態(tài),對(duì)應(yīng)進(jìn)程空間分區(qū).
RO段:ReadOnly段的意思,可執(zhí)行文件段,相當(dāng)于GCC的text和rodata段
RW段:ReadWrite段,數(shù)據(jù)段,相當(dāng)于GCC中的Data段
ZI段,ZeroInit段,未初始化數(shù)據(jù)段,相當(dāng)于GCC中的BSS段,而且ZI是RW的一部分。
對(duì)于裸機(jī)程序,一般在鏈接時(shí)要指定 --ro-base,即RO段的起始地址,一般它就是程序最開(kāi)始段。
因?yàn)镽O段包含數(shù)據(jù)和代碼,所以RO BASE不一定等于可執(zhí)行程序的入口.有時(shí)ADS里通常還要手工指定 Image Entry Point,它即可以等于或大于RO BASE的地址
在ADS程序運(yùn)行中,可以用幾個(gè)特殊的變量把RO,RW和ZI段的地址打印出來(lái).
以下均是 unsigned char * 類(lèi)型,在用打印時(shí)需要強(qiáng)制轉(zhuǎn)入成16進(jìn)制的地址顯示(即用%x)
l Image$$RO$$Base 表示RO段起始地址
l Image$$RO$$Limit 表示RO段結(jié)束地址
l Image$$RW$$Base表示RW段起始地址
l Image$$RW$$Limit 表示RW段結(jié)束地址
l Image$$ZI$$Base表示ZI段起始地址
l Image$$ZI$$Limit 表示ZI段結(jié)束地址
Uart_Printf("\r\n<***********************************************>\r\n"); Uart_Printf(" S3C6410 Test Program VER1.0\r\n"); Uart_Printf(" Build time is: %s %s\r\n", __DATE__ , __TIME__ ); Uart_SendString(" Mini6410 Andrew Huang \r\n"); Uart_Printf( " Image$$RO$$Base = 0x%x\r\n", Image$$RO$$Base ); Uart_Printf( " Image$$RO$$Limit = 0x%x\r\n", Image$$RO$$Limit ); Uart_Printf( " Image$$RW$$Base = 0x%x\r\n", Image$$RW$$Base ); Uart_Printf( " Image$$RW$$Limit = 0x%x\r\n", Image$$RW$$Limit ); Uart_Printf( " Image$$ZI$$Base = 0x%x\r\n", Image$$ZI$$Base ); Uart_Printf( " Image$$ZI$$Limit = 0x%x\r\n", Image$$ZI$$Limit ); Uart_Printf("<***********************************************>\r\n"); |
復(fù)雜的分區(qū)
簡(jiǎn)單的AXF的分區(qū),認(rèn)為程序只有一個(gè)RO段,一個(gè)RW段。但是在嵌入式程序,很多程序需要更為復(fù)雜的分區(qū),可能有好幾個(gè)RO分不在同地址。在GCC中,非常規(guī)的分段需要ld調(diào)用lds腳本來(lái)設(shè)定,在ADS中,需要調(diào)用scatter描述文件來(lái)設(shè)置.
以下就是6410 test的scatter描述文件內(nèi)容
可以看到除了傳統(tǒng)的RO,RW外,它還增加了IRAM和ITCM段.
DRAM 0x50200000 { CODE 0x50200000 { startup.o (Init,+FIRST) scatter_load.o (+RO) * (+RO) * (+RW, +ZI) } IRAM 0x0c000400 0xc00 ;0x0c000000~0x0c0003ff : Exception vector area(Nand Booting) { ;dmc.o (+RO) ;dmc.o (+RW, +ZI) ; all remaining data } ITCM 0x80000000 0x4000 { ; dmc.o (+RO) dmc_library.o (+RO) } DTCM 0x80004000 0x4000 { ; dmc.o (+RW, +ZI) dmc_library.o (+RW, +ZI) } } |
三.ADS快速使用手冊(cè)
------------------------------------------------------------
一個(gè)IDE集成開(kāi)發(fā)環(huán)境最重要的操作無(wú)非如下向個(gè)幾操作
1.新建一個(gè)項(xiàng)目
2.向項(xiàng)目增加源碼
3.切換輸出結(jié)果
4.配置項(xiàng)目屬性
5.構(gòu)造程序
6.清除編譯結(jié)果(make clean)
7.運(yùn)行.
8.調(diào)試.
下面我們來(lái)看下如何做如下操作,請(qǐng)初學(xué)者熟記幾個(gè)操作.
1.新建一個(gè)項(xiàng)目
主菜單 File->New,里面選擇ARM Executealbe Image,表示要?jiǎng)?chuàng)建一個(gè)axf項(xiàng)目
我們?cè)谶@里選擇ARM Executable Image,在“Project name:”中輸入工程文件名,本為“myled”,點(diǎn)擊“Location:”文本 Set”按鈕,瀏覽選擇想要保存該工程的路徑(本例為“D:\work”),將這些設(shè)置好之后,點(diǎn)擊“ ,即可創(chuàng)建一個(gè)新的名為 myled的工程。
注意ADS對(duì)中文支持非常不好,強(qiáng)烈建議不在放在中文路徑下面
ADS的項(xiàng)目文件是 mcp.創(chuàng)建成功后會(huì)出現(xiàn)空項(xiàng)目窗口
2.向項(xiàng)目增加源碼
把源碼拷入項(xiàng)目目當(dāng),在項(xiàng)目窗按右鍵,選擇增加文件
3.切換構(gòu)造輸出選項(xiàng)
ADS與一般開(kāi)發(fā)環(huán)境不一樣的,ADS的項(xiàng)目除了有Debug和Release輸出兩個(gè)選項(xiàng)之外,還多出了一DebugRel選項(xiàng),它與Debug的區(qū)別在,DebugRel只有一個(gè)基本的調(diào)試信息,體積小一點(diǎn),一般我們?cè)诰(xiàn)調(diào)試選擇DebugRel的構(gòu)造結(jié)果來(lái)調(diào)試
切換的方法在項(xiàng)目窗口,右邊的下拉列表選擇相應(yīng)輸出選項(xiàng).
– DebugRel:使用該目標(biāo)選項(xiàng),在生成目標(biāo)的時(shí)候,會(huì)為每一個(gè)源文件生成調(diào)試信息。
– Debug:使用該目標(biāo)選項(xiàng),在生成目標(biāo)的時(shí)候,會(huì)為每一個(gè)源代碼生成最完整的調(diào)試信息。
– Release:使用該目標(biāo)選項(xiàng),在生成目標(biāo)的時(shí)候,不會(huì)生成任何調(diào)試信息。
4.配置項(xiàng)目屬性
一般缺省項(xiàng)目是不能直接來(lái)編譯的,往往需要對(duì)生成的目標(biāo)進(jìn)行配置,點(diǎn)擊主菜單Edit 菜單,選擇“DebugRelSetting…”(注意:這個(gè)選項(xiàng)會(huì)因?yàn)橛脩?hù)選擇的不同目標(biāo)而有所不同), 或者選擇項(xiàng)目窗口的配置按鈕,出現(xiàn)如圖所示的設(shè)置窗口。
基中關(guān)鍵幾個(gè)配置有
1.ARM Assembler 的編譯選項(xiàng) 這里要選擇匯編編譯的指令集。不同CPU要選對(duì)類(lèi)型,如S3C2440要選ARM920T.ADS 1.2不支持S3C6410的ARM1172JZF-S的內(nèi)核,可以昨時(shí)用ARM920T或ARM112020E來(lái)代替
還有字節(jié)序選擇小端字節(jié)序.
同理道理,如果你的項(xiàng)目包含C或C++的源碼,必須要配置ARM C Compiler選項(xiàng)/ARM C++ Compiler選項(xiàng).
2.ARM 鏈接選項(xiàng)
這里L(fēng)inkType項(xiàng)目,如果Simple類(lèi)型(即標(biāo)準(zhǔn)只有一個(gè)RO,一個(gè)RW類(lèi)型),則需要配置RO_BASE即默認(rèn)的代碼段地址。RW段地址不填表示緊密排在RO段后面。
另外程序的入口地址可以單獨(dú)配置,不寫(xiě)表示與RO Base地址一致,
如果可以自己初始化啟動(dòng)的程序,一般最好指定是哪一個(gè)S中的哪一個(gè)段是作為入口。在layout頁(yè)標(biāo)簽里
如果選擇scatter 輸出類(lèi)型,必須要還選擇相應(yīng)的scatter文件路徑。
3.輸出 bin文件格式
這要做兩步設(shè)置.首先設(shè)置Target Settings中的Post-linker為ARM FromElf
然后在 ARM fromElf再設(shè)相應(yīng)的文件名
5.構(gòu)造程序
選擇項(xiàng)目窗口的Make,或工具條上Make按鍵
6.清除編譯結(jié)果(make clean)
選擇主菜單的project-->Remove Object Code.或用快捷鍵 Ctrl->-.
強(qiáng)出對(duì)話(huà)框,選擇All Targets
7.8運(yùn)行和調(diào)試高度依賴(lài)于具體的調(diào)試器
具體請(qǐng)看我的博文:
Windows下 基于ADS+J-Link 的ARM開(kāi)發(fā)環(huán)境搭建
用U-boot進(jìn)行裸機(jī)開(kāi)發(fā)