一種新的嵌入式處理器在線調(diào)試方法
摘要: 針對嵌入式處理器在FPGA 中的應(yīng)用現(xiàn)狀,通過引入通用的調(diào)試模塊,實(shí)現(xiàn)了對沒有調(diào)試接口的嵌入式處理器進(jìn)行在線調(diào)試的功能。所設(shè)計(jì)的調(diào)試模塊通過引入專用的調(diào)試中斷及與之對應(yīng)的調(diào)試服務(wù)程序?qū)崿F(xiàn)一種處理器響應(yīng)斷點(diǎn)( breakpoint) 的機(jī)制,并基于雙端口RAM 中一種巧妙的地址映射機(jī)制實(shí)現(xiàn)同時對多行代碼設(shè)置斷點(diǎn)的功能。實(shí)際的工程應(yīng)用情況表明,新的調(diào)試方法擴(kuò)展了對小型嵌入式處理器進(jìn)行調(diào)試的手段,明顯提高了開發(fā)效率。
1 引言
在FPGA 設(shè)計(jì)中使用嵌入式處理器軟核( 如MicroBlaze、PicoBlaze 等) 構(gòu)成可編程片上系統(tǒng)( SystemOn Programmable Chip,SOPC) ,相比于ASIC 具有更好的可修改性和可維護(hù)性,得到了普遍的應(yīng)用。由于ARM,MicroBlaze 等大型處理器內(nèi)核具備調(diào)試接口,在與之對應(yīng)的調(diào)試模塊配合下,調(diào)試軟件可以通過JTAG 接口實(shí)現(xiàn): 執(zhí)行到斷點(diǎn)處掛起、單步執(zhí)行、查看處理器內(nèi)部狀態(tài)、查看和修改Memory空間中的數(shù)據(jù)等基本的在線調(diào)試功能。上述基本的在線調(diào)試功能對嵌入式系統(tǒng)的調(diào)試具有重要意義。
對于PicoBlaze 等占用資源少、設(shè)計(jì)開發(fā)簡單的小巧型處理器,一般不具備調(diào)試接口,然而在SOPC系統(tǒng)設(shè)計(jì)中經(jīng)常需要使用上述處理器。使用上述處理器時,由于沒有調(diào)試接口,屬于大型處理器的標(biāo)準(zhǔn)高效的調(diào)試機(jī)制不再能夠使用,因此通過指令集仿真( ISS,Cycle - accurate Instruction Set Simulation) 和利用仿真工具對含有處理器的系統(tǒng)進(jìn)行軟硬件協(xié)同仿真是確保設(shè)計(jì)正確性的重要途徑。然而在諸如接收機(jī)基帶信號處理等系統(tǒng)的設(shè)計(jì)中,仿真所用的測試用例往往覆蓋率不夠,或者在發(fā)現(xiàn)故障以后很難構(gòu)造出與之相應(yīng)的測試用例。因此迫切需要使在線調(diào)試功能能夠方便地?cái)U(kuò)展到一般的處理器上。
針對上述應(yīng)用需求,這里提出的新調(diào)試方法通過引入一種通用的調(diào)試模塊( Universal Debug Module,UDM) 可以使沒有調(diào)試接口的處理器建立起標(biāo)準(zhǔn)的調(diào)試機(jī)制。該調(diào)試模塊利用處理器的中斷機(jī)制實(shí)現(xiàn)處理器響應(yīng)斷點(diǎn)( breakpoint) 的機(jī)制,利用基于雙端口RAM 中一種巧妙的地址映射機(jī)制實(shí)現(xiàn)同時對多行代碼設(shè)置斷點(diǎn)的功能,并且能夠方便地實(shí)現(xiàn)被調(diào)試系統(tǒng)和調(diào)試主機(jī)之間調(diào)試信息和命令的交互。UDM 還具有易于擴(kuò)展的優(yōu)點(diǎn),當(dāng)SOPC 系統(tǒng)中有多個處理器時可以共用一個UDM。
2 在線調(diào)試的一般原理
嵌入式處理器的主流在線調(diào)試方法,目前主要有2 種: 后臺調(diào)試模式( backgroud debug mode,BDM) 技術(shù)和基于IEEE P1149. 1 協(xié)議的JTAG 調(diào)試技術(shù)。BDM 技術(shù)在Motolora 微控制器中得到了大量的應(yīng)用,ARM,MIPS 和PowerPC 等處理器都具有基于JTAG 技術(shù)的在片調(diào)試功能,如ARM 公司提出了基于JTAG 技術(shù)的RDI 調(diào)試接口標(biāo)準(zhǔn),主要用于ARM 芯片的調(diào)試。處理器內(nèi)核中通過增加支持調(diào)試的擴(kuò)展設(shè)計(jì),可在預(yù)留的調(diào)試接口輸入簡單的控制信號,以實(shí)現(xiàn): 處理器掛起( Halt) 、輸出PC 值和通用寄存器值、輸出和修改Memory 空間中的數(shù)據(jù)等基本的原始調(diào)試操作。通常上述調(diào)試接口的設(shè)計(jì)與指令集架構(gòu)相關(guān),如MIPS32 提供如下一些調(diào)試方法: ①斷點(diǎn)指令BREAK; ②一些自陷指令TRAP; ③特殊控制寄存器WATCH,通過編程使得特定的load /store 操作以及取指操作產(chǎn)生特殊的例外;④一種基于TLB 的MMU,通過編程使得訪問任意存儲器頁都可以產(chǎn)生特定的例外。
對于沒有調(diào)試接口的處理器目前主要是通過在軟件和硬件設(shè)計(jì)中充分考慮可能的調(diào)試需求,再加上調(diào)試主機(jī)和被調(diào)試系統(tǒng)之間的通信機(jī)制來實(shí)現(xiàn)在線調(diào)試的。這種調(diào)試模式下,調(diào)試代碼需要插入到正常程序中,將調(diào)試信息輸出到調(diào)試主機(jī),同時還能夠接收調(diào)試主機(jī)發(fā)過來的命令做出各種響應(yīng)。該方法的主要缺陷是針對不同的調(diào)試需求,要不斷修改正常程序中的調(diào)試代碼,導(dǎo)致標(biāo)準(zhǔn)化和通用性程度不高。此處的UDM 在不對處理器內(nèi)核做修改的情況下即可使這類處理器建立起方便的調(diào)試機(jī)制,是一種不同于主流大型處理器實(shí)現(xiàn)在線調(diào)試的方法。
3 通用調(diào)試模塊( UDM) 的工作原理
3. 1 系統(tǒng)描述
使用UDM 的調(diào)試系統(tǒng)框圖如圖1 所示,利用與FPGA 同在一塊PCB 板上的ARM、DSP 等處理器作為輔助調(diào)試用的嵌入式處理器( 下文中簡稱為輔助處理器) ,簡化了UDM 與調(diào)試主機(jī)之間的通信。通過輔助處理器的總線接口,UDM 中的各種控制和數(shù)據(jù)寄存器被直接映射到輔助處理器的Memory 空間。在輔助處理器開發(fā)工具的Memory 窗口直接進(jìn)行數(shù)據(jù)讀寫操作,就可實(shí)現(xiàn)對UDM 的操控,如圖4、圖5 所示。由于在一塊PCB 板上同時集成FPGA 和嵌入式處理器芯片是很常見的設(shè)計(jì),因此這種通信方式適用的范圍很廣。
圖1 應(yīng)用UDM 的調(diào)試系統(tǒng)框圖
UDM 直接作為FPGA 外部輔助調(diào)試的嵌入式處理器的外設(shè),如果在外部處理器總線掛接多個UDM 模塊,就能實(shí)現(xiàn)同時對多個處理器進(jìn)行調(diào)試。
UDM 通過產(chǎn)生調(diào)試中斷( DeBug Interrupt,DI) 信號,使處理器響應(yīng)中斷并調(diào)用調(diào)試服務(wù)程序( DebugRoutine,DR) 。UDM 通過監(jiān)測處理器的取指令地址( Instruction Address, IA) 產(chǎn)生DI 信號。PicoBlaze 在運(yùn)行DR 時可通過其總線接口訪問UDM,從而實(shí)現(xiàn)調(diào)試信息的輸出和對調(diào)試命令的響應(yīng)。
[!--empirenews.page--]
3. 2 斷點(diǎn)設(shè)置機(jī)制
產(chǎn)生DI 時由于處理器會立即執(zhí)行DR,從而中斷正常的執(zhí)行流程轉(zhuǎn)為為調(diào)試服務(wù),因此決定DI 產(chǎn)生的時機(jī)是實(shí)現(xiàn)斷點(diǎn)機(jī)制的核心。DI 信號是通過監(jiān)測處理器的取指令地址( Instruction Address, IA)產(chǎn)生的。直接通過一個比較器將IA 與一個數(shù)據(jù)比較一次只能設(shè)置一個斷點(diǎn),為了解決此矛盾采用了如下方法: 在UDM 中用雙口RAM 存儲斷點(diǎn)配置信息,使RAM 中的每1bit 與程序存儲區(qū)的一個地址對應(yīng)起來,數(shù)據(jù)為1 代表設(shè)置了斷點(diǎn),0 代表沒有。
將輸入的IA 進(jìn)行地址變換后對RAM 存儲區(qū)尋址,使得RAM 在一端輸出一個正好代表輸出的地址處是否設(shè)置了斷點(diǎn)信息,再根據(jù)此數(shù)據(jù)就可生成正確的DI 信號。在雙口RAM 的另外一端,斷點(diǎn)設(shè)置情況可以方便地被修改。這樣一來可以設(shè)置的斷點(diǎn)個數(shù)變?yōu)橹饕躑DM 中雙口RAM 容量限制了。
3. 3 調(diào)試服務(wù)程序
只需在DR 中保證處理器不對目標(biāo)程序的內(nèi)外部環(huán)境造成改變,就等效于實(shí)現(xiàn)了處理器的掛起功能。因此,需要將DR 和目標(biāo)程序的執(zhí)行環(huán)境隔離開來,這可以通過對編譯器進(jìn)行某些設(shè)置或強(qiáng)制的編碼規(guī)范來實(shí)現(xiàn)。在處理器被掛起之后,DR 與外部調(diào)試主機(jī)通信,通過查詢命令寄存器的方式響應(yīng)調(diào)試主機(jī)發(fā)出的各種調(diào)試命令。這些命令包括: 將有關(guān)的調(diào)試信息搬移到外部調(diào)試主機(jī)可以觀察的緩存區(qū)中、修改Memory 空間中的數(shù)據(jù)、退出DR 使目標(biāo)程序繼續(xù)執(zhí)行等。由于DR 必須與目標(biāo)程序使用相互隔離的資源并且小型處理器中代碼容量,外部Memory空間大小等都比較受限,因此DR 的設(shè)計(jì)應(yīng)該盡可能占用較少的端口數(shù)、通用寄存器數(shù)和代碼總行數(shù)。
4 設(shè)計(jì)實(shí)例
Xilinx 公司的PicoBlaze 是一種常用的小巧型處理器,它由ALU、程序計(jì)數(shù)器棧( 適用于嵌套子程序) 、16 個8 位通用寄存器、64 字節(jié)RAM 構(gòu)成的暫存器、程序計(jì)數(shù)器和控制器以及中斷支持電路構(gòu)成,其代碼容量為1024。本節(jié)以針對PicoBlaze 的應(yīng)用為例,設(shè)計(jì)了一個具體的UDM,并在Spartan3S5000FPGA 上進(jìn)行了實(shí)際驗(yàn)證。該UDM 使用的硬件資源為1 個18KB BRAM 和62 個Spartan - 3邏輯片,軟件資源為61 行匯編代碼,具備的功能如下:
·可同時在每一行代碼處設(shè)置斷點(diǎn),在沒有設(shè)置斷點(diǎn)的情況下,可強(qiáng)制產(chǎn)生DI,從而運(yùn)行DR 輸出調(diào)試信息;
·可以觀察到的調(diào)試信息為: 程序計(jì)數(shù)器PC的值、s0 ~ sb 寄存器、64byte 的暫存器,Memory 空間中的數(shù)據(jù),在DR 運(yùn)行時可以刷新上述調(diào)試信息。
4. 1 硬件實(shí)現(xiàn)
基于PicoBlaze 處理器應(yīng)用的UDM 硬件結(jié)構(gòu)如圖2 所示。UDM 與調(diào)試終端和PicoBlaze 都有總線接口,因此其內(nèi)部寄存器分為3 類: 僅受PicoBlaze控制,僅受輔助處理器控制以及受二者共同控制。
PicoBlaze 和輔助處理器分別在雙口RAM 的A、B 端口寫入數(shù)據(jù)。為了減少占用PicoBlaze 的I /O端口,PicoBlaze 在向雙口RAM 寫入數(shù)據(jù)之前先向RAM尋址寄存器寫入地址,然后通過寫數(shù)據(jù)輸出寄存器將數(shù)據(jù)寫入前一操作指定的地址中。
圖2 UDM 的內(nèi)部電路結(jié)構(gòu)框圖
雙口RAM 的B 端口連接到輔助處理器的總線,數(shù)據(jù)位寬為16,可訪問的地址范圍為0 ~ 255,地址0 ~ 165 作為交互調(diào)試數(shù)據(jù)的緩存區(qū),地址192 ~255 用于存儲斷點(diǎn)設(shè)置信息。每一個寄存器中存放16 行代碼的斷點(diǎn)設(shè)置情況,由于PicoBlaze 的代碼容量為1024 行,故只需占用64 個寄存器,例如地址為193 的數(shù)據(jù)為0x4080 則表示第24 和31 行設(shè)置了斷點(diǎn)。雙口RAM 的A 端口數(shù)據(jù)位寬為8,在DR 運(yùn)行時用于輸入調(diào)試信息,在目標(biāo)程序運(yùn)行時輸出斷點(diǎn)設(shè)置信息。因此在A 端口有一個地址選擇電路,使得輸入A 端口的地址在不同的情況下分別由RAM尋址寄存器和IA 決定。當(dāng)運(yùn)行目標(biāo)程序時,A 端口輸入的地址為IA 的高7 位加上偏移量0x180,輸出的8bit 數(shù)據(jù)再經(jīng)IA 的低3 位尋址輸出1bit 數(shù)據(jù),這樣得到的數(shù)據(jù)正好反映了與IA 對應(yīng)的代碼是否設(shè)置了斷點(diǎn)。中斷信號產(chǎn)生電路根據(jù)上述數(shù)據(jù)和中斷信號的時序要求,產(chǎn)生輸出給處理器的DI 信號。
調(diào)試命令寄存器由PicoBlaze 和輔助處理器共同控制,輔助處理器向該寄存器寫不同的數(shù)代表不同的調(diào)試命令。在運(yùn)行DR 時通過查詢該寄存器來實(shí)現(xiàn)對各種調(diào)試命令的響應(yīng),在響應(yīng)調(diào)試命令之前PicoBlaze 將調(diào)試命令寄存器清0,作為與輔助處理器的握手操作機(jī)制。當(dāng)向調(diào)試命令寄存器寫3 時,不管是否設(shè)置了斷點(diǎn)都會立即產(chǎn)生DI 信號。
4. 2 軟件實(shí)現(xiàn)
在基于PicoBlaze 的應(yīng)用中,為了減少代碼容量,DR 的流程比較簡單。在初始化準(zhǔn)備之后,依次將s0 ~ sb 寄存器、64byte 的內(nèi)部RAM,Memory 空間中的數(shù)據(jù)輸出到雙口RAM 中,然后陷入一個等待和處理調(diào)試命令的循環(huán)中。目標(biāo)程序和DR 執(zhí)行環(huán)境的隔離通過限制目標(biāo)程序只允許修改寄存器s0 ~sb 以及64byte 的內(nèi)部RAM,而DR 只允許修改寄存器se ~ sf 來實(shí)現(xiàn)。只有當(dāng)調(diào)試命令為退出調(diào)試時,DR 程序才會結(jié)束,PicoBlaze 又返回到目標(biāo)程序的執(zhí)行。當(dāng)調(diào)試命令為刷新調(diào)試信息時,PicoBlaze 將重復(fù)一次初始化和調(diào)試信息輸出的過程。
[!--empirenews.page--]
4. 3 實(shí)際驗(yàn)證和使用情況
在應(yīng)用UDM 之前,首先通過NC - verilog 對其進(jìn)行了仿真,部分仿真波形如圖3 所示。圖中反映的是當(dāng)作為DI 的信號pdm_ int 產(chǎn)生了之后,PicoBlaze怎樣轉(zhuǎn)入執(zhí)行DR 的,限于篇幅,驗(yàn)證其他各種功能的仿真波形不在此贅述。
圖3 UDM 的部分仿真波形
為了進(jìn)一步對UDM 的功能和性能進(jìn)行完備的檢驗(yàn),在FPGA 中建立了如下簡單的PicoBlaze 處理器系統(tǒng)。PicoBlaze 外部只接一塊252X8bit 的RAM和UDM,PicoBlaze 上的目標(biāo)程序流程為如下的死循環(huán): 將s0 ~ sb 依次置入0 ~ 11,再反過來依次置入11 ~ 0; 將64byte 的RAM 依次寫入0 ~ 63,再反過來寫入63 ~ 0; 將外部的RAM 依次寫入0 ~ 251,再反過來寫入255 ~ 4。這樣的一種簡單設(shè)計(jì),可以保證從輸出的調(diào)試信息直接看出處理器在哪行代碼處響應(yīng)了斷點(diǎn)。
如圖4 所示為在調(diào)試主機(jī)上進(jìn)行調(diào)試控制的界面。偏移地址0x184 處的1040 表明在38 與44 兩行代碼處設(shè)置了斷點(diǎn),事實(shí)上從地址0x180 ~ 0x1ff處都可以設(shè)置斷點(diǎn)。地址0x200 處為當(dāng)前的PC 值,通過向地址0x208 處寫1 可使其更新; 地址0x202處為UDM 的使能位,當(dāng)其為1 時UDM 才被使能; 地址0x204 為調(diào)試命令寄存器,向其寫1 使處理器從斷點(diǎn)退出,寫2 使處理器刷新調(diào)試信息,寫3 使處理器強(qiáng)制進(jìn)入DR 輸出調(diào)試信息; 地址0x206 處表示調(diào)試狀態(tài),當(dāng)其為3 時表明處理器在運(yùn)行DR,并且調(diào)試信息已經(jīng)輸出完畢。
圖4 使用UDM 調(diào)試的控制界面
顯示調(diào)試信息的界面如圖5 所示,地址0x00 ~0x0b 顯示寄存器s0 ~ sb 的數(shù)據(jù),地址0x0c ~ 0x3b顯示內(nèi)部64byte 存儲器的數(shù)據(jù),地址0x4c ~ 0x14b顯示PicoBlaze 外部Memory 空間的數(shù)據(jù)。由于圖5中斷點(diǎn)正好設(shè)置在完成依次向PicoBlaze 的Memory空間依次寫0 ~ 251 之后,因此顯示的數(shù)據(jù)是遞增的。當(dāng)斷點(diǎn)正好設(shè)置在完成依次向Pico Blaze 的Memory 空間依次寫255 ~ 4 之后,所顯示的數(shù)據(jù)就變?yōu)檫f減。在很多其他斷點(diǎn)處顯示的調(diào)試信息與斷點(diǎn)設(shè)置的位置也符合預(yù)期的情況,因此UDM 完全可以正確而高效地工作。
圖5 在第44 行斷點(diǎn)處顯示的調(diào)試信息
在開發(fā)一款信號處理芯片的FPGA 原型設(shè)計(jì)中,跟蹤處理、電文處理、整體流程控制分別由一個PicoBlaze 完成,并且由于FPGA 資源的限制采用大型處理器來替代上述處理器幾乎不可能。由于輸入PicoBlaze 的數(shù)據(jù)和控制信號復(fù)雜,仿真驗(yàn)證不能很好地覆蓋各種實(shí)際的使用情形。通過使用這里的基于PicoBlaze 處理器設(shè)計(jì)的UDM,方便地實(shí)現(xiàn)了對上述3 個PicoBlaze 的在線調(diào)試,對提高開發(fā)效率發(fā)揮了重要作用。在其他使用PicoBlaze 的工程應(yīng)用中,上述UDM 也得到了很好的推廣。
5 結(jié)束語
設(shè)計(jì)了一種通用調(diào)試模塊,用于輔助無調(diào)試接口的處理器建立標(biāo)準(zhǔn)的調(diào)試機(jī)制。通過該模塊的使用,提出了一種通用、標(biāo)準(zhǔn)、方便的調(diào)試方法,很好地滿足了在SOPC 系統(tǒng)中對多個沒有調(diào)試接口的小巧型處理器實(shí)現(xiàn)在線調(diào)試的迫切需求。新方法通過產(chǎn)生調(diào)試中斷使處理器跳轉(zhuǎn)到調(diào)試服務(wù)程序中的方式實(shí)現(xiàn)處理器的掛起,通過基于雙端口RAM 中一種巧妙的地址映射機(jī)制實(shí)現(xiàn)同時對多行代碼設(shè)置斷點(diǎn)的功能,通過調(diào)試服務(wù)程序?qū)崿F(xiàn)數(shù)據(jù)搬移等調(diào)試命令。新方法還具有易于擴(kuò)展,可以同時調(diào)試多個嵌入式處理器的優(yōu)點(diǎn)。新的調(diào)試方法在工程實(shí)踐中對提高調(diào)試效率發(fā)揮了重要作用,是一種普適的,應(yīng)用價值明顯的調(diào)試方法。