2012年4月4日 星期三

semihosting


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。其對應的編號可能是 0xAB0x123456
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
Open a file on the host
Close a file on the host
Write a character to the console
Write a null-terminated string to the console
Write to a file on the host
Read the contents of a file into a buffer
Read a byte from the console
Determine if a return code is an error
Check whether a file is connected to an interactive device
Seek to a position in a file
Return the length of a file
Return a temporary name for a file
Remove a file from the host
Rename a file on the host
Number of centiseconds since execution started
Number of seconds since January 1, 1970
Pass a command to the host command-line interpreter
Get the value of the C library errno variable
Get the command-line used to call the executable
Get the system heap parameters
Get the number of target ticks since execution started
Determine the tick frequency

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
2semihosting calls對應的指令,若是ARM7則使用SWISVC指令。若是Cortex-M3 則使用 BKPT指令。

參考資料
1.          The semihosting interface