在ADS的C語言函數庫中,某些ANSIC的功能是由主機的調試環境來提供的,這套機制有一個專門術語叫Semihosting。Semihosting通過一組軟件中斷(SWI)指令來實現。當一個Semihosting軟中斷被執行時,調試系統先識別這個SWI請求,然後掛起正在運行的程序,調用Semihosting的服務,完成後再恢復原來的程序執行。因此,主機執行的任務對於程序來說是透明的
從概念上來講,C語言庫函數可以被分成兩部分,一是ANSIC語言規範本身的一部分,一是隻受某一特定ANSIC層次支持的函數,如圖2所示。其中一些ANSIC的功能是由主機調試環境調用驅動程序級的函數完成的。例如,ADS的庫函數printf()把輸出信息輸出到調試器的控制檯窗口,這個功能通過調用__sys_write()實現,__sys_write()執行了一個把字符串輸出到主機控制檯的Semihosting軟中斷服務程序
如果用戶在程序編譯時沒有提供指定映象的存儲器分佈,ADS將爲生成的目標代碼和數據分配一個缺省的存儲器映射圖。
目標映象被連接到0x8000處,存儲和執行區域都位於該地址空間。從前至後,依次爲RO(只讀)、RW(讀寫)和ZI(零初始化)部分。在ZI部分之上爲HEAP,故HEAP的確切地址在連接時才能確定。但是STACK的基地址是在運用程序啓動時由Semihosting操作提供。ARMulator返回配置文件peripherals.ami中的設置值,缺省爲0x08000000。Multi-ICE返回的是調試器內部變量top_of_memory的值,缺省爲0x00080000。
連接器佈局規則
int fputc(int ch,FILE *f)
{
/*e.g.write a character to an UART*/
char tempch=ch;
sendchar(&tempch);
return ch;
}