天天看點

RISC-V學習筆記【調試】蜂鳥E203的開源調試實作

蜂鳥E203的開源調試實作

蜂鳥E203在處理器核心外內建了一套調試外設,能夠支援完整的GDB調試功能,并可以通過openocd經由jtag接口實作線上調試

調試機制

互動調試Interactive Debug

互動調試是處理器提供的最常見的一種調試功能,指調試器軟體能夠直接對處理器取得控制權,進而對其以一種互動的方式進行調試

一般的互動調試要求調試軟體能夠控制處理器實作以下功能:

  • 下載下傳、啟動程式
  • 通過設定各種特定條件來停止程式
  • 檢視并改變處理器的運作狀态
  • 檢視通用寄存器、存儲器位址的值
  • 檢視并改變程式狀态(包括變量值、函數狀态)

對于嵌入式裝置,調試軟體一般運作在上位機,被調試的處理器往往位于開發闆上,這被稱為遠端調試

是以需要硬體支援通過實體媒體(典型的JTAG接口)與主機端調試軟體進行通信接收器控制,處理器核直接受到硬體調試子產品的控制

常見的調試過程可以如下概括:

  1. 開發者運作調試軟體,并在某條程式處設定斷點調試
  2. 調試軟體通過底層驅動JTAG接口通路遠端處理器的調試子產品并将斷點資訊傳遞給調試子產品
  3. 調試子產品得到指令後會請求處理器核心運作停止
  4. 調試子產品根據斷點資訊修改對應指令的PC位址的指令,将其替換為一個Breakpoint指令
  5. 請求恢複處理器核心運作
  6. 處理器核心恢複運作
  7. 執行到對應的指令PC位址,遇到Breakpoint指令
  8. 核心産生Debug異常,自動跳轉到調試模式的異常服務程式
  9. 調試子產品檢測到處理器核心進入調試模式的異常服務程式,将資訊回傳到上位機
  10. 開發者運作主機端的調試軟體并設定讀取某個寄存器的值
  11. 調試軟體會通過JTAG接口通路遠端處理器的調試子產品,并令其回傳某個寄存器的值
  12. 調試子產品開始對處理器核心進行控制,将寄存器的值讀取出來,并進行回傳
  13. 調試軟體檢測到調試子產品回傳,通過JTAG接口将資料傳回上位機并進行顯示

其他調試指令大同小異,都是一整套複雜的軟硬體協同過程

互動式調試的弊端就是對于處理器的運作具有打擾性,對某些對時間先後性有依賴的程式無法重制bug,并且對于某些需要外界觸發的bug(比如MCU中常見的GPIO外部中斷)無法進行檢測

由此出現了跟蹤調試機制

追蹤調試Trace Debug

追蹤調試又叫跟蹤調試:調試器隻跟蹤記錄處理器核心所執行過的所有程式指令,不會打斷幹擾處理器的執行過程

相比互動式調試的實作難度更大,産生的資訊量更是大到不可描述的地步

是以隻有财大氣粗的高端處理器才可能搭載這種技術

不排除有閑的蛋疼的dalao給自己寫的cpu配備追蹤調試(霧)

蜂鳥E203的調試功能

RISC-V基金會還未釋出标準的RISC-V調試架構文檔,但是根據目前的候選文檔,要求處理器實作特殊的“調試模式”,并且定義了若幹觸發條件,是以可以将RISC-V的調試模式看作一種特殊的異常。當進入調試模式時,處理器會進行如下更新:

  1. PC跳轉到0x800位址
  2. 将處理器正在執行的指令PC儲存到CSR->dpc中
  3. 将引發進入調試模式的觸發原因儲存到CSR->dcsr中

同時,RISC-V标準指令集中已經定義了一條特殊的斷點指令ebreak,該指令主要用于調試軟體設定斷點——當處理器運作到這條指令時會自動跳轉到異常模式或調試模式,同時候選文檔中規定了一個特殊的dret指令,執行到該指令時,處理器PC将跳轉到儲存在SCR->dpc中的值(處理器退回到之前進入調試模式前的程式執行點),并将CSR->dcsr寄存器中的域清除掉(訓示處理器退出調試模式)。此外,候選文檔中還定義處理器應支援調試中斷,處理器核收到該中斷後将進入調試模式

蜂鳥E203的硬體調試機制就基于該方案實作,目前蜂鳥E203僅支援互動式調試,不支援追蹤調試

蜂鳥E203的調試實作

調試主機即PC端上位機,使用GDB與蜂鳥E203進行通信,在蜂鳥的實作中,GDB現與Gdbserver進行通信,Gdbserver使用開源軟體OpenOCD充當。由于OpenOCD的源碼中包含了各種常見硬體晶片的驅動(如FTDI的USB轉JTAG晶片),可以直接使用對應晶片的USB接口與調試主機的USB接口連接配接。上位機的總線時序使用片上的DTM子產品進行解析。被解析後的調試總線時序被傳輸到硬體調試子產品中,該子產品統籌整個調試機制。

DTM子產品

該子產品使用FSM對JTAG協定進行解析并轉換成調試總線,由于DTM子產品處于JTAG時鐘域,與調試總線要通路的調試子產品不屬于同一個時鐘域,是以需要被同步

硬體調試子產品

可以通路/rtl/e203/debug/sirv_debug_module.v、/rtl/e203/debug/sirv_debug_ram.v、/rtl/e203/debug/sirv_debug_rom.v這三個檔案來翻閱硬體調試子產品的源代碼

調試中斷會被該子產品生成并作為一根輸入信号輸送給處理器的傳遞子產品。調試終端一旦被接受,就會引起流水線沖刷,取消後續的指令并向IFU子產品發送沖刷請求,将重新取指的PC改為0x800

其他操作根據候選文檔中指明的調試機制實作,可檢視官方文檔。

繼續閱讀