Semihosting(半主機)
What is semihosting?
使用ARM所開發的目標系統(target system),不一定會提供所有的輸入/輸出設備。因此ARM公司設計了Semihost這種機制,讓運行ARM debugger的主機可以與目標系統進行I/O溝通,以利產品開發。例如:可以透過呼叫printf()將資料列印到主機螢幕,而呼叫scanf()可以讀取主機鍵盤的輸入。如下圖:
Semihosting原理
Semihost的實作是透過使用定義好的軟體中斷(SVCs),使程式在執行過程中產生中斷。一旦目標系統上的程式呼叫到對應的指令(semihosting
call),便產生軟體中斷,接著Debug Agent 就會負責處理此中斷,進行與主機的溝通。由
ARM 所提供的 Debug Agent有以下幾個:
l RealView ARMulatorR ISS (RVISS),
l Instruction Set System Model (ISSM),
l RealView ICE,
l Multi-ICER, or
l RealMonitor
當Debug Agent處理指令時,可以經由SVC的中斷編號得知,此次的軟體中斷是否屬於 semihost request。其對應的編號可能是 0xAB或0x123456
l SVC 0x12346 (in ARM state)
l SVC 0xAB (in thumb state)
l BKPT 0xAB (for ARMv7-M,
Thumb2-only)
每個semihosting request都有一個對應的號碼(semihosting operation number)用來表示其運作方式。為了要區別這些不同的運作方式,ARM定義,當使用semihosting request 時,r0用來傳送此運算型態,而r1則用來傳送其他的參數。而其執行結果則透過r0回傳。
Semihost 目前所支援的運作方式如下:
SVC
|
Description
|
Semihost operation number的定義
l 0x00 to 0x31 (提供ARM使用,其功能參考上表)
l 0x32 to 0xFF (保留以後供ARM使用)
l 0x100 to 0x1FF (保留供其他應用使用,此部份不會被ARM使用,若要開發自己的軟體中斷可以使用此部分)
l 0x200 to 0xFFFFFFFF (未定義,強烈建議不要使用此部份)
Semihosting in NXP LPC1114
以板子NXP LPC1114(Cortex-M0) 為例,其範例已經提供了一個debug_printf.c的檔案,只要直接在開發專案中加入此檔案,並且連結small_printf.lib,就可以使用semihost的功能。執行畫面摘錄如下:
註1:此處SVC = SWI
註2:semihosting calls對應的指令,若是ARM7則使用SWI或SVC指令。若是Cortex-M3 則使用 BKPT指令。
參考資料