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