資料介紹
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
3.Semihosting需求函數
Semihosting需要的函數列表如表13.1所示。如果使用默認的Semihosting功能,用戶不需要編寫任何其他代碼。也可以重新實現部分的輸入/輸出函數,使這些函數和標準Semihosting混合使用。
表13.1 Semihosting函數列表
函 數 名 稱描 述
SYS_OPEN (0x01)打開文件
SYS_CLOSE(0x02)關閉使用SYS_OPEN打開的文件
SYS_WRITEC (0x03)向控制臺輸出字符
SYS_WRITE0 (0x04)將空終止的字符串寫入控制臺
SYS_WRITE (0x05)寫入主機上的文件
續表
函 數 名 稱描 述
SYS_READ (0x06)將文件內容讀取到緩存器
SYS_READC (0x07)從控制臺讀取字節
SYS_ISERROR (0x08)確定返回代碼是否錯誤
SYS_ISTTY (0x09)檢查文件是否連接到交互設備
SYS_SEEK (0x0A)搜索到文件中的某個位置
SYS_FLEN (0x0C)返回文件的長度
SYS_TMPNAM (0x0D)返回文件的臨時名稱
SYS_REMOVE (0x0E)刪除主機上的文件
SYS_RENAME (0x0F)重命名主機上的文件
SYS_CLOCK (0x10)執行開始后的厘秒數
SYS_TIME (0x11)1970 年 1 月 1 日到現在的秒數
SYS_SYSTEM (0x12)將命令傳遞給主機命令行解釋程序
SYS_ERRNO (0x13)獲得 C 庫 errno 變量的值
SYS_GET_CMDLINE (0x15)獲得用于調用可執行程序的命令行
SYS_HEAPINFO (0x16)獲得系統堆參數
SYS_ELAPSED (0x30)獲得自執行開始的目標滴答聲數目
SYS_TICKFREQ (0x31)確定滴答聲的頻率
13.2.2 C 庫結構
從概念上來講,C庫函數可被化分成兩類,一類為ISO C語言的規范部分,該部分的主要功能是向用戶提供一個調用接口;另一類為ISO C語言規范提供支持。圖13.2顯示了這兩類函數在C庫中的結構。

圖13.2 C庫的函數結構
對部分ISO C功能的支持是由主機調試環境在支持函數的設備驅動程序級別提供的。
例如,RVCT C庫通過寫入調試器控制臺窗口來實現ISO C printf()系列函數。通過調用__sys_write()來提供該功能。這是一個執行半主機SWI的支持函數,使字符串被寫入到控制臺。
多數嵌入式應用程序最初都是在原型環境下開發的。無論什么樣的原型仿真環境與最終產品環境都是有差異的。因此,考慮如何將嵌入式應用程序從其所依賴的開發工具或調試環境中移植到在目標硬件上獨立運行是非常重要的。
開始編寫嵌入式應用程序時,開發者可能并不清楚目標硬件的具體規格。如,目標系統使用了什么樣的外圍設備、存儲器映射情況甚至不能確定處理器的型號。
為在了解這些詳細信息前能夠繼續軟件的開發,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狀態下)。

調試代理通過SWI的中斷向量號識別該軟中斷是目標系統提出的Semihosting請求。具體是何種Semihosting請求(鍵盤輸入請求或屏幕顯示請求),通過向寄存器r0傳遞不同的參數進行區分。所有其他參數通過一個數據塊進行傳遞。該數據塊的地址通過寄存器r1傳遞給中斷處理程序。軟中斷的處理結果放在r0中返回,也可以通過顯式的返回值或傳遞數據塊的指針帶回程序的處理結果。即使未返回結果,也假定r0是被使用的。
用r0傳遞的可用Semihosting操作編號分配如下:
· 0x00-0x31 這些編號由ARM公司使用;
· 0x32-0xFF 這些編號由ARM公司保留,以備將來使用;
· 0x100-0x1FF 這些編號保留給用戶應用程序。

· 0x200-0xFFFFFFFF這些編號未定義。當前未使用并且不推薦使用這些編號。
在以下部分中,操作名稱之后的括號中的編號是調用Semihosting操作時放入r0的值。例如,SYS_OPEN(0x01)。
如果從匯編語言代碼中調用SWI,最好使用semihost.h中定義的操作名稱。可以用 EQU 偽操作定義操作名稱。例如:
SYS_OPEN EQU 0x01
SYS_CLOSE EQU 0x02
3.Semihosting需求函數
Semihosting需要的函數列表如表13.1所示。如果使用默認的Semihosting功能,用戶不需要編寫任何其他代碼。也可以重新實現部分的輸入/輸出函數,使這些函數和標準Semihosting混合使用。
表13.1 Semihosting函數列表
函 數 名 稱描 述
SYS_OPEN (0x01)打開文件
SYS_CLOSE(0x02)關閉使用SYS_OPEN打開的文件
SYS_WRITEC (0x03)向控制臺輸出字符
SYS_WRITE0 (0x04)將空終止的字符串寫入控制臺
SYS_WRITE (0x05)寫入主機上的文件
續表
函 數 名 稱描 述
SYS_READ (0x06)將文件內容讀取到緩存器
SYS_READC (0x07)從控制臺讀取字節
SYS_ISERROR (0x08)確定返回代碼是否錯誤
SYS_ISTTY (0x09)檢查文件是否連接到交互設備
SYS_SEEK (0x0A)搜索到文件中的某個位置
SYS_FLEN (0x0C)返回文件的長度
SYS_TMPNAM (0x0D)返回文件的臨時名稱
SYS_REMOVE (0x0E)刪除主機上的文件
SYS_RENAME (0x0F)重命名主機上的文件
SYS_CLOCK (0x10)執行開始后的厘秒數
SYS_TIME (0x11)1970 年 1 月 1 日到現在的秒數
SYS_SYSTEM (0x12)將命令傳遞給主機命令行解釋程序
SYS_ERRNO (0x13)獲得 C 庫 errno 變量的值
SYS_GET_CMDLINE (0x15)獲得用于調用可執行程序的命令行
SYS_HEAPINFO (0x16)獲得系統堆參數
SYS_ELAPSED (0x30)獲得自執行開始的目標滴答聲數目
SYS_TICKFREQ (0x31)確定滴答聲的頻率
13.2.2 C 庫結構
從概念上來講,C庫函數可被化分成兩類,一類為ISO C語言的規范部分,該部分的主要功能是向用戶提供一個調用接口;另一類為ISO C語言規范提供支持。圖13.2顯示了這兩類函數在C庫中的結構。

圖13.2 C庫的函數結構
對部分ISO C功能的支持是由主機調試環境在支持函數的設備驅動程序級別提供的。
例如,RVCT C庫通過寫入調試器控制臺窗口來實現ISO C printf()系列函數。通過調用__sys_write()來提供該功能。這是一個執行半主機SWI的支持函數,使字符串被寫入到控制臺。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 嵌入式軟件開發的特點、設計流程、嵌入式軟件的結構
- 嵌入式軟件開發需要懂的硬件基礎
- 嵌入式軟件開發做什么?嵌入式開發培訓學哪些
- 嵌入式軟件開發是什么??
- 嵌入式軟件開發環境
- 關于做嵌入式軟件開發和普通桌面軟件開發的區別問題
- 設計的帶嵌入式收發器的Gen1×1硬核IP的 PCI Express IP編譯器
- 使用ARM核的嵌入式軟件開發環境與技術詳細介紹 8次下載
- 基于嵌入式軟件開發中構件技術的研究 6次下載
- 嵌入式交叉編譯環境的搭建解析 1次下載
- ARM嵌入式軟件開發 65次下載
- Eclipse嵌入式軟件開發平臺 55次下載
- 嵌入式軟件開發與Embedded-GIS 36次下載
- 基于嵌入式操作系統的開發方法
- 嵌入式軟件開發系列教程 (很多本書)
- 嵌入式軟件開發和軟件開發的區別 2357次閱讀
- 嵌入式開發中的交叉編譯詳解 1326次閱讀
- 如何為嵌入式軟件開發選擇編譯器 588次閱讀
- 深入淺出編譯優化選項(上) 2298次閱讀
- 如何為嵌入式軟件開發選擇編譯器 905次閱讀
- 嵌入式軟件架構設計之程序分層 1262次閱讀
- C編譯器的缺省字節對齊方式(自然對界) 2216次閱讀
- 基于UML嵌入式軟件開發環境的自動取款機系統的應用方案 3777次閱讀
- 詳解嵌入式軟件開發到FPGA開發 6473次閱讀
- 把軟件項目管理方法引入嵌入式系統的開發之中的設計淺析 2162次閱讀
- 嵌入式軟件開發編程規范介紹 4403次閱讀
- 嵌入式軟件開發的這些編程規范你了解嗎 3945次閱讀
- 物聯網的產業生態是怎樣的詳細分析概述 5181次閱讀
- 學嵌入式開發入門_學嵌入式開發需要看哪些書籍 2.5w次閱讀
- 嵌入式開發就業前景分析_嵌入式領域的職業發展方向 1.8w次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論