一種新的嵌入式處理器在線調(diào)試方法
3. 2 斷點(diǎn)設(shè)置機(jī)制
產(chǎn)生DI 時(shí)由于處理器會(huì)立即執(zhí)行DR,從而中斷正常的執(zhí)行流程轉(zhuǎn)為為調(diào)試服務(wù),因此決定DI 產(chǎn)生的時(shí)機(jī)是實(shí)現(xiàn)斷點(diǎn)機(jī)制的核心。DI 信號(hào)是通過(guò)監(jiān)測(cè)處理器的取指令地址( Instruction Address, IA)產(chǎn)生的。直接通過(guò)一個(gè)比較器將IA 與一個(gè)數(shù)據(jù)比較一次只能設(shè)置一個(gè)斷點(diǎn),為了解決此矛盾采用了如下方法: 在UDM 中用雙口RAM 存儲(chǔ)斷點(diǎn)配置信息,使RAM 中的每1bit 與程序存儲(chǔ)區(qū)的一個(gè)地址對(duì)應(yīng)起來(lái),數(shù)據(jù)為1 代表設(shè)置了斷點(diǎn),0 代表沒(méi)有。
將輸入的IA 進(jìn)行地址變換后對(duì)RAM 存儲(chǔ)區(qū)尋址,使得RAM 在一端輸出一個(gè)正好代表輸出的地址處是否設(shè)置了斷點(diǎn)信息,再根據(jù)此數(shù)據(jù)就可生成正確的DI 信號(hào)。在雙口RAM 的另外一端,斷點(diǎn)設(shè)置情況可以方便地被修改。這樣一來(lái)可以設(shè)置的斷點(diǎn)個(gè)數(shù)變?yōu)橹饕躑DM 中雙口RAM 容量限制了。
3. 3 調(diào)試服務(wù)程序
只需在DR 中保證處理器不對(duì)目標(biāo)程序的內(nèi)外部環(huán)境造成改變,就等效于實(shí)現(xiàn)了處理器的掛起功能。因此,需要將DR 和目標(biāo)程序的執(zhí)行環(huán)境隔離開(kāi)來(lái),這可以通過(guò)對(duì)編譯器進(jìn)行某些設(shè)置或強(qiáng)制的編碼規(guī)范來(lái)實(shí)現(xiàn)。在處理器被掛起之后,DR 與外部調(diào)試主機(jī)通信,通過(guò)查詢命令寄存器的方式響應(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 個(gè)8 位通用寄存器、64 字節(jié)RAM 構(gòu)成的暫存器、程序計(jì)數(shù)器和控制器以及中斷支持電路構(gòu)成,其代碼容量為1024。本節(jié)以針對(duì)PicoBlaze 的應(yīng)用為例,設(shè)計(jì)了一個(gè)具體的UDM,并在Spartan3S5000FPGA 上進(jìn)行了實(shí)際驗(yàn)證。該UDM 使用的硬件資源為1 個(gè)18KB BRAM 和62 個(gè)Spartan - 3邏輯片,軟件資源為61 行匯編代碼,具備的功能如下:
·可同時(shí)在每一行代碼處設(shè)置斷點(diǎn),在沒(méi)有設(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)行時(shí)可以刷新上述調(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 端口寫(xiě)入數(shù)據(jù)。為了減少占用PicoBlaze 的I /O端口,PicoBlaze 在向雙口RAM 寫(xiě)入數(shù)據(jù)之前先向RAM尋址寄存器寫(xiě)入地址,然后通過(guò)寫(xiě)數(shù)據(jù)輸出寄存器將數(shù)據(jù)寫(xiě)入前一操作指定的地址中。
圖2 UDM 的內(nèi)部電路結(jié)構(gòu)框圖
雙口RAM 的B 端口連接到輔助處理器的總線,數(shù)據(jù)位寬為16,可訪問(wèn)的地址范圍為0 ~ 255,地址0 ~ 165 作為交互調(diào)試數(shù)據(jù)的緩存區(qū),地址192 ~255 用于存儲(chǔ)斷點(diǎn)設(shè)置信息。每一個(gè)寄存器中存放16 行代碼的斷點(diǎn)設(shè)置情況,由于PicoBlaze 的代碼容量為1024 行,故只需占用64 個(gè)寄存器,例如地址為193 的數(shù)據(jù)為0x4080 則表示第24 和31 行設(shè)置了斷點(diǎn)。雙口RAM 的A 端口數(shù)據(jù)位寬為8,在DR 運(yùn)行時(shí)用于輸入調(diào)試信息,在目標(biāo)程序運(yùn)行時(shí)輸出斷點(diǎn)設(shè)置信息。因此在A 端口有一個(gè)地址選擇電路,使得輸入A 端口的地址在不同的情況下分別由RAM尋址寄存器和IA 決定。當(dāng)運(yùn)行目標(biāo)程序時(shí),A 端口輸入的地址為IA 的高7 位加上偏移量0x180,輸出的8bit 數(shù)據(jù)再經(jīng)IA 的低3 位尋址輸出1bit 數(shù)據(jù),這樣得到的數(shù)據(jù)正好反映了與IA 對(duì)應(yīng)的代碼是否設(shè)置了斷點(diǎn)。中斷信號(hào)產(chǎn)生電路根據(jù)上述數(shù)據(jù)和中斷信號(hào)的時(shí)序要求,產(chǎn)生輸出給處理器的DI 信號(hào)。
調(diào)試命令寄存器由PicoBlaze 和輔助處理器共同控制,輔助處理器向該寄存器寫(xiě)不同的數(shù)代表不同的調(diào)試命令。在運(yùn)行DR 時(shí)通過(guò)查詢?cè)摷拇嫫鱽?lái)實(shí)現(xiàn)對(duì)各種調(diào)試命令的響應(yīng),在響應(yīng)調(diào)試命令之前PicoBlaze 將調(diào)試命令寄存器清0,作為與輔助處理器的握手操作機(jī)制。當(dāng)向調(diào)試命令寄存器寫(xiě)3 時(shí),不管是否設(shè)置了斷點(diǎn)都會(huì)立即產(chǎn)生DI 信號(hào)。
4. 2 軟件實(shí)現(xiàn)
在基于PicoBlaze 的應(yīng)用中,為了減少代碼容量,DR 的流程比較簡(jiǎn)單。在初始化準(zhǔn)備之后,依次將s0 ~ sb 寄存器、64byte 的內(nèi)部RAM,Memory 空間中的數(shù)據(jù)輸出到雙口RAM 中,然后陷入一個(gè)等待和處理調(diào)試命令的循環(huán)中。目標(biāo)程序和DR 執(zhí)行環(huán)境的隔離通過(guò)限制目標(biāo)程序只允許修改寄存器s0 ~sb 以及64byte 的內(nèi)部RAM,而DR 只允許修改寄存器se ~ sf 來(lái)實(shí)現(xiàn)。只有當(dāng)調(diào)試命令為退出調(diào)試時(shí),DR 程序才會(huì)結(jié)束,PicoBlaze 又返回到目標(biāo)程序的執(zhí)行。當(dāng)調(diào)試命令為刷新調(diào)試信息時(shí),PicoBlaze 將重復(fù)一次初始化和調(diào)試信息輸出的過(guò)程。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論