基于嵌入式處理器的在線調(diào)試方法的研究
嵌入式處理器構(gòu)成的系統(tǒng)相比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)常需要使用上述處理器。使用上述處理器時(shí),由于沒有調(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í)對多行代碼設(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)中有多個(gè)處理器時(shí)可以共用一個(gè)UDM。
對于沒有調(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ī),同時(shí)還能夠接收調(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)試的方法。
使用UDM 的調(diào)試系統(tǒng),利用與FPGA 同在一塊PCB 板上的ARM、DSP 等處理器作為輔助調(diào)試用的嵌入式處理器( 下文中簡稱為輔助處理器) ,簡化了UDM 與調(diào)試主機(jī)之間的通信。通過輔助處理器的總線接口,UDM 中的各種控制和數(shù)據(jù)寄存器被直接映射到輔助處理器的Memory 空間。
在輔助處理器開發(fā)工具的Memory 窗口直接進(jìn)行數(shù)據(jù)讀寫操作,就可實(shí)現(xiàn)對UDM 的操控。由于在一塊PCB 板上同時(shí)集成FPGA 和嵌入式處理器芯片是很常見的設(shè)計(jì),因此這種通信方式適用的范圍很廣。
UDM 直接作為FPGA 外部輔助調(diào)試的嵌入式處理器的外設(shè),如果在外部處理器總線掛接多個(gè)UDM 模塊,就能實(shí)現(xiàn)同時(shí)對多個(gè)處理器進(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 時(shí)可通過其總線接口訪問UDM,從而實(shí)現(xiàn)調(diào)試信息的輸出和對調(diào)試命令的響應(yīng)。
產(chǎn)生DI 時(shí)由于處理器會立即執(zhí)行DR,從而中斷正常的執(zhí)行流程轉(zhuǎn)為為調(diào)試服務(wù),因此決定DI 產(chǎn)生的時(shí)機(jī)是實(shí)現(xiàn)斷點(diǎn)機(jī)制的核心。DI 信號是通過監(jiān)測處理器的取指令地址( InstrucTIon Address, IA)產(chǎn)生的。直接通過一個(gè)比較器將IA 與一個(gè)數(shù)據(jù)比較一次只能設(shè)置一個(gè)斷點(diǎn),為了解決此矛盾采用了如下方法: 在UDM 中用雙口RAM 存儲斷點(diǎn)配置信息,使RAM 中的每1bit 與程序存儲區(qū)的一個(gè)地址對應(yīng)起來,數(shù)據(jù)為1 代表設(shè)置了斷點(diǎn),0 代表沒有。
將輸入的IA 進(jìn)行地址變換后對RAM 存儲區(qū)尋址,使得RAM 在一端輸出一個(gè)正好代表輸出的地址處是否設(shè)置了斷點(diǎn)信息,再根據(jù)此數(shù)據(jù)就可生成正確的DI 信號。在雙口RAM 的另外一端,斷點(diǎn)設(shè)置情況可以方便地被修改。這樣一來可以設(shè)置的斷點(diǎn)個(gè)數(shù)變?yōu)橹饕躑DM 中雙口RAM 容量限制了。
只需在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ù)。