天天看點

ADS1.2應用調試技巧

ARM ADS 全稱為 ARM Developer Suite 。是 ARM 公司推出的新一代 ARM 內建開發工具。現在 ADS 的最新版本是 1.2 ,它取代了早期的 ADS1.1 和 ADS1.0 。它除了可以安裝在 Windows NT4 ,Windows 2000 , Windows 98 和 Windows 95 作業系統下,還支援 Windows XP 和 Windows Me 作業系統。

ADS 由指令行開發工具, ARM 時實庫, GUI 開發環境 (Code Warrior 和 AXD) ,實用程式和支援軟體組成。 有了這些部件,使用者就可以為 ARM 系列的 RISC 處理器編寫和調試自己的開發應用程式了。

下面就詳細介紹一下 ADS 的各個組成部分。

指令行開發工具

這些工具完成将源代碼編譯,連結成可執行代碼的功能。

ADS 提供下面的指令行開發工具:

armcc

armcc 是 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<symbol> :定義預處理宏,相當于在源程式開頭使用了宏定義語句 #define symbol ,這裡 symbol 預設為 1 ;

-E :僅僅是對 C 源代碼進行預處理就停止;

-g<options> :指定是否在生成的目标檔案中包含調試資訊表;

-I<directory> :将 directory 所指的路徑添加到 #include 的搜尋路徑清單中去; -J<directory> :用directory 所指的路徑代替預設的對 #include 的搜尋路徑;

-o<file> :指定編譯器最終生成的輸出檔案名。

-O0 :不優化;

-O1 :這是控制代碼優化的編譯選項,大寫字母 O 後面跟的數字不同,表示的優化級别就不同, -O1 關閉了影響調試結果的優化功能;

-O2 :該優化級别提供了最大的優化功能;

-S :對源程式進行預處理和編譯,自動生成彙編檔案而不是目标檔案;

-U<symbol> :取消預處理宏名,相當于在源檔案開頭,使用語句 #undef symbol;

-W<options> :關閉所有的或被選擇的警告資訊;

有關更詳細的選項說明,讀者可檢視 ADS 軟體的線上幫助檔案。

armcpp

armcpp 是 ARM C++ 編譯器。它将 ISO C++ 或 EC++ 編譯成 32 位 ARM 指令代碼。

tcc

tcc 是 Thumb C 編譯器。該編譯器通過了 Plum Hall C Validation Suite 為 ANSI 一緻性的測試。

tcc 将 ANSI C 源代碼編譯成 16 位的 Thumb 指令代碼。

tcpp

tcpp 是 Thumb C++ 編譯器。 它将 ISO C++ 和 EC++ 源碼編譯成 16 位 Thumb 指令代碼。

armasm

armasm 是 ARM 和 Thumb 的彙編器 . 它對用 ARM 彙編語言和 Thumb 彙編語言寫的源代碼進

行彙編。

armlink

armlink 是 ARM 連接配接器。該指令既可以将編譯得到的一個或多個目标檔案和相關的一個或多個庫檔案進行連結,生成一個可執行檔案,也可以将多個目标檔案部分連結成一個目标檔案,以供進一步的連結。 ARM 連結器生成的是 ELF 格式的可執行映像檔案。

armsd

armsd 是 ARM 和 Thumb 的符号調試器。它能夠進行源碼級的程式調試。使用者可以在用 C 或彙編語言寫的代碼中進行單步調試,設定斷點,檢視變量值和記憶體單元的内容。

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 IDE 內建環境下配置各種 ARM 開發工具的能力,這樣使用者可以不用在指令控制台下就能夠使用在 8.1.1 和将在 8.1.4 中介紹的各種指令。

以 ARM 為目标平台的工程建立向導,可以使使用者以此為基礎,快速建立 ARM 和 Thumb 工程。

盡管大多數的 ARM 工具鍊已經內建在 CodeWarrior IDE ,但是仍有許多功能在該內建環境中沒有實作,這些功能大多數是和調試相關的,因為 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 中一些常用菜單的使用,将在後面的舉例中具體說明的,在此,不在贅述。

8.1.3.2 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 agent

Debug 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 環境。

8.1.4 實用程式

ADS 提供以下的實用工具來配合前面介紹的指令行開發工具的使用

fromELF

這是 ARM 映像檔案轉換工具。該指令将 ELF 格式的檔案作為輸入檔案,将該格式轉換為各種輸出格式的檔案,包括 plain binary(BIN 格式映像檔案 ), Motorola 32-bit S-record format(Motorola 32位 S 格式映像檔案 ), Intel Hex 32 format(Intel 32 位格式映像檔案 ) ,和 Verilog-like hex format(Verilog 16 進制檔案 ) 。 FromELF 指令也能夠為輸入映像檔案産生文本資訊,例如代碼和資料長度。

armar

ARM 庫函數生成器将一系列 ELF 格式的目标檔案以庫函數的形式集合在一起,使用者可以把一個庫傳遞給一個連結器以代替幾個 ELF 檔案。

Flash downloader

用于把二進制映像檔案下載下傳到 ARM 開發闆上的 Flash 存儲器的工具

8.1.5 支援的軟體

ADS 為使用者提供下面的軟體,使使用者可以在軟體仿真的環境下或者在基于 ARM 的硬體環境調試使用者應用程式。

ARMulator

這是一個 ARM 指令集仿真器,內建在 ARM 的調試器 AXD 中,它提供對 ARM 處理器的指令集的仿真,為 ARM 和 Thumb 提供精确的模拟。使用者可以在硬體尚未做好的情況下,開發程式代碼。