姚茂群,葉漢能,趙武鋒,顏佳寧
(1.杭州師范大學(xué)錢江學(xué)院,浙江杭州310012;2.杭州師范大學(xué)信息科學(xué)與工程學(xué)院,浙江杭州310036;3.浙江大學(xué)信息與電子工程學(xué)系,浙江杭州310027;4.浙江醫(yī)學(xué)高等??茖W(xué)校圖書信息中心,浙江杭州310053)
基于外部RAM的ARM異常程序調(diào)試技術(shù)
姚茂群1,2,葉漢能2,趙武鋒3,顏佳寧4
(1.杭州師范大學(xué)錢江學(xué)院,浙江杭州310012;2.杭州師范大學(xué)信息科學(xué)與工程學(xué)院,浙江杭州310036;3.浙江大學(xué)信息與電子工程學(xué)系,浙江杭州310027;4.浙江醫(yī)學(xué)高等??茖W(xué)校圖書信息中心,浙江杭州310053)
在闡述ARM中異常處理的基本思想以及基于JTAG進行調(diào)試的基本原理的基礎(chǔ)上,詳細分析了目前各種基于外部RAM的ARM異常程序調(diào)試技術(shù)的原理和特點.通過對比各種調(diào)試技術(shù)的適用性和優(yōu)缺點,結(jié)合目前嵌入式系統(tǒng)開發(fā)過程中常用的ARM芯片和集成開發(fā)工具,提出一種新的在外部RAM中調(diào)試含有異常處理代碼的ARM程序的調(diào)試技術(shù),并通過實驗驗證了其有效性.
異常處理;JTAG協(xié)議;外部RAM;ARM體系結(jié)構(gòu);調(diào)試技術(shù);嵌入式系統(tǒng)
嵌入式系統(tǒng)的開發(fā)一般可分為需求分析、設(shè)計、生成代碼和固化幾個階段[1].在生成代碼的過程中,調(diào)試是確保程序最終能在系統(tǒng)中順利運作的關(guān)鍵.由于RAM(Random Access Memory)具有可讀寫、速度快等特點,因此在RAM中調(diào)試程序是一種基本并有效的方法.ARM(Advanced RISC Machines)處理器作為嵌入式領(lǐng)域中運用最多的處理器之一,占據(jù)了32位RISC(Reduced Instruction Set Computer)微處理器75%以上的市場份額,它的應(yīng)用深入到了各個領(lǐng)域[2].很多ARM集成開發(fā)工具在RAM中調(diào)試程序時,可以方便地設(shè)置無限的軟斷點,便于分析程序中存在的不足.ARM處理器一般內(nèi)置很少RAM,系統(tǒng)中需要外掛SDRAM(Synchronous Dynamic Random Access Memory)才能滿足應(yīng)用需求.而外部SDRAM正常使用的前提是配置好ARM處理器的相應(yīng)控制模塊,這個工作在調(diào)試時一般通過JTAG(Joint Test Action Group)來實現(xiàn),因此JTAG在調(diào)試過程中有著十分重要的作用.
異常響應(yīng)是嵌入式系統(tǒng)必須具備的一種程序處理模式,對于系統(tǒng)實時性和穩(wěn)定性至關(guān)重要[3].ARM處理器建立了一套完整的異常處理機制,在系統(tǒng)設(shè)計過程中可以根據(jù)每種異常的具體解決方法編寫相應(yīng)的異常處理代碼,當(dāng)異常產(chǎn)生時,即可執(zhí)行對應(yīng)的代碼正確處理該異常,從而保證系統(tǒng)的正常運作.
針對含異常處理代碼程序的調(diào)試,現(xiàn)有的一些方法通常需要涉及Flash燒寫、MMU(Memory Management Unit)重映射或在源程序中額外增加建立異常向量表的內(nèi)容[4-6],步驟較煩瑣,原理較復(fù)雜并增加了被調(diào)試程序本身的代碼量.本文根據(jù)ARM體系結(jié)構(gòu)和異常處理程序的一般特點,充分利用JTAG在調(diào)試中的作用,提出一種新的在外部RAM中調(diào)試含異常處理代碼的ARM程序的方法.該方法原理簡單、無需改動被調(diào)試程序本身、操作方便,并在Samsung公司以ARM920T為內(nèi)核的S3C2440A芯片及Hynix公司的HY57V561620C SDRAM芯片組成的環(huán)境下進行了驗證.
在ARM系統(tǒng)開發(fā)過程中,調(diào)試的程序通常會包含異常處理部分,合理的異常處理是健壯的系統(tǒng)必需的.ARM7、ARM9處理器包含8種異常:復(fù)位、未定義指令、軟中斷、預(yù)取中止、數(shù)據(jù)中止、保留、外部中斷和快速中斷[3].
當(dāng)特定異常產(chǎn)生時,CPU自動到固定地址取指[7-8].因此常在對應(yīng)位置存放異常向量表,通過讀取異常向量表對應(yīng)的指令,跳轉(zhuǎn)到相應(yīng)的異常處理函數(shù).由于該地址通常不在外部RAM地址范圍內(nèi)[9],所以在外部RAM進行異常調(diào)試時需要一種機制來保證異常向量表的正確讀取.以下3種基本方法可以達到正確讀取異常向量表的目的:1)在符合要求的位置放置異常向量表,通常對應(yīng)NOR Flash或內(nèi)部SRAM;2)將異常向量表放在外部RAM中,通過重映射機制,將異常向量表的位置映射到符合要求的地址;3)將異常向量表保留在外部RAM中,在異常發(fā)生時的固定取指位置放置跳轉(zhuǎn)表,通過相應(yīng)的跳轉(zhuǎn)指令跳轉(zhuǎn)到外部RAM中異常向量表的對應(yīng)位置.
JTAG調(diào)試作為最常用的一種調(diào)試方法[10-13],得到了各種ARM芯片的支持.作為測試訪問端口和邊界掃描結(jié)構(gòu)標(biāo)準(zhǔn),JTAG主要用于芯片內(nèi)部測試.
2.1 測試訪問端口(Test Access Port,TAP)
TAP是JTAG標(biāo)準(zhǔn)測試協(xié)議中的一個通用端口,通過它可以訪問芯片的所有數(shù)據(jù)寄存器(DR)和指令寄存器(IR).它包括5個信號接口:時鐘(TCK)、狀態(tài)選擇(TMS)、數(shù)據(jù)輸入(TDI)、數(shù)據(jù)輸出(TDO)和復(fù)位(TRST).數(shù)據(jù)的訪問過程按照如下步驟進行:1)由指令寄存器指定數(shù)據(jù)寄存器;2)將指定的數(shù)據(jù)寄存器連接到TDI和TDO之間;3)在TCK的驅(qū)動下,從TDI輸入數(shù)據(jù),將選定數(shù)據(jù)寄存器中的數(shù)據(jù)從TDO中輸出.訪問過程通過TAP控制器的狀態(tài)機來實現(xiàn)[10].
2.2 邊界掃描結(jié)構(gòu)(Boundary-Scan Architecture)
邊界掃描結(jié)構(gòu)主要由掃描單元串聯(lián)形成的掃描鏈組成,每一個掃描單元分配給CPU核或芯片相應(yīng)引腳.
ARM芯片內(nèi)部設(shè)計多條長度不同的掃描鏈,因此可以訪問的寄存器等范圍也不同.通過這些掃描鏈,可以訪問ARM內(nèi)核的外圍電路,包括數(shù)據(jù)總線,因此無論內(nèi)部寄存器還是外部RAM,都可以通過JTAG進行訪問[10].圖1為ARM處理器的掃描鏈分布示意圖.
基于JTAG調(diào)試可以以特定時序來實現(xiàn)對指令和數(shù)據(jù)的存取,從而實現(xiàn)調(diào)試、下載、Flash燒寫等功能.
圖1 ARM掃描鏈分布示意圖Fig.1 Distribution map of ARM scan chain
KEIL和IAR是目前ARM開發(fā)中常用的兩個集成開發(fā)工具[13],它們的基本開發(fā)流程一致.在RAM中進行程序調(diào)試前,需搭建好軟硬件開發(fā)平臺、編譯鏈接源程序,其中鏈接文件需要根據(jù)外部RAM在系統(tǒng)中的位置以及采用的調(diào)試方法來設(shè)置.IAR的鏈接文件(v5版本的.icf文件)主要用來指導(dǎo)各段的鏈接操作,確定各段鏈接地址;接下來需要建立初始化腳本(.mac文件),它由IAR的內(nèi)置函數(shù)或命令組成,控制JTAG做下載被調(diào)試程序前的準(zhǔn)備工作.KEIL中初始化腳本為.ini文件.構(gòu)建好調(diào)試環(huán)境后,就可以進行正常的調(diào)試工作了.圖2為簡單的調(diào)試流程.
在圖2中,通過初始化腳本來構(gòu)建調(diào)試環(huán)境,其主要內(nèi)容包括:1)關(guān)閉看門狗、關(guān)中斷、初始化RAM控制器、初始化時鐘等,其中RAM控制器(ARM芯片中的Memory Controller)的初始化是為外部RAM的讀寫作準(zhǔn)備;2)下載程序;3)修改程序指針PC,使其指向調(diào)試程序入口.
ARM處理器遇到異常時將自動修改PC值為特定的地址.以下以S3C2440A芯片為例,這個特定地址通常對應(yīng)地址空間前8個字的尋址位置[9].而在外部RAM調(diào)試時,這8個字的位置上一般沒有指令或指令不正確,這就需要一種機制來保證在這些地方放置正確的跳轉(zhuǎn)指令.由于不同開發(fā)板上配置的存儲芯片情況不同,異常調(diào)試策略也有相應(yīng)的變化.以下是一些常見的調(diào)試辦法.
1)將異常向量表燒寫進Flash[4-5].硬件系統(tǒng)通常配置有Flash,因此可將異常向量表事先燒寫進Flash.如果Flash為NOR Flash,并且系統(tǒng)設(shè)置成從NOR Flash啟動,則系統(tǒng)尋址空間的起始部分對應(yīng)NOR Flash的存儲空間,由于程序可在NOR Flash中執(zhí)行,所以異常發(fā)生時可執(zhí)行其異常向量表的相應(yīng)指令;如果Flash為NAND Flash,并且系統(tǒng)設(shè)置成從NAND Flash啟動,那么ARM CPU在上電后自動將NAND Flash中的前4 K代碼搬移到內(nèi)置的SRAM中,并且將SRAM的存儲空間映射到尋址空間的前4 K地址,異常發(fā)生時便執(zhí)行SRAM中異常向量表的相應(yīng)指令.
2)分散加載[4-5].系統(tǒng)上電后尋址空間的起始地址對應(yīng)SRAM存儲空間的情況下,可以通過鏈接腳本將主程序中的異常向量表鏈接到SRAM,而其它程序鏈接到RAM中,這樣調(diào)試時即可通過分散加載的辦法,使得異常向量表的位置滿足要求.
3)通過源程序在起始位置建立異常向量表[4-5].按照存儲空間起始位置對應(yīng)存儲器件的不同,如SRAM或者NOR Flash,通過在源程序中額外增加不同的寫操作從而在尋址空間的起始位置建立好異常向量表,之后異常產(chǎn)生時就可以按照這個新建的異常向量表操作.
4)利用MMU將部分RAM映射到起始地址[4-5].由于MMU存在,異常向量表并不必須放在尋址空間起始地址,可通過重映射,將外部RAM的部分地址映射到尋址空間起始位置.異常到來時,CPU修改PC后實際對應(yīng)的是RAM中異常向量表的地址,從而讀取相應(yīng)指令.建立重映射的工作可在源程序中實現(xiàn),也可通過初始化腳本實現(xiàn).
在實際的調(diào)試過程中需要結(jié)合開發(fā)板的配置以及對實際調(diào)試各方面的要求來選擇特定的調(diào)試辦法.
圖2 調(diào)試操作流程Fig.2 Scheme of debugging process
基于ARM系統(tǒng)的調(diào)試機理以及常用ARM集成開發(fā)工具中各配置文件的作用,本文在由NAND Flash引導(dǎo)的硬件系統(tǒng)中,提出一種新的在外部RAM中進行異常調(diào)試的方法.
在IAR的.mac文件以及KEIL的.ini文件中,可以利用一套特定的指令來實現(xiàn)對SRAM和SDRAM的讀寫[13],而這些讀寫操作正是基于JTAG進行的,并且在被調(diào)試程序運行前完成,在時間上能很好地保證對異常的調(diào)試.這些操作原理并不復(fù)雜,在KEIL和IAR的初始化腳本中很容易實現(xiàn).相對于通常的調(diào)試方法,這種方法有效地利用了JTAG的機理,并不需要在NAND Flash燒寫異常向量表,不必因為通過源程序在SRAM中建立異常向量表而增加程序的難度和大小,同時也不需要進行分散加載和使用MMU等.
本文驗證過程所基于實驗平臺的相關(guān)配置為:處理器芯片為S3C2440A,其擴展儲存的8個Bank中Bank6和Bank7外掛SDRAM,對應(yīng)存儲空間的起始地址為0x30000000;系統(tǒng)配有NAND Flash,并被設(shè)置成上電后從NAND Flash啟動,因此上電后系統(tǒng)尋址空間前4 K將對應(yīng)SRAM的存儲空間.
以下為ARM異常程序調(diào)試新方法的具體步驟:
1)做好調(diào)試前準(zhǔn)備.鏈接程序時參照外部RAM的地址進行設(shè)定,并不需要分散加載.
2)構(gòu)建調(diào)試環(huán)境,建立初始化腳本.這部分是重點.除了與其他方法相同的初始化硬件部分外,需要添加通過JTAG在SRAM中建立跳轉(zhuǎn)表的操作,然后下載程序,修改PC使其指向被調(diào)試程序的相應(yīng)位置.
建立跳轉(zhuǎn)表時,由于外部RAM的位置從0x30000000開始,而跳轉(zhuǎn)指令“B”只能在32 M范圍內(nèi)跳轉(zhuǎn),“MOV”指令加載的立即數(shù)必須由8位數(shù)通過偶數(shù)次移位得到,因此都不能滿足要求.所以采用“LDR”偽指令加載立即數(shù)給PC,從而跳轉(zhuǎn)到外部RAM中異常向量表的位置.該過程中,“LDR”偽指令實際上是在固定的位置(4 K范圍內(nèi))以文字池的方式存放需要加載的立即數(shù),并從該文字池中取相應(yīng)的立即數(shù)給寄存器.根據(jù)這個原理,編譯器將“LDR”偽指令編譯成兩部分,一部分為存放在文字池中的立即數(shù),另一部分則是到文字池相應(yīng)位置讀取立即數(shù)的指令.因為要通過JTAG加載異常向量表,需要使用“LDR”偽指令編譯后對應(yīng)的機器碼,這可以從編譯器編譯后的結(jié)果中得到.
以KEIL為例,在初始化腳本(.ini文件)里面實現(xiàn)跳轉(zhuǎn)表的代碼如下:
以上初始化代碼中,前8條中的“0xE59FF018”即為讀取文字池中的立即數(shù)給PC的指令對應(yīng)的機器碼,后8條中“0x30000000”、“0x30000004”、“0x30000008”等為文字池中的立即數(shù).例如“_WDWORD(0x00000000,0x E59FF018)”和“_WDWORD(0x00000020,0x30000000)”兩條指令對應(yīng)了“LDR PC,=0x30000000”指令.IAR由.mac文件實現(xiàn)以上功能,原理跟KEIL一致,用“__write Memory32”替代“_WDWORD”指令即可.
3)下載程序,進行正常的程序調(diào)試操作.表1列出了本文提出的ARM異常程序調(diào)試新方法與常用調(diào)試方法所需的操作.
表1 不同調(diào)試方法所需操作比較Tab.1 Comparison of operations required by different debugging methods
由表1可知,方法1需要對Flash進行燒寫,而Flash燒寫并不如RAM下載程序那么方便,具有費時和降低Flash壽命的缺點;方法2通過修改鏈接腳本達到分散加載的目的,但在完成調(diào)試之后需重新修改鏈接腳本;方法3需要在主程序中額外編寫一段程序以用于在特定位置建立異常向量表,特別在需要將異常向量表放在NOR Flash中時,這段額外的程序比較大,實現(xiàn)也比較煩瑣,并且在調(diào)試完成后需要將其刪除;方法4需要修改MMU的相關(guān)設(shè)置,而如果需要調(diào)試的程序本身也要用到MMU的功能,那么就可能形成沖突而造成錯誤.另外,以上所有的方法都需要編寫初始化腳本.而新方法只需要編寫初始化腳本,通過初始化腳本建立跳轉(zhuǎn)表,充分利用了JTAG的原理.該腳本的編寫非常簡單,因此新方法相對以上4種方法來說,步驟少、實現(xiàn)方便、可操作性強.
以下以外部中斷0(EINT0)觸發(fā)快速中斷FIQ為例對該方法在異常情況下的效果進行驗證,所用集成開發(fā)環(huán)境為KEIL和IAR.根據(jù)本實驗開發(fā)板的電路設(shè)計,EINT0對應(yīng)的引腳外接了按鍵,并且按鍵按下將使得對應(yīng)的引腳為低電平.配置EINT0為低電平觸發(fā),并且中斷模式設(shè)置為FIQ.通過鏈接腳本,將源程序鏈接到0x30000000處.整個過程按照圖2所示順序進行操作.
在主程序正常運行過程中,按下EINT0對應(yīng)按鍵,系統(tǒng)進入FIQ模式,并且PC指針自動指向了地址0x1c處,反匯編顯示該處指令為“LDR pc,[pc,#0x18]”,對應(yīng)的機器碼為“0xe59ff018”.由于流水線的關(guān)系,系統(tǒng)在執(zhí)行上述指令時,PC值為0x24,加上0x18后對應(yīng)地址0x3c,通過反匯編或集成開發(fā)工具的其他相應(yīng)功能模塊可看到該地址上的數(shù)據(jù)是0x3000001c,正是源程序異常向量表中FIQ對應(yīng)指令在外部RAM的位置.單步執(zhí)行,程序順利跳轉(zhuǎn)到0x3000001c處.繼續(xù)執(zhí)行,程序進入了相應(yīng)異常處理函數(shù).
其他異常模式經(jīng)驗證均簡單有效.實驗證明,本文提出的新方法在ARM異常程序調(diào)試中切實可行,且操作簡單.
嵌入式系統(tǒng)開發(fā)過程中進行異常調(diào)試是非常必要的,由于RAM具有便于讀寫的特點,在RAM中進行異常調(diào)試是常用的手段.本文結(jié)合ARM異常處理的機制、JTAG調(diào)試的機理,詳細分析和總結(jié)了在RAM中進行ARM異常調(diào)試的常用技術(shù),提出了一種新的在外部RAM中進行ARM異常調(diào)試的方法,該方法具有原理簡單、不需要改動調(diào)試程序本身、可操作性強等優(yōu)勢.在基于S3C2440A、由NAND Flash引導(dǎo)的開發(fā)板上分別使用KEIL和IAR集成開發(fā)工具進行了驗證,結(jié)果表明該方法簡便、有效.
[1]吳學(xué)智,戚玉華,林海濤,等.基于ARM的嵌入式系統(tǒng)設(shè)計與開發(fā)[M].北京:人民郵電出版社,2007:18-65.
[2]尹旭峰,苑士華,胡紀(jì)濱.ARM微處理器中斷響應(yīng)時間的實驗研究[J].計算機工程,2011,37(4):252-254.
[3]李莉,路而紅.ARM異常處理機制[J].燕山大學(xué)學(xué)報,2006,30(4):313-316.
[4]王波.ARM的三種中斷調(diào)試方法的探討[J].微計算機信息,2006,22(2):130-131.
[5]周智俊.ARM調(diào)試系統(tǒng)的研究與實現(xiàn)[D].成都:電子科技大學(xué),2008.
[6]楊東.ARM嵌入式系統(tǒng)異常調(diào)試的研究和實現(xiàn)[D].上海:上海交通大學(xué),2009.
[7]Advanced RISC Machines Ltd.ARM9TDMI technical reference manual[EB/OL].[2011-09-01].http://infocenter.arm.com/help/index.jsp.
[8]Advanced RISC Machines Ltd.ARM920T technical reference manual[EB/OL].[2011-09-01].http://infocenter.arm.com/help/index.jsp.
[9]Samsung Electronics Co Ltd.S3C2440A 32-Bit CMOS microcontroller user's manual[S/OL].[2011-09-01].http://www.samsungsemi.com.
[10]OPEN-JTAG開發(fā)小組.ARM JTAG調(diào)試原理[EB/OL].[2011-09-01].http://www.hjtag.com/download.html.
[11]陸晗,潘雪增,平玲娣.基于JTAG的ARM調(diào)試器實現(xiàn)[J].計算機應(yīng)用與軟件,2007,24(2):137-139.
[12]黃光紅,洪一,耿銳,等.多處理器陣列的JTAG調(diào)試系統(tǒng)設(shè)計[J].計算機工程,2010,36(14):224-226.
[13]徐愛鈞.IAR EWARM V5嵌入式系統(tǒng)應(yīng)用編程與開發(fā)[M].北京:北京航空航天大學(xué)出版社,2009:310-383.
Debugging Technique for ARM Exception Programs Based on External RAM
YAO Mao-qun1,2,YE Han-neng2,ZHAO Wu-feng3,YAN Jia-ning4
(1.Qianjiang College,Hangzhou Normal University,Hangzhou 310012,China;2.College of Information Science and Engineering,Hangzhou Normal University,Hangzhou 310036,China;3.Deptment of Information Science and Electronic Engineering,Zhejiang University,Hangzhou 310027,China;4.Books Information Center,Zhejiang Medical College,Hangzhou 310053,China)
Based on the basic ideas of exception handling in ARM and the basic principles of debugging with JTAG,the principles and characteristics of different ARM program debugging techniques,which are based on exteranl RAM and for exception handling,were analysed in the paper.Comparing the applicability as well as merits and faults of various debugging techniques,with the commonly used ARM chips and integrated development tools in embedded system development,a new kind of debugging technique in the external RAM for ARM programs,which have exception handling codes,was proposed,and its effectiveness was verified by means of experiments.
exception handling;JTAG;external RAM;ARM;debugging technique;embedded system
TP391.4
A
1674-232X(2012)03-0275-05
10.3969/j.issn.1674-232X.2012.03.017
2011-11-22
姚茂群(1967-),女,教授,博士,主要從事數(shù)字集成電路設(shè)計、智能控制研究.E-Mail:yaomaoqun@163.com