




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章嵌入式系統(tǒng)開發(fā)8.1引言
8.2嵌入式系統(tǒng)的開發(fā)工具
8.3嵌入式系統(tǒng)的調(diào)試方法
8.4其他實(shí)用工具
思考與練習(xí)題
8.1引言
由于嵌入式系統(tǒng)是一個(gè)受資源限制的系統(tǒng),因此直接在嵌入式系統(tǒng)硬件上進(jìn)行編程開發(fā)顯然是不合理的。在嵌入式系統(tǒng)的開發(fā)過(guò)程中,一般采用的方法是:首先在通用PC機(jī)上的集成開發(fā)環(huán)境中編程;然后通過(guò)交叉編譯和鏈接,將程序轉(zhuǎn)換成目標(biāo)平臺(tái)(嵌入式系統(tǒng))可以運(yùn)行的二進(jìn)制代碼;接著通過(guò)嵌入式調(diào)試系統(tǒng)調(diào)試正確;最后將程序下載到目標(biāo)平臺(tái)上運(yùn)行。
因此,選擇合適的開發(fā)工具和調(diào)試工具,對(duì)整個(gè)嵌入式系統(tǒng)的開發(fā)都非常重要。本章在8.2節(jié)著重講述嵌入式系統(tǒng)的開發(fā)工具,內(nèi)容包括開發(fā)工具概述、ADS簡(jiǎn)介、使用ADS創(chuàng)建工程、使用AXD調(diào)試代碼;在8.3節(jié)具體介紹嵌入式系統(tǒng)的調(diào)試方法,包括嵌入式系統(tǒng)調(diào)試簡(jiǎn)介、ARM調(diào)試系統(tǒng)概述、基于Angel的調(diào)試系統(tǒng)和基于JTAG的調(diào)試系統(tǒng);最后在8.4節(jié)介紹幾種其他實(shí)用工具,包括SourceInsight和SkyEye。 8.2嵌入式系統(tǒng)的開發(fā)工具
8.2.1開發(fā)工具概述
當(dāng)進(jìn)行嵌入式系統(tǒng)開發(fā)時(shí),選擇合適的開發(fā)工具可以加快開發(fā)進(jìn)度、降低開發(fā)成本。因此,一套含有編輯軟件、編譯軟件、匯編軟件、連接軟件、調(diào)試軟件、工程管理以及函數(shù)庫(kù)的集成開發(fā)環(huán)境(IntegratedDebuggerEnvironment,IDE)是必不可少的,至于嵌入式實(shí)時(shí)操作系統(tǒng)、評(píng)估板等其他開發(fā)工具,則可以根據(jù)應(yīng)用軟件規(guī)模和開發(fā)計(jì)劃選用。
目前比較常見的嵌入式系統(tǒng)開發(fā)工具包括ARMSDT、ARMADS、Green
Hills
Tools等。8.2.2ARMADS簡(jiǎn)介
ARMADS(ARMDeveloperSuite)是ARM公司提供的專門用于ARM相關(guān)的應(yīng)用開發(fā)和調(diào)試的綜合性軟件工具?,F(xiàn)在ADS的最新版本是ADS1.2,取代了早期的ADS1.1和ADS1.0,在功能和易用性上較SDT都有提高,是一款功能強(qiáng)大又易于使用的開發(fā)工具。它除了可以安裝在WindowsNT4、Windows2000、Windows98和Windows95操作系統(tǒng)下,還支持WindowsXP和WindowsMe操作系統(tǒng)。
ADS包括了一系列的應(yīng)用,并有相關(guān)的文檔和實(shí)例的支持。使用者可以用它來(lái)編寫和調(diào)試各種基于ARM系列處理器的應(yīng)用,可以用于開發(fā)、編譯、調(diào)試各種采用C、C++和ARM匯編語(yǔ)言編寫的程序。
1.命令行開發(fā)工具
這些工具完成將源代碼編譯、鏈接成可執(zhí)行代碼的功能。ADS提供以下命令行開發(fā)工具:
(1)?armcc。armcc是ARMC編譯器。
(2)?armcpp。armcpp是ARMC++編譯器。
(3)?tcc。tcc是ThumbC編譯器。
(4)?tcpp。tcpp是ThumbC++?編譯器。
(5)?armasm。armasm是ARM和Thumb的匯編器。
(6)?armlink。armlink是ARM鏈接器。
(7)?armsd。armsd是ARM和Thumb的符號(hào)調(diào)試器。
2.ARM運(yùn)行時(shí)庫(kù)
1)運(yùn)行時(shí)庫(kù)的類型和建立選項(xiàng)
ADS提供兩種運(yùn)行時(shí)庫(kù)來(lái)支持被編譯的C和C++?代碼。
(1)?ANSIC庫(kù)函數(shù)。這個(gè)C函數(shù)庫(kù)是由以下幾部分組成:
①在ISOC標(biāo)準(zhǔn)中定義的函數(shù)。
②在semihosted環(huán)境下(semihosting是針對(duì)ARM目標(biāo)機(jī)的一種機(jī)制,它能夠根據(jù)應(yīng)用程序代碼的輸入/輸出請(qǐng)求,與運(yùn)行有調(diào)試功能的主機(jī)通信。這種技術(shù)允許主機(jī)為通常沒有輸入和輸出功能的目標(biāo)硬件提供主機(jī)資源)用來(lái)實(shí)現(xiàn)C庫(kù)函數(shù)的與目標(biāo)相關(guān)的函數(shù)。
③被C和C++?編譯器所調(diào)用的支持函數(shù)。ARMC庫(kù)提供了額外的一些部件支持C++,并為不同的結(jié)構(gòu)體系和處理器編譯代碼。
(2)?C++?庫(kù)函數(shù)。C++?庫(kù)函數(shù)包含由ISOC++?庫(kù)標(biāo)準(zhǔn)定義的函數(shù)。C++?庫(kù)依賴于相應(yīng)的C庫(kù)來(lái)實(shí)現(xiàn)與特定目標(biāo)相關(guān)的部分,在C++?庫(kù)的內(nèi)部本身是不包含與目標(biāo)相關(guān)的部分的。這個(gè)庫(kù)是由以下幾部分組成的:
①版本為2.01的RogueWaveStandardC++?庫(kù)。
②C++?編譯器使用的支持函數(shù)。
③RogueWave庫(kù)所不支持的其他的C++?函數(shù)。在建立自己的應(yīng)用程序的時(shí)候,用戶必須指定一些最基本的操作選項(xiàng),如
●字節(jié)順序:是大端模式,還是小端模式;
●浮點(diǎn)支持:可能是FPA、VFP、軟件浮點(diǎn)處理或不支持浮點(diǎn)運(yùn)算;
●堆棧限制:是否檢查堆棧溢出;
●位置無(wú)關(guān)(PID):數(shù)據(jù)是從與位置無(wú)關(guān)的代碼還是從與位置相關(guān)的代碼中讀/寫,代碼是位置無(wú)關(guān)的只讀代碼還是位置相關(guān)的的只讀代碼。
2)庫(kù)路徑結(jié)構(gòu)
庫(kù)路徑是在ADS軟件安裝路徑的lib目錄下的兩個(gè)子目錄。例如,若ADS軟件安裝在d:\arm\adsv1_2目錄,則在d:\arm\adsv1_2\lib目錄下的兩個(gè)子目錄armlib和cpplib是ARM的庫(kù)所在的路徑。
(1)?armlib。這個(gè)子目錄包含了ARMC庫(kù)、浮點(diǎn)代數(shù)運(yùn)算庫(kù)、數(shù)學(xué)庫(kù)等各類庫(kù)函數(shù)。與這些庫(kù)相應(yīng)的頭文件在d:\arm\adsv1_2\include目錄中。
(2)?cpplib。這個(gè)子目錄包含了RogueWaveC++?庫(kù)和C++?支持函數(shù)庫(kù)。RogueWaveC++庫(kù)和C++?支持函數(shù)庫(kù)合在一起被稱為ARMC++?庫(kù)。與這些庫(kù)相應(yīng)的頭文件安裝在d:\arm\adsv1_2\include目錄下。這里需要讓讀者特別注意以下幾點(diǎn):
(1)?ARMC庫(kù)函數(shù)是以二進(jìn)制格式提供的。
(2)?ARM庫(kù)函數(shù)禁止修改。如果要對(duì)庫(kù)函數(shù)創(chuàng)建新的實(shí)現(xiàn),則可以把這個(gè)新的函數(shù)編譯成目標(biāo)文件,然后在鏈接的時(shí)候把它包含進(jìn)來(lái)。這樣在鏈接的時(shí)候,使用的是新的函數(shù)實(shí)現(xiàn)而不是原來(lái)的庫(kù)函數(shù)。
(3)通常情況下,為了創(chuàng)建依賴于目標(biāo)的應(yīng)用程序,在ANSIC庫(kù)中只有很少的幾個(gè)函數(shù)需要重建。
(4)?RogueWaveStandardC++?函數(shù)庫(kù)的源代碼不是免費(fèi)發(fā)布的,可以從RogueWaveSoftwareInc.或ARM公司通過(guò)支付許可證費(fèi)用來(lái)獲得源文件。
3.CodeWarrior集成開發(fā)環(huán)境
CodeWarriorforARM是一套完整的集成開發(fā)工具,充分發(fā)揮了ARMRISC的優(yōu)勢(shì),使產(chǎn)品開發(fā)人員能夠很好地應(yīng)用尖端的片上系統(tǒng)技術(shù)。該工具是專為基于ARMRISC的處理器而設(shè)計(jì)的,它可加速并簡(jiǎn)化嵌入式開發(fā)過(guò)程中的每一個(gè)環(huán)節(jié),使得開發(fā)人員只需通過(guò)一個(gè)集成軟件開發(fā)環(huán)境就能研制出ARM產(chǎn)品。在整個(gè)開發(fā)周期中,開發(fā)人員無(wú)需離開CodeWarrior開發(fā)環(huán)境,因此節(jié)省了在操作工具上花的時(shí)間,使得開發(fā)人員有更多的精力投入到代碼編寫上。
ADS的CodeWarrior集成開發(fā)環(huán)境(IDE)是基于MetrowerksCodeWarriorIDE4.2版本的,它經(jīng)過(guò)適當(dāng)?shù)牟眉艉罂梢灾С諥DS工具鏈。CodeWarriorIDE為管理和開發(fā)項(xiàng)目提供了簡(jiǎn)單、多樣化的圖形用戶界面。用戶可以使用它為ARM和Thumb處理器開發(fā)用C、C++或ARM匯編語(yǔ)言編寫的程序代碼。通過(guò)提供下面的功能,CodeWarriorIDE縮短了用戶開發(fā)項(xiàng)目代碼的周期:
(1)全面的項(xiàng)目管理功能。
(2)子函數(shù)的代碼導(dǎo)航功能,使得用戶迅速找到程序中的子函數(shù)。在CodeWarriorIDE中所涉及到的target有兩種不同的語(yǔ)義:
(1)目標(biāo)系統(tǒng)(Targetsystem):是特指代碼要運(yùn)行的環(huán)境,是基于ARM的硬件。例如,若要為ARM開發(fā)板編寫要運(yùn)行在它上面的程序,則這個(gè)開發(fā)板就是目標(biāo)系統(tǒng)。
(2)生成目標(biāo)(Buildtarget):是指用于生成特定的目標(biāo)文件的選項(xiàng)設(shè)置(包括匯編選項(xiàng)、編譯選項(xiàng)、鏈接選項(xiàng)以及鏈接后的處理選項(xiàng))和所用的文件的集合。
CodeWarriorIDE為用戶提供下面的功能:
(1)源代碼編輯器。它集成在CodeWarriorIDE的瀏覽器中,能夠根據(jù)語(yǔ)法格式,使用不同的顏色顯示代碼。
(2)源代碼瀏覽器。它保存了在源碼中定義的所有符號(hào),能夠使用戶在源碼中快速方便地跳轉(zhuǎn)。
(3)查找和替換功能。用戶可以在多個(gè)文件中,利用字符串通配符,進(jìn)行字符串的搜索和替換。
(4)文件比較功能??梢允褂脩舯容^路徑中的不同文本文件的內(nèi)容。
4.實(shí)用程序
ADS提供以下實(shí)用工具來(lái)配合前面介紹的命令行開發(fā)工具的使用:
(1)?fromELF。這是ARM映像文件轉(zhuǎn)換工具。
(2)?armar。ARM庫(kù)函數(shù)生成器將一系列ELF格式的目標(biāo)文件以庫(kù)函數(shù)的形式集合在一起,用戶可以把一個(gè)庫(kù)傳遞給一個(gè)鏈接器以代替幾個(gè)ELF文件。
(3)?Flashdownloader。這個(gè)工具用于把二進(jìn)制映像文件下載到ARM開發(fā)板上的FlashMemory的工具。
5.支持的軟件
ADS為用戶提供軟件ARMulator,?使用戶可以在軟件仿真的環(huán)境下或者在基于ARM的硬件環(huán)境下調(diào)試用戶應(yīng)用程序。
ARMulator是一個(gè)ARM指令集仿真器,集成在ARM的調(diào)試器AXD中,它提供對(duì)ARM處理器的指令集的仿真,為ARM和Thumb提供精確的模擬。用戶可以在硬件尚未做好的情況下開發(fā)程序代碼。8.2.3使用ADS創(chuàng)建工程
1.建立一個(gè)工程
建立一個(gè)新工程的方法如下:
(1)在CodeWarrior中新建一個(gè)工程的方法有兩種:可以在工具欄中單擊New按鈕,也可以在File菜單中選擇New菜單。這樣就會(huì)打開一個(gè)如圖8-1所示的New對(duì)話框。該對(duì)話框包括3個(gè)標(biāo)簽頁(yè),即Project、File和Object。圖8-1新建工程對(duì)話框
(2)在New對(duì)話框中單擊選擇Project標(biāo)簽頁(yè),在該標(biāo)簽頁(yè)中為用戶提供了以下7種可選擇的工程項(xiàng)目模板:
①ARMExecutableImage:?用于由ARM指令的代碼生成一個(gè)ELF格式的可執(zhí)行映像文件。
②ARMObjectLibrary:用于由ARM指令的代碼生成一個(gè)armar格式的目標(biāo)文件庫(kù)。
③EmptyProject:用于創(chuàng)建一個(gè)不包含任何庫(kù)文件或源文件的工程。
④MakefileImporterWizard:用于將VisualC的nmake或GNUmake文件轉(zhuǎn)換成CodeWarriorIDE工程文件。⑤ThumbARMExecutableImage:用于由ARM指令和Thumb指令的混和代碼生成一個(gè)可執(zhí)行的ELF格式的映像文件。
⑥ThumbExecutableImage:用于由Thumb指令創(chuàng)建一個(gè)可執(zhí)行的ELF格式的映像文件。
⑦ThumbObjectLibrary:用于由Thumb指令的代碼生成一個(gè)armar格式的目標(biāo)文件庫(kù)。在這里選擇ARMExecutableImage,用于由ARM指令的代碼生成一個(gè)可執(zhí)行的ELF格式的映像文件。
(3)在Projectname文本框中輸入工程文件名稱,本例為“l(fā)edcircle”。
(4)點(diǎn)擊Location文本框的Set按鈕,瀏覽選擇想要將該工程保存的路徑。
(5)將這些設(shè)置好后,點(diǎn)擊“確定”,即可建立一個(gè)新的名為ledcircle的工程。此時(shí)會(huì)出現(xiàn)ledcircle.mcp的窗口,有三個(gè)標(biāo)簽頁(yè),分別為files、linkorder和target,默認(rèn)的是顯示第一個(gè)標(biāo)簽頁(yè)files,如圖8-2所示。圖8-2新建工程打開窗口在“File”菜單中選擇“New”,在打開的如圖8-1所示的對(duì)話框中,選擇標(biāo)簽頁(yè)File,在Filename中輸入要?jiǎng)?chuàng)建的文件名,輸入“Init.s”,點(diǎn)擊“確定”關(guān)閉窗口。在打開的文件編輯框中輸入文件“Init.s”的匯編源代碼并保存。用同樣的方法,再建立一個(gè)名為main.c的C源代碼文件。
現(xiàn)在需要把新建的兩個(gè)源文件添加到工程中。為工程添加源碼常用的方法有兩種:既可以使用如圖8-2所示的方法,也可以在“Project”菜單項(xiàng)中選擇“AddFiles”。這兩種方法都會(huì)打開文件瀏覽框,用戶可以把已經(jīng)存在的文件添加到工程中。當(dāng)選中要添加的文件時(shí),會(huì)出現(xiàn)一個(gè)對(duì)話框,如圖8-3所示,詢問用戶把文件添加到何類目標(biāo)中。這里選擇DebugRel目標(biāo),把創(chuàng)建的兩個(gè)文件添加到工程中。這樣就建立了一個(gè)完整的工程。圖8-3選擇添加文件到指定目標(biāo)
2.編譯和鏈接工程
在ADS中通過(guò)DebugSettings對(duì)話框設(shè)置一個(gè)工程中的各生成目標(biāo)的生成選項(xiàng)。在TargetSettings窗口中設(shè)置的各生成選項(xiàng)只適用于當(dāng)前的生成目標(biāo)。例如,當(dāng)使用ADS中的可執(zhí)行映像文件工程項(xiàng)目時(shí),新工程中通常包括以下三個(gè)生成目標(biāo):
●?DebugRel:使用該目標(biāo),在生成目標(biāo)的時(shí)候,會(huì)為每一個(gè)源文件生成調(diào)試信息。
●?Debug:使用該目標(biāo)為每一個(gè)源文件生成最完整的調(diào)試信息。
●?Release:使用該目標(biāo)不會(huì)生成任何調(diào)試信息。當(dāng)當(dāng)前生成目標(biāo)是Debug時(shí),通過(guò)DebugSettings對(duì)話框設(shè)置的各種生成選項(xiàng)對(duì)于其他兩個(gè)生成目標(biāo)DebugRel及Release是無(wú)效的。
這里使用默認(rèn)的DebugRel目標(biāo)。點(diǎn)擊Edit菜單,選擇“DebugRelSettings”(注意,這個(gè)選項(xiàng)會(huì)因用戶選擇的不同目標(biāo)而有所不同),出現(xiàn)如圖8-2所示的對(duì)話框。
(1)設(shè)置TargetSettings選項(xiàng)組。TargetSettings選項(xiàng)組中的選項(xiàng)如圖8-4所示。圖8-4設(shè)置TargetSettings選項(xiàng)組
(2)設(shè)置LanguageSettings選項(xiàng)組。LanguageSettings選項(xiàng)組用于設(shè)置ADS中各語(yǔ)言處理工具的選項(xiàng),包括匯編器的選項(xiàng)和編譯器的選項(xiàng)。這些選項(xiàng)對(duì)于工程中的所有源文件都使用,不能單獨(dú)設(shè)置某一個(gè)源文件的編譯選項(xiàng)和匯編選項(xiàng)。
首先了解一下ARM匯編器,它實(shí)際就是在前面介紹的armasm。默認(rèn)的ARM體系結(jié)構(gòu)是ARM7TDMI,字節(jié)順序默認(rèn)是小端模式,對(duì)于其他設(shè)置使用默認(rèn)值即可。
而ARMC編譯器實(shí)際就是調(diào)用的命令行工具armcc。使用默認(rèn)的設(shè)置即可。
此外,在設(shè)置框的右下腳,若對(duì)某項(xiàng)設(shè)置進(jìn)行了修改,則該行中的某個(gè)選項(xiàng)會(huì)發(fā)生相應(yīng)的改動(dòng),如圖8-5所示。圖8-5命令行工具選項(xiàng)設(shè)置
(3)設(shè)置Linker。鏈接器選項(xiàng)Linker用于設(shè)置與鏈接器相關(guān)的選項(xiàng)以及與fromELF工具相關(guān)的選項(xiàng)。鼠標(biāo)選中ARMLinker,則出現(xiàn)如圖8-6所示對(duì)話框。圖8-6鏈接器設(shè)置
Output選項(xiàng)卡用來(lái)控制鏈接器進(jìn)行鏈接的操作類型。ARM鏈接器在Linktype中提供了三種鏈接方式:
①Partial:表示鏈接器只進(jìn)行部分鏈接操作。部分鏈接生成ELF格式的目標(biāo)文件,可以作為以后進(jìn)一步鏈接時(shí)的輸入文件。
②Simple:該方式是默認(rèn)的鏈接方式,也是使用最頻繁的鏈接方式。鏈接器根據(jù)選項(xiàng)中指定的地址映射方式,鏈接生成簡(jiǎn)單的ELF格式的映像文件。這時(shí)所生成的映像文件中地址映射關(guān)系比較簡(jiǎn)單,如果地址映射關(guān)系復(fù)雜,則需要使用下一種鏈接方式。
③Scattered:該方式使得鏈接器根據(jù)scatter格式文件中指定的地址映射,生成地址映射關(guān)系復(fù)雜的ELF格式的映像文件。這個(gè)選項(xiàng)一般情況下使用不太多。
(4)設(shè)置fromELF。在Linker下還有一個(gè)ARMfromELF選項(xiàng),如圖8-7所示。只有在Target設(shè)置中選擇了Post-linker,才可以使用該選項(xiàng)。圖8-7ARMfromELF可選項(xiàng)
(5)編譯鏈接。點(diǎn)擊CodeWarriorIDE的菜單Project下的make菜單,可以對(duì)工程進(jìn)行編譯和鏈接。整個(gè)編譯鏈接過(guò)程如圖8-8所示。圖8-8編譯和鏈接過(guò)程
3.使用命令行工具編譯應(yīng)用程序
有些情況下,用戶開發(fā)的工程比較簡(jiǎn)單,或者只是想用到ADS提供的各種工具而并不想在CodeWarriorIDE中進(jìn)行開發(fā)。在這種情況下,可使用一種不在CodeWarriorIDE集成開發(fā)環(huán)境下開發(fā)用戶應(yīng)用程序的方法。這種方法對(duì)于開發(fā)包含較少源代碼的工程是比較實(shí)用的。首先用戶可以用任何編輯軟件(比如UltraEdit)編寫前面提到的兩個(gè)源文件Init.s和main.c;然后可以利用makefile的知識(shí),編寫自己的makefile文件。由于ADS在安裝的時(shí)候沒有提供make命令,因此可以將要用到的make命令直接拷貝到ADS安裝路徑的bin目錄下。假如ADS安裝在目錄e:\arm\adsv1_2下,則可以將make命令拷貝到e:\arm\adsv1_2\
bin目錄下。經(jīng)過(guò)上述編譯鏈接以及鏈接后的操作,在e:\arm_xyexp\ledcircle目錄下會(huì)生成兩個(gè)新的文件:main.axf和main.bin。8.2.4使用AXD調(diào)試代碼
1.ADS調(diào)試器簡(jiǎn)介
調(diào)試器本身是一個(gè)軟件,用戶通過(guò)這個(gè)軟件使用Debugagent可以對(duì)包含有調(diào)試信息的、正在運(yùn)行的可執(zhí)行代碼進(jìn)行諸如變量查看、斷點(diǎn)控制等調(diào)試操作。
ADS中包含有3個(gè)調(diào)試器:
●?AXD(ARMeXtendedDebugger):ARM擴(kuò)展調(diào)試器。
●?armsd(ARMSymbolicDebugger):ARM符號(hào)調(diào)試器。
●與老版本兼容的Windows或Unix下的ARM調(diào)試工具:ADW/ADU(ApplicationDebuggerWindows/Unix)。下面對(duì)在調(diào)試映像文件中所涉及到的一些方法作一個(gè)簡(jiǎn)單的介紹。
(1)?Debugtarget。在軟件開發(fā)的最初階段,可能還沒有具體的硬件設(shè)備。如果要測(cè)試所開發(fā)的軟件是否達(dá)到了預(yù)期的效果,則可以由軟件仿真來(lái)完成。即使調(diào)試器和要測(cè)試的軟件運(yùn)行在同一臺(tái)PC上,也可以把目標(biāo)當(dāng)作一個(gè)獨(dú)立的硬件來(lái)看待。
當(dāng)然,也可以搭建一個(gè)PCB板,這個(gè)板上可以包含一個(gè)或多個(gè)處理器,在這個(gè)板上可以運(yùn)行和調(diào)試應(yīng)用軟件。只有當(dāng)通過(guò)硬件測(cè)試或軟件仿真所得到的結(jié)果達(dá)到了預(yù)期的效果,才算是完成了應(yīng)用程序的編寫工作。調(diào)試器能夠發(fā)送以下指令:
①裝載映像文件到目標(biāo)內(nèi)存。
②啟動(dòng)或停止程序的執(zhí)行。
③顯示內(nèi)存、寄存器或變量的值。
④允許用戶改變存儲(chǔ)的變量值。
(2)?Debugagent。Debugagent執(zhí)行調(diào)試器發(fā)出的命令動(dòng)作,如設(shè)置斷點(diǎn)、從存儲(chǔ)器中讀數(shù)據(jù)、把數(shù)據(jù)寫到存儲(chǔ)器等。Debugagent既不是被調(diào)試的程序,也不是調(diào)試器。在ARM體系中,有這樣幾種調(diào)試方式:Multi-ICE(Multi-processorin-circuitemulator),ARMulator和Angel。其中Multi-ICE是一個(gè)獨(dú)立的產(chǎn)品,是ARM公司自己的JTAG在線仿真器,不是由ADS提供的。
AXD是ADS軟件中獨(dú)立于CodeWarriorIDE的圖形軟件。打開AXD軟件,默認(rèn)打開的目標(biāo)是ARMulator,它是調(diào)試的時(shí)候最常用的一種調(diào)試工具。AXD可以在Windows和Unix下進(jìn)行程序的調(diào)試。它為用C、C++和匯編語(yǔ)言編寫的源代碼提供了一個(gè)全面的Windows和Unix環(huán)境。
2.AXD調(diào)試器的使用
要使用AXD必須首先要生成含有調(diào)試信息的程序,前面已經(jīng)生成的ledcircle.axf或main.axf就是含有調(diào)試信息的可執(zhí)行ELF格式的映像文件。
(1)在AXD中打開映像文件。在菜單File中選擇“Loadimage”選項(xiàng),打開LoadImage對(duì)話框,找到要裝載的?.axf映像文件,單擊“打開”按鈕,把映像文件裝載到目標(biāo)內(nèi)存中。在所打開的映像文件中會(huì)有一個(gè)藍(lán)色的箭頭指示當(dāng)前執(zhí)行的位置,如圖8-9所示。圖8-9在AXD中打開映像文件
(2)查看存儲(chǔ)器內(nèi)容。在程序運(yùn)行前,可以先查看變量的當(dāng)前值。方法是從ProcessorViews菜單中選擇“Memory”選項(xiàng),如圖8-10所示。在MemoryStartaddress選擇框中,用戶可以根據(jù)要查看的存儲(chǔ)器的地址輸入起始地址,在下面的表格中會(huì)列出連續(xù)的64個(gè)地址。圖8-10查看存儲(chǔ)器內(nèi)容
(3)設(shè)置斷點(diǎn)。可以在程序中設(shè)置斷點(diǎn):將光標(biāo)定位在指定語(yǔ)句處,使用快捷鍵F9在該處設(shè)置斷點(diǎn)。按F5鍵,程序?qū)⑦\(yùn)行到斷點(diǎn)處。如果讀者想查看子函數(shù)Delay是如何運(yùn)行的,則可以在Execute菜單中選擇“StepIn”選項(xiàng),或按下F8鍵,進(jìn)入到子函數(shù)內(nèi)部進(jìn)行單步程序的調(diào)試。
(4)查看變量值。如果用戶希望查看函數(shù)內(nèi)部某個(gè)變量的值,比如查看變量i的值,則可以在ProcessorViews菜單中選擇“Watch”,會(huì)出現(xiàn)如圖8-11所示的watch窗口,然后用鼠標(biāo)選中變量i,單擊鼠標(biāo)右鍵,在快捷菜單中選中“Addtowatch”,這樣變量i默認(rèn)是添加到watch窗口的Tab1中。程序運(yùn)行過(guò)程中,用戶可以看到變量i的值在不斷地變化。圖8-11查看變量變量數(shù)值默認(rèn)情況下是以十六進(jìn)制格式顯示的。如果用戶不習(xí)慣這種顯示格式,可以通過(guò)在watch窗口點(diǎn)擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“Format”選項(xiàng),如圖8-12所示,用戶可以選擇所查看的變量顯示數(shù)據(jù)的格式。圖8-12改變變量的顯示格式 8.3嵌入式系統(tǒng)的調(diào)試方法
8.3.1嵌入式系統(tǒng)調(diào)試簡(jiǎn)介
調(diào)試是嵌入式系統(tǒng)開發(fā)過(guò)程中必不可少的重要環(huán)節(jié),通用計(jì)算機(jī)應(yīng)用系統(tǒng)與嵌入式系統(tǒng)的調(diào)試環(huán)境存在明顯差異。在一般的桌面操作系統(tǒng)中,調(diào)試器和被調(diào)試的程序常常位于同一臺(tái)計(jì)算機(jī)上,操作系統(tǒng)也相同。例如,在Windows平臺(tái)上利用VisualC++語(yǔ)言等開發(fā)應(yīng)用程序,調(diào)試器進(jìn)程通過(guò)操作系統(tǒng)提供的接口來(lái)控制被調(diào)試的程序。而在嵌入式系統(tǒng)中,開發(fā)主機(jī)和目標(biāo)主機(jī)處于不同的機(jī)器中,程序在開發(fā)主機(jī)上進(jìn)行開發(fā)(如編輯、交叉編譯、鏈接定位等),然后裝載到目標(biāo)機(jī)(嵌入式系統(tǒng))進(jìn)行運(yùn)行和調(diào)試,即遠(yuǎn)程調(diào)試。這樣的方式引出了以下問題:位于不同操作系統(tǒng)(機(jī)器)之上的調(diào)試器與被調(diào)試程序之間如何通信,被調(diào)試程序如果出現(xiàn)異?,F(xiàn)象將如何告知調(diào)試器,調(diào)試器又如何控制以及訪問被調(diào)試程序等。目前,在嵌入式調(diào)試系統(tǒng)中有兩種常用的調(diào)試方式可以解決上述問題,即monitor方式和片上調(diào)試方式。
monitor方式指的是在目標(biāo)操作系統(tǒng)與調(diào)試器內(nèi)分別添加一些功能模塊,兩者互相通信來(lái)實(shí)現(xiàn)調(diào)試功能。調(diào)試器與目標(biāo)操作系統(tǒng)通過(guò)指定的通信端口并依賴遠(yuǎn)程調(diào)試協(xié)議來(lái)實(shí)現(xiàn)通信。目標(biāo)操作系統(tǒng)的所有異常處理最終都必須轉(zhuǎn)向通信模塊,通知調(diào)試器此時(shí)的異常號(hào),調(diào)試器再依據(jù)該異常號(hào)向用戶顯示被調(diào)試程序發(fā)生了哪一類型的異?,F(xiàn)象。調(diào)試器控制及訪問被調(diào)試程序的請(qǐng)求都將被轉(zhuǎn)換為對(duì)調(diào)試程序的地址空間或目標(biāo)平臺(tái)的某些寄存器的訪問。這使得目標(biāo)操作系統(tǒng)接收到此類請(qǐng)求時(shí),可以直接進(jìn)行處理。采用monitor方式時(shí),目標(biāo)操作系統(tǒng)必須提供支持遠(yuǎn)程調(diào)試協(xié)議的通信模塊和多任務(wù)調(diào)試接口;此外還需要改寫異常處理的相關(guān)部分;需要定義一個(gè)設(shè)置斷點(diǎn)的函數(shù)。片上調(diào)試方式是在處理器內(nèi)部嵌入額外的硬件控制模塊,當(dāng)滿足了特定的觸發(fā)條件時(shí),進(jìn)入某種特殊的狀態(tài)。在該狀態(tài)下,被調(diào)試程序停止運(yùn)行,主機(jī)的調(diào)試器可以通過(guò)處理器外部特殊設(shè)置的通信接口來(lái)訪問系統(tǒng)資源并執(zhí)行指令。主機(jī)通信端口與目標(biāo)板調(diào)試通信接口通過(guò)一塊簡(jiǎn)單的信號(hào)轉(zhuǎn)換電路板連接。內(nèi)嵌的控制模塊以監(jiān)控器或純硬件資源的形式存在,包括一些提供給用戶的接口,如JTAG方式。8.3.2ARM調(diào)試系統(tǒng)概述
在嵌入式應(yīng)用系統(tǒng)中,通常將運(yùn)行目標(biāo)程序的計(jì)算機(jī)系統(tǒng)稱為目標(biāo)機(jī)。由于目標(biāo)系統(tǒng)中常常沒有進(jìn)行輸入/輸出處理的人機(jī)接口,因此需要在另外一臺(tái)計(jì)算機(jī)上運(yùn)行調(diào)試程序。這臺(tái)運(yùn)行調(diào)試程序的計(jì)算機(jī)通常是一臺(tái)PC機(jī),稱為宿主機(jī)或調(diào)試機(jī)。主機(jī)和目標(biāo)機(jī)之間通過(guò)一定的信道進(jìn)行通信。這樣,一個(gè)調(diào)試系統(tǒng)通常包括3個(gè)部分:主機(jī)、目標(biāo)機(jī)、主機(jī)和目標(biāo)機(jī)之間的通信信道。ARM調(diào)試系統(tǒng)的結(jié)構(gòu)如圖8-13所示。圖8-13ARM調(diào)試系統(tǒng)的結(jié)構(gòu)通常運(yùn)行在目標(biāo)機(jī)上的嵌入式調(diào)試部件稱為調(diào)試代理(Debugagent),它能夠接收主機(jī)上調(diào)試器發(fā)來(lái)的命令,并可以在目標(biāo)程序中設(shè)置斷點(diǎn)、單步執(zhí)行目標(biāo)程序、顯示程序斷點(diǎn)處的運(yùn)行狀態(tài)(如寄存器和內(nèi)存值等)。在ARM體系中,調(diào)試代理有以下四種實(shí)現(xiàn)方式:
(1)基于JTAG的ICE類型的調(diào)試代理?;贘TAG仿真器的調(diào)試代理是目前ARM開發(fā)中采用最多的一種方式,ARM公司的Multi-ICE以及EmbeddedICE屬于這種類型的調(diào)試代理。這類調(diào)試代理利用ARM處理器中的JTAG接口以及一個(gè)嵌入的調(diào)試單元實(shí)現(xiàn)和主機(jī)上的調(diào)試器之間的通信,雖然價(jià)格昂貴,但使用方法簡(jiǎn)單,調(diào)試快捷方便,無(wú)需占用系統(tǒng)資源。這類調(diào)試代理主要完成以下工作:①實(shí)時(shí)設(shè)置基于指令地址值或基于數(shù)據(jù)值的斷點(diǎn)。
②控制程序單步執(zhí)行。
③訪問并控制ARM處理器內(nèi)核。
④訪問ASIC系統(tǒng)。
⑤訪問系統(tǒng)中的存儲(chǔ)器。
⑥訪問I/O系統(tǒng)。
(2)Angel調(diào)試監(jiān)控程序。該程序包括在主機(jī)上運(yùn)行的調(diào)試器和在目標(biāo)機(jī)上運(yùn)行的Monitor。通過(guò)串口通信,Angel調(diào)試監(jiān)控程序具有基本調(diào)試、通信、任務(wù)管理、異常行為處理等功能,可以接收主機(jī)上調(diào)試器發(fā)出的命令,執(zhí)行諸如設(shè)置斷點(diǎn)、單步執(zhí)行目標(biāo)程序、觀察或修改寄存器/存儲(chǔ)器內(nèi)容之類的操作。使用Angel調(diào)試監(jiān)控程序可以調(diào)試在目標(biāo)系統(tǒng)上運(yùn)行的ARM程序或Thumb程序。雖然Angel調(diào)試監(jiān)控程序成本低,但是與基于JTAG的調(diào)試代理不同,它需要占用目標(biāo)機(jī)一定的系統(tǒng)資源,如內(nèi)存、串行端口等。此外,Angel調(diào)試監(jiān)控程序還需要軟件支持,或者是嵌入式操作系統(tǒng)的支持,做不到完全的實(shí)時(shí)仿真。而JTAG仿真是通過(guò)硬件和控制EmbeddedICE實(shí)現(xiàn)的,可以做到實(shí)時(shí)仿真。
(3)?ARMulator。這是一種比較特殊的調(diào)試代理。與其他的調(diào)試代理運(yùn)行在目標(biāo)機(jī)上有所不同,它獨(dú)立于處理器硬件而運(yùn)行在主機(jī)上,是一個(gè)指令級(jí)的仿真程序。使用ARMulator時(shí),不需要硬件目標(biāo)系統(tǒng)就可以開發(fā)運(yùn)行于特定ARM處理器上的應(yīng)用程序。由于ARMulator能夠報(bào)告各指令的執(zhí)行時(shí)間及其周期,因此它還能用來(lái)進(jìn)行應(yīng)用程序的性能分析。但是,模擬器畢竟是以一種處理器模擬另一種處理器的運(yùn)行,在指令執(zhí)行時(shí)間、中斷響應(yīng)、定時(shí)器等方面很可能與實(shí)際處理器有相當(dāng)?shù)牟顒e。另外,它無(wú)法和ICE(在線實(shí)時(shí)仿真器)一樣,仿真嵌入式系統(tǒng)在應(yīng)用系統(tǒng)中的實(shí)際執(zhí)行情況。
(4)調(diào)試網(wǎng)關(guān)。通過(guò)調(diào)試網(wǎng)關(guān),主機(jī)上的調(diào)試器可以使用Agilent公司的仿真模塊開發(fā)基于ARM的應(yīng)用系統(tǒng)。
在主機(jī)和目標(biāo)機(jī)之間需要一定的通信信道,通常使用的是串行端口、并行端口或者以太網(wǎng)卡。在主機(jī)和目標(biāo)機(jī)之間進(jìn)行數(shù)據(jù)通信時(shí)要使用一定的通信協(xié)議,這使得主機(jī)上的調(diào)試器能夠使用一個(gè)統(tǒng)一的接口來(lái)與不同的調(diào)試代理進(jìn)行通信。目前廣泛使用的協(xié)議是ADP(AngelDebugProtocol),它是一個(gè)基于數(shù)據(jù)包的通信協(xié)議,具有糾錯(cuò)功能。8.3.3基于Angel的調(diào)試系統(tǒng)
1.基于Angel的調(diào)試系統(tǒng)簡(jiǎn)介
基于Angel的調(diào)試系統(tǒng)由主機(jī)上的調(diào)試器和目標(biāo)機(jī)上的Angel調(diào)試監(jiān)控程序兩部分組成,這兩部分之間通過(guò)一定的通信信道連接,通常使用的信道是串行口,并通過(guò)調(diào)試協(xié)議ADP進(jìn)行通信。圖8-14所示是一個(gè)典型的Angel調(diào)試系統(tǒng)的結(jié)構(gòu)。圖8-14一個(gè)典型的Angel調(diào)試系統(tǒng)的結(jié)構(gòu)
(1)位于主機(jī)上的調(diào)試器(Debugger):用于接收用戶命令,將其發(fā)送到位于目標(biāo)機(jī)上的Angel,使其執(zhí)行相應(yīng)的操作,并將目標(biāo)機(jī)上Angel返回的數(shù)據(jù)以一定格式顯示給用戶。ARM公司提供的各調(diào)試器都支持Angel。對(duì)于其他的調(diào)試器,如果它支持Angel所使用的調(diào)試協(xié)議ADP,則也可以支持Angel。
(2)位于目標(biāo)機(jī)上的Angel調(diào)試監(jiān)控程序:用于接收主機(jī)上調(diào)試器傳來(lái)的命令,并返回相應(yīng)的數(shù)據(jù)。通常Angel有兩個(gè)版本——完整版本和最小版本。完整版本包含所有的Angel功能,可以用于調(diào)試應(yīng)用系統(tǒng);最小版本只包含一些有限的功能,可以包含在最終的產(chǎn)品中。主機(jī)上的調(diào)試器通常由下面幾部分組成:
①調(diào)試器:可以是ARM公司的調(diào)試器,如ADW和ADU等,也可以是第三方的調(diào)試器。
②調(diào)試器工具盒:是調(diào)試器和RDI(RemoteDebugInterface,遠(yuǎn)程調(diào)試接口)之間的界面。
③ADP支持部件:提供RDI與ADP消息之間的協(xié)議轉(zhuǎn)換。
④BOOT支持部件:用于建立主機(jī)和目標(biāo)機(jī)之間的通信連接。
⑤C語(yǔ)言庫(kù)支持部件:用于處理目標(biāo)C語(yǔ)言庫(kù)的semihosting請(qǐng)求。⑥主機(jī)通道管理:管理主機(jī)上的通信通道,可以提供高層次的通信功能。
⑦主機(jī)設(shè)備驅(qū)動(dòng)程序:實(shí)現(xiàn)主機(jī)上的通信設(shè)備功能,可以為主機(jī)通道管理提供需要的服務(wù)。
目標(biāo)機(jī)上的Angel調(diào)試監(jiān)控程序由以下部件組成:
①目標(biāo)機(jī)設(shè)備驅(qū)動(dòng)程序:實(shí)現(xiàn)目標(biāo)機(jī)上的通信設(shè)備功能,可以為目標(biāo)機(jī)通道管理提供需要的服務(wù)。
②目標(biāo)機(jī)通道管理:管理目標(biāo)機(jī)上的通信通道,可以提供高層次的通信功能。
③通用調(diào)試部件:使用目標(biāo)機(jī)通道與主機(jī)通信,處理ADP消息并接收主機(jī)發(fā)送的請(qǐng)求。④與目標(biāo)系統(tǒng)相關(guān)的調(diào)試部件:提供與具體目標(biāo)系統(tǒng)相關(guān)的調(diào)試功能。
⑤異常中斷支持部件:處理所有的ARM異常中斷。
⑥C語(yǔ)言庫(kù)支持部件:提供對(duì)目標(biāo)C語(yǔ)言庫(kù)以及semihosting請(qǐng)求的支持。
⑦引導(dǎo)以及初始化部件:完成諸如啟動(dòng)檢查、設(shè)備驅(qū)動(dòng)程序設(shè)置、存儲(chǔ)系統(tǒng)和數(shù)據(jù)棧等的設(shè)置、將引導(dǎo)信息發(fā)送到主機(jī)上的調(diào)試器等操作。目標(biāo)機(jī)上的Angel主要完成了以下功能:
①基本的調(diào)試功能:包括報(bào)告存儲(chǔ)器和處理器狀態(tài)、將應(yīng)用程序下載到目標(biāo)系統(tǒng)中、設(shè)置斷點(diǎn)等。
②C語(yǔ)言庫(kù)的支持:在目標(biāo)系統(tǒng)上運(yùn)行的應(yīng)用程序可以與C語(yǔ)言庫(kù)連接。其中有些C語(yǔ)言庫(kù)需要semihosting支持,Angel使用SWI機(jī)制完成這些semihosting請(qǐng)求。在ARM程序中,Angel使用的SWI號(hào)為0x123456;在Thumb程序中,Angel使用的SWI號(hào)為0xab。③通信支持:Angel使用ADP通信協(xié)議,并支持串行端口、并行端口和以太網(wǎng)接口這三種通信信道。主機(jī)和目標(biāo)機(jī)上的通道管理部件保證邏輯通道能夠被可靠地復(fù)用,并監(jiān)視通道的使用情況,處理帶寬溢出等情況。主機(jī)和目標(biāo)機(jī)上的設(shè)備驅(qū)動(dòng)程序處理數(shù)據(jù)包的發(fā)送和接收,能夠檢測(cè)并扔掉發(fā)生錯(cuò)誤的數(shù)據(jù)包。
④任務(wù)管理功能:保證任何時(shí)候只有一個(gè)操作在執(zhí)行;為一個(gè)任務(wù)分配優(yōu)先級(jí)并根據(jù)優(yōu)先級(jí)調(diào)度一個(gè)任務(wù);控制Angel運(yùn)行環(huán)境的處理器模式。
⑤異常中斷處理:Angel使用除了復(fù)位異常中斷以外的其他ARM異常中斷。
2.使用Angel的調(diào)試應(yīng)用程序
1)使用Angel所需要的資源
使用Angel所需要的資源包括以下幾個(gè)方面:
(1)系統(tǒng)資源。
(2)內(nèi)存資源。
(3)異常中斷向量。
(4)FIQ及IRQ異常中斷。
(5)數(shù)據(jù)棧。
2)使用完整版本的Angel調(diào)試應(yīng)用程序
完整版本的Angel獨(dú)立存在于目標(biāo)系統(tǒng)中,并支持所有的調(diào)試功能。使用完整版本的Angel開發(fā)應(yīng)用程序主要從以下幾個(gè)方面著手:
(1)確定開發(fā)應(yīng)用程序時(shí)需要規(guī)劃的內(nèi)容。在著手開發(fā)應(yīng)用程序之前,必須確定以下選項(xiàng):
①應(yīng)用程序使用的ATPC調(diào)用標(biāo)準(zhǔn)。
②在應(yīng)用程序中是否包含ARM程序和Thumb程序的相互調(diào)用。
③目標(biāo)系統(tǒng)的內(nèi)存模式。④在生成的映像文件中是否包含調(diào)試時(shí)需要的信息。這將影響目標(biāo)映像文件的大小和代碼的可調(diào)試性。
⑤目標(biāo)系統(tǒng)的通信需求。用戶需要設(shè)計(jì)通信時(shí)使用的各個(gè)設(shè)備的驅(qū)動(dòng)程序。
⑥目標(biāo)系統(tǒng)中的存儲(chǔ)器大小。目標(biāo)系統(tǒng)中的存儲(chǔ)器必須能夠保存Angel和應(yīng)用程序,并且必須能夠提供程序運(yùn)行需要的存儲(chǔ)空間。
⑦最終產(chǎn)品中是否包含最小版本的Angel。如果不包含,用戶必須自己編寫系統(tǒng)引導(dǎo)和初始化部分的代碼,并處理系統(tǒng)中的異常中斷。
⑧在最終產(chǎn)品中是否需要C語(yǔ)言運(yùn)行庫(kù)的支持。如果需要,則用戶必須自己實(shí)現(xiàn)這些C語(yǔ)言運(yùn)行庫(kù)的支持函數(shù)。因?yàn)樵谧罱K產(chǎn)品中不能使用semihosting請(qǐng)求主機(jī)資源。
(2)明確編程限制。在使用完整版的Angel開發(fā)應(yīng)用程序時(shí),由于Angel需要一定的資源,因此給程序設(shè)計(jì)帶來(lái)了一定的限制。這些限制包括:
①Angel需要使用自己的處理器特權(quán)模式下的數(shù)據(jù)線,因此在Angel和實(shí)時(shí)操作系統(tǒng)RTOS一起使用時(shí),必須確保在Angel運(yùn)行時(shí),RTOS不會(huì)切換處理器模式,否則可能造成死機(jī)。
②用戶應(yīng)用程序盡量避免使用SWI0x123456以及SWI0xab。這兩個(gè)SWI異常中斷號(hào)保留給Angel使用。Angel使用它們來(lái)實(shí)現(xiàn)目標(biāo)程序中C語(yǔ)言運(yùn)行時(shí)庫(kù)的semihosting請(qǐng)求。③如果用戶應(yīng)用程序中使用了SWI,?則在退出該SWI時(shí)必須將各寄存器的值還原成進(jìn)入SWI時(shí)的值。
④如果應(yīng)用程序中需要使用未定義的指令異常中斷,必須注意Angel使用了該異常中斷。
(3)如果用戶應(yīng)用程序在處理器特權(quán)模式下執(zhí)行,則必須設(shè)置應(yīng)用程序自己的特權(quán)模式數(shù)據(jù)棧。Angel在進(jìn)入SWI時(shí),需要使用應(yīng)用程序的特權(quán)模式數(shù)據(jù)棧中4個(gè)字節(jié)的空間;在進(jìn)入SWI后,Angel將使用自己的特權(quán)模式的數(shù)據(jù)棧。因此,當(dāng)應(yīng)用程序在特權(quán)模式下調(diào)用Angel的SWI時(shí),必須保證它的特權(quán)模式數(shù)據(jù)棧為FD(滿且地址遞減)類型,并有足夠Angel進(jìn)入SWI時(shí)需要的可用空間。
(4)異常中斷處理程序連接。Angel使用除了復(fù)位異常中斷以外的其他ARM異常中斷,包括SWI異常中斷、未定義指令異常中斷、數(shù)據(jù)中止和指令預(yù)取中止異常中斷、FIQ及IRQ異常中斷。這樣,如果用戶應(yīng)用程序需要使用其中的某些異常中斷,則用戶應(yīng)用程序中相應(yīng)的異常中斷處理程序必須恰當(dāng)?shù)剡B接到Angel中異常中斷處理程序上,否則可能會(huì)使Angel無(wú)法正常工作。
(5)?確定C語(yǔ)言運(yùn)行庫(kù)的使用方式。ARM公司隨ADS(SDT)一起提供的C語(yǔ)言運(yùn)行庫(kù)通過(guò)Angel的SWI來(lái)實(shí)現(xiàn)semihosting請(qǐng)求。用戶應(yīng)用程序中可以連接C語(yǔ)言運(yùn)行庫(kù),具體方法如下:
①在應(yīng)用程序開發(fā)工程中使用ARMC語(yǔ)言運(yùn)行庫(kù),在最終的產(chǎn)品中使用用戶自己的C語(yǔ)言運(yùn)行庫(kù)或者操作系統(tǒng)提供的C語(yǔ)言運(yùn)行庫(kù)。
②在用戶應(yīng)用程序中實(shí)現(xiàn)AngelSWI,然后在應(yīng)用程序或者操作系統(tǒng)中使用ARMC語(yǔ)言運(yùn)行庫(kù)。
③用戶重新實(shí)現(xiàn)ARMC語(yǔ)言運(yùn)行庫(kù),使之適應(yīng)于自己的使用環(huán)境。ARMC語(yǔ)言運(yùn)行庫(kù)是以源代碼形式提供的。
④在用戶啟動(dòng)代碼中使用EmbbedC。
(6)在調(diào)試時(shí)使用斷言(assertions)。在Angel代碼中包含了大量的斷言,這些斷言是通過(guò)ASSERT_ENABLED來(lái)使能或禁止的。如果用戶應(yīng)用程序希望使用這種機(jī)制,則可以使用下面的格式將相應(yīng)的斷言語(yǔ)句包含起來(lái):
#ifASSERT_ENABLED
…
#endif
(7)斷點(diǎn)的設(shè)置。Angel只能在ARM中設(shè)置斷點(diǎn),不能在ROM以及FLASH中設(shè)置斷點(diǎn)。此外,在異常中斷處理程序中設(shè)置斷點(diǎn)時(shí)要非常小心。
3)使用最小版本的Angel開發(fā)應(yīng)用程序
最小版本的Angel只包含了Angel的部分功能。它不能用來(lái)調(diào)試應(yīng)用程序,只能在應(yīng)用程序開發(fā)的最后階段,將其與應(yīng)用程序連接在一起,從而提供一定的引導(dǎo)和初始化的功能。最小版本的Angel不包括以下功能:
(1)調(diào)試協(xié)議ADP。最小版本的Angel與主機(jī)的通信是基于字節(jié)流的。
(2)在ADP上的可靠通信。
(3)目標(biāo)機(jī)上的C語(yǔ)言運(yùn)行庫(kù)的semihosting請(qǐng)求。
(4)在一個(gè)設(shè)備上復(fù)用多個(gè)通信通道。
(5)未定義的指令異常中斷。
(6)任務(wù)管理。
4)使用Angel下載應(yīng)用程序
可以通過(guò)以下多種方法使用Angel下載應(yīng)用程序:
(1)使用Angel通過(guò)串行口下載應(yīng)用程序。這種方法的優(yōu)點(diǎn)是只需要一個(gè)簡(jiǎn)單的串行口就可以下載應(yīng)用程序。如果目標(biāo)系統(tǒng)支持FLASH的寫入操作,則這種方式還可以將應(yīng)用程序?qū)懭氲紽lashMemory中。
(2)使用Angel通過(guò)串行口和并行口下載應(yīng)用程序。這種方式能夠提供中等的下載速度。如果目標(biāo)系統(tǒng)支持FlashMemory的寫入操作,則這種方式還可以將應(yīng)用程序?qū)懭氲紽lashMemory中。
(3)使用Angel通過(guò)以太網(wǎng)接口下載應(yīng)用程序。這時(shí)可以提供很快的下載速度,但是需要目標(biāo)系統(tǒng)中有以太網(wǎng)接口以及相關(guān)的驅(qū)動(dòng)程序。如果目標(biāo)系統(tǒng)支持FlashMemory的寫入操作,則這種方式還可以將應(yīng)用程序?qū)懭氲紽lashMemory中。
(4)FlashMemory燒入。這時(shí)目標(biāo)系統(tǒng)中要有FlashMemory以及相應(yīng)的燒入程序。
(5)使用ROM仿真器下載應(yīng)用程序。
(6)整片地?zé)隦OM或者EPROM。8.3.4基于JTAG的調(diào)試系統(tǒng)
1.基于JTAG的調(diào)試系統(tǒng)概述
JTAG是JointTestActionGroup的縮寫,是IEEE1149.1標(biāo)準(zhǔn)?;贘TAG的調(diào)試方法是目前ARM開發(fā)中采用最多的一種方式?;贘TAG的調(diào)試系統(tǒng)連接比較方便,實(shí)現(xiàn)價(jià)格比較便宜,實(shí)現(xiàn)了完全非插入式調(diào)試,且不使用片上資源,不需要目標(biāo)存儲(chǔ)器,不占用目標(biāo)系統(tǒng)的任何端口,可以做到實(shí)時(shí)仿真。
一個(gè)典型的基于JTAG的調(diào)試系統(tǒng)結(jié)構(gòu)如圖8-15所示。圖8-15基于JTAG的調(diào)試系統(tǒng)結(jié)構(gòu)目標(biāo)系統(tǒng)就是包括硬件嵌入式部件的調(diào)試對(duì)象。如圖8-16所示,以一個(gè)典型的ARM7TDMI處理器內(nèi)核為例,目標(biāo)系統(tǒng)主要包括以下三個(gè)部分:
(1)需要進(jìn)行調(diào)試的處理器內(nèi)核。
(2)EmbbeddedICE邏輯電路,包括一組寄存器和比較器,可以用來(lái)產(chǎn)生調(diào)試時(shí)需要的異常中斷,如產(chǎn)生斷點(diǎn)等。
(3)?TAP控制器,可以提供JTAG接口控制各個(gè)硬件掃描鏈。圖8-16一個(gè)典型的目標(biāo)系統(tǒng)JTAG調(diào)試結(jié)構(gòu)
2.基于JTAG的調(diào)試過(guò)程
在ARM開發(fā)調(diào)試時(shí),首先要通過(guò)一定的方式使目標(biāo)系統(tǒng)進(jìn)入調(diào)試狀態(tài),然后在調(diào)試狀態(tài)下完成各種調(diào)試功能,例如查看處理器狀態(tài)、查看和修改存儲(chǔ)器內(nèi)容等。ARM7TDMI可以通過(guò)以下三種格式進(jìn)入調(diào)試狀態(tài):
(1)通過(guò)設(shè)置程序斷點(diǎn)(breakpoint)。
(2)通過(guò)設(shè)置數(shù)據(jù)斷點(diǎn)(watchpoint)。
(3)通過(guò)相應(yīng)的外部請(qǐng)求進(jìn)入調(diào)試狀態(tài)。 8.4其他實(shí)用工具
8.4.1SourceInsight
1.SourceInsight簡(jiǎn)介
SourceInsight是Windows支持的一個(gè)功能強(qiáng)大的程序編輯器,內(nèi)置了對(duì)C/C++、Java和x86匯編語(yǔ)言程序的解析,并通過(guò)動(dòng)態(tài)數(shù)據(jù)庫(kù)使得在源碼編輯時(shí)提供有用的文本提示,如有關(guān)的函數(shù)、宏、參數(shù)等。當(dāng)SourceInsight和ARMADS配合使用時(shí),不會(huì)因?yàn)閮蓚€(gè)軟件打開同一個(gè)文件而發(fā)生錯(cuò)誤,因此可以在SourceInsight編輯源碼,然后在ARMADS中進(jìn)行編譯。與其他的編輯器相比,SourceInsight具有以下技術(shù)特點(diǎn):
(1)?SourceInsight提供了可快速訪問源代碼和源信息的功能。與其他的編輯器產(chǎn)品不同,它還可以幫助用戶分析源代碼,并在用戶編輯的同時(shí)立刻提供有用的信息和分析。
(2)?SourceInsight可自動(dòng)創(chuàng)建并維護(hù)自己高性能的符號(hào)數(shù)據(jù)庫(kù),包括函數(shù)、method、全局變量、結(jié)構(gòu)、類和工程源文件里定義的其他類型的符號(hào)。SourceInsight可以迅速地更新用戶的文件信息,并將符號(hào)數(shù)據(jù)庫(kù)的符號(hào)自動(dòng)創(chuàng)建到用戶的工程文件中。
(3)?SourceInsight可將變量類型動(dòng)態(tài)分解。
(4)?SourceInsight的符號(hào)窗口顯示在每個(gè)源窗口的旁邊,可以動(dòng)態(tài)更新。
(5)?SourceInsight2.0增加了一個(gè)新特點(diǎn)——引進(jìn)了Context窗口。Context窗口在背景中更新,并且追蹤正在進(jìn)行的編輯任務(wù)。只要用戶點(diǎn)擊標(biāo)識(shí)符,Context窗口就會(huì)自動(dòng)顯示符號(hào)的定義。若標(biāo)識(shí)符是個(gè)變量,則在Context窗口中會(huì)顯示出它的基礎(chǔ)結(jié)構(gòu)(basestructure)或類型。Context窗口還可以在工程窗口中自動(dòng)顯示所選定的文件、相關(guān)窗口的符號(hào)和Clip窗口中選定的Clip。
(6)語(yǔ)法格式化是SourceInsight的重要的新功能。它提供了許多先進(jìn)的顯示功能,包括帶有用戶定義功能的文本格式等。
2.SourceInsight的使用方法
安裝SourceInsight的系統(tǒng)需求包括:
·操作系統(tǒng):Windows95以上。
·處理器:Pentium或更快,建議使用Pentium?Ⅱ以上。
·內(nèi)存:大于64MB。
SourceInsight的安裝非常簡(jiǎn)單。和其他軟件的安裝一樣,雙擊安裝文件名,然后按提示進(jìn)行就可以完成。下面簡(jiǎn)單介紹一下SourceInsight的使用方法。
(1)啟動(dòng)SourceInsight,選擇Project菜單下的new,新建一個(gè)工程,輸入工程名。
(2)在AddandRemoveFiles中把要讀的源代碼(包括*.c和*.h文件)加入到SourceInsight的工程中,用該軟件分析所加的源代碼。
(3)分析完后,可以進(jìn)行源代碼閱讀。
(4)對(duì)于打開的閱讀文件,如果想查看某一變量的定義,可先把光標(biāo)定位于該變量,然后單擊工具條上的相應(yīng)選項(xiàng),該變量的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 借款質(zhì)押車輛合同范本
- 交通 ppp項(xiàng)目合同范本
- 農(nóng)資肥料卸貨合同范本
- 焊接設(shè)備制造項(xiàng)目節(jié)能分析報(bào)告
- 木線項(xiàng)目可行性研究報(bào)告
- 中國(guó)安徽省養(yǎng)老機(jī)構(gòu)行業(yè)市場(chǎng)競(jìng)爭(zhēng)現(xiàn)狀及投資前景規(guī)劃報(bào)告
- 2025年中國(guó)立式硅藻土過(guò)濾機(jī)行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及投資方向研究報(bào)告
- 路燈實(shí)施合同范本
- 信息系統(tǒng)集成項(xiàng)目的風(fēng)險(xiǎn)評(píng)估與緩解考核試卷
- 中國(guó)供水設(shè)備市場(chǎng)競(jìng)爭(zhēng)態(tài)勢(shì)及投資戰(zhàn)略規(guī)劃研究報(bào)告
- 資產(chǎn)拆除報(bào)廢申請(qǐng)表
- 《社區(qū)康復(fù)》課件-第九章 言語(yǔ)障礙患者的社區(qū)康復(fù)實(shí)踐
- 萬(wàn)千教育學(xué)前讓幼兒都愛學(xué)習(xí):幼兒園高質(zhì)量學(xué)習(xí)活動(dòng)設(shè)計(jì)與組織
- 綠之源家電清洗調(diào)查問卷
- 孕前優(yōu)生檢查培訓(xùn)課件
- 《醫(yī)藥板塊分析》課件
- 新編商務(wù)秘書實(shí)務(wù)(第3版)高職全套教學(xué)課件
- 冷卻塔使用維護(hù)說(shuō)明書
- 項(xiàng)目維保投標(biāo)方案技術(shù)標(biāo)
- 人教版(新起點(diǎn)) 小學(xué)英語(yǔ)五年級(jí)下冊(cè)教案(全冊(cè))
- 重大隱患判定標(biāo)準(zhǔn)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論