嵌入式軟件開發之:編譯器的缺省行為
13.2 編譯器的缺省行為
多數嵌入式應用程序最初都是在原型環境下開發的。無論什么樣的原型仿真環境與最終產品環境都是有差異的。因此,考慮如何將嵌入式應用程序從其所依賴的開發工具或調試環境中移植到在目標硬件上獨立運行是非常重要的。
開始編寫嵌入式應用程序時,開發者可能并不清楚目標硬件的具體規格。如,目標系統使用了什么樣的外圍設備、存儲器映射情況甚至不能確定處理器的型號。
為在了解這些詳細信息前能夠繼續軟件的開發,RVCT工具提供了很多默認的操作,使用戶能編譯和調試與目標系統無關的應用程序代碼。下面詳細介紹這些編譯選項,只有深入了解這些編譯選項設置,才能使開發更順利的進行。
13.2.1 Semihosting
1.Semihosting簡介
在RVCT C庫中,對某些ISO C功能的支持由主機調試環境提供。提供該功能的機制被稱為Semihostin[1]。大多數的ARM調試系統都支持Semihosting機制,如ReslView Debugger AXD等。
調試系統提供這種機制是非常有用的,因為用于開發使用的硬件系統經常沒有最終系統的所有輸入和輸出設備。在這種情況下,Semihosting可讓主機代替目標系統提供這些設備的功能。舉例來說,此機制可以用于啟用C庫中的函數(例如,printf()和scanf())使用主機的屏幕和鍵盤,而不使用目標系統的屏幕和鍵盤。
半主機由一組已定義的SWI操作來實現。應用程序調用相應的SWI,然后由調試代理程序(Debug Agent)處理SWI異常。調試代理程序完成系統與主機之間的通信。
圖13.1顯示了Semihosting機制的處理過程。
圖13.1 Semihosting機制的處理過程
在很多情況下,Semihosting SWI由庫函數內的代碼調用。應用程序也可以直接調用。支持ARM C庫中Semihosting的詳細信息,請參閱ARM相關文檔。
2.Semihosting軟件接口
ARM和Thumb SWI指令包含一個軟中斷號,該中斷號可以被應用程序使用。此編號可以由系統中的SWI處理程序進行解碼。有關SWI處理程序的詳細信息,請參閱本書中ARM異常處理一節。
Semihosting使用固定的中斷號調用相應的處理程序。用于Semihosting的SWI是:
· 0x123456(在ARM狀態下);
· 0xAB(在Thumb狀態下)。
注意 | 用戶在編寫自己的中斷處理程序時,避免使用Semihosting已經使用的中斷向量號。 |
調試代理通過SWI的中斷向量號識別該軟中斷是目標系統提出的Semihosting請求。具體是何種Semihosting請求(鍵盤輸入請求或屏幕顯示請求),通過向寄存器r0傳遞不同的參數進行區分。所有其他參數通過一個數據塊進行傳遞。該數據塊的地址通過寄存器r1傳遞給中斷處理程序。軟中斷的處理結果放在r0中返回,也可以通過顯式的返回值或傳遞數據塊的指針帶回程序的處理結果。即使未返回結果,也假定r0是被使用的。
用r0傳遞的可用Semihosting操作編號分配如下:
· 0x00-0x31 這些編號由ARM公司使用;
· 0x32-0xFF 這些編號由ARM公司保留,以備將來使用;
· 0x100-0x1FF 這些編號保留給用戶應用程序。
注意 | 雖然這些編號ARM公司不使用,用戶可以使用這些編號編寫自己的SWI操作,但建議使用其他 SWI 編號,而不要使用Semihosting SWI 編號和這些Semihosting的預留操作類型編號。 |
· 0x200-0xFFFFFFFF這些編號未定義。當前未使用并且不推薦使用這些編號。
在以下部分中,操作名稱之后的括號中的編號是調用Semihosting操作時放入r0的值。例如,SYS_OPEN(0x01)。
如果從匯編語言代碼中調用SWI,最好使用semihost.h中定義的操作名稱。可以用 EQU 偽操作定義操作名稱。例如:
SYS_OPEN EQU 0x01
SYS_CLOSE EQU 0x02
評論