??? 摘? 要: 從分析編譯器基本工作原理入手,研究了目前廣泛使用的三種" title="三種">三種嵌入式系統" title="嵌入式系統">嵌入式系統集成開發環境" title="集成開發環境">集成開發環境(ADS1.2、RVDS2.2和Tornado2.2)中的編譯器效能,通過具體測試數據,分析了編譯器效能產生差異的原因,得出了結論。?
??? 關鍵詞: 嵌入式系統;集成開發環境;編譯器;效能
?
??? 在嵌入式系統迅猛發展的今天,廣泛的應用和需求使嵌入式系統的開發不再局限于只能由相關應用領域的專家來完成。各種優秀的集成開發環境IDE(Integration Develop Environment)的出現,使得嵌入式系統開發" title="系統開發">系統開發變得相對簡單,從而對廣大工程人員降低了門檻[1]。目前有很多工程人員正在用各種開發平臺進行嵌入式系統開發,從ARM公司的SDT到ADS,再到RVDS,以及風河公司的Tornado和其他公司提供的各種專用開發工具" title="開發工具">開發工具,這些IDE一般都是由文件管理器、編譯器、匯編器、鏈接器、調試器等組件和工具組成。在這些程序開發設計環境中,編譯程序起著核心作用,鏈接程序、調試程序、程序管理等工具直接依靠編譯程序所產生的結果工作,而且其他工具的構造也常常要用到編譯的原理、方法和技術,因此,對IDE開發效率影響最大的是編譯器的效能。本文針對目前廣泛使用的三種集成開發環境ADS1.2、RVDS2.2和Tornado2.2中C編譯器的性能進行了研究,測試其編譯效率,分析了編譯器效能產生差異的原因。?
1 三種主要的IDE及其C編譯器介紹?
??? (1)ADS(ARM Developer Suite)是ARM公司推出的ARM系列處理器集成開發工具,使用非常廣泛,目前最高版本是1.2,使用的主要是ARM公司的armcc編譯器,此編譯器通過了Plum Hall C Validation Suite為ANSI C的一致性測試。armcc用于將ANSI C編寫的程序編譯成32位ARM指令代碼[2][3]。?
??? (2)RVDS(RealView Developer Suite)是ARM公司繼SDT和ADS1.2后主推的新一代開發環境,旨在取代ADS,目前最高版本為3.1,后又推出了RVDS MDK,但使用最為普遍的還是RVDS2.2。編譯器是ARM公司新推出的RVCT編譯器,它對循環和指針具有高階優化的新特性[4]。?
??? (3)Tornado是Wind River Systems(風河公司)的老牌開發工具,目前常用版本為2.2,主要為風河公司的diab編譯器和GNU(開放軟件聯盟)的gcc編譯器使用。其中gcc編譯器的通用性更好,尤其是在Linux環境下,gcc是最佳選擇,所以這里選擇更具代表性的gcc進行對比[5]。?
??? 以上三種IDE各有特色,其C編譯器都能夠很好地支持C語言編寫的源程序,同時IDE中提供了對ARM運行時庫的支持,從而保證了所編寫的C程序能夠用開發工具進行編譯、鏈接和調試。?
2 編譯器工作原理?
??? 編譯器是將一種語言編譯成為另一種語言的計算機程序,該程序以源語言編寫的程序作為輸入,翻譯生成等價的目標語言程序[6]。編譯器可分成只依賴于源語言的編譯器前端和只依賴于目標語言的編譯器后端兩大部分。前端主要對源代碼進行掃描、語法分析和語義分析,生成中間代碼;而后端主要是優化器和代碼生成器。這一結構對于編譯器的結構靈活性和可移植性十分重要。流程編譯器前后端結構如圖1所示。?
?
?
??? 編譯器內部包括了五個編譯階段,它們執行不同的邏輯操作,這些階段在實際應用中是組合成一體的,但其有相對獨立的步驟。表1為編譯器各編譯階段的任務表。
?
?
??? 從表1可以看出:第四階段是決定編譯器編譯效率的主要階段,優化能力是衡量一款編譯器效能的決定性因素。?
??? 典型的編譯工作流程如圖2所示。?
?
?
3 測試原理及方法?
??? 編譯器性能的測試主要通過對C語言源程序(c文件)編譯后得到的目標程序(obj文件)的運行時間和代碼尺寸進行比較和綜合衡量,從而判斷編譯器的編譯效率。從編譯原理得出結論,各種IDE的C編譯器在優化階段的優化能力是決定測試結果的主要因素。?
??? 對三個具有代表性的C程序進行了具體測試:簡單的ADD加法程序、規范的3DES加密算法程序[7]、復雜且不規范的熵(Huffman)編碼程序[8]。在測試中,將各種編譯器的優化方向設定為時間性能,優化級別均設定為最高級別,處理器型號設為ARM920T。?
??? 測試分兩步進行:?
??? (1)對用三種IDE的編譯器對C語言源程序編譯后得到的obj文件大小進行統計。?
??? (2)對各C語言子程序編譯的obj文件和頭文件進行鏈接調試,測量運行時間。選用AXD調試器為測時工具,利用AXD下的Debugger Internals選項對編譯鏈接的工程運行占用系統時鐘周期進行記錄。?
??? 需要指出的是,Tornado2.2中的gcc編譯器編譯得到的obj文件需要在ADS1.2下重新鏈接,而RVDS2.2自帶AXD調試器,所以可以直接測時。?
4 實驗結果及分析?
??? 比較代碼編譯器所得到的obj文件大小:Tornado2.2的gcc編譯器得到的obj文件最小,ADS1.2的armcc編譯器得到的obj文件略大于 gcc編譯器,RVDS2.2的RVCT編譯器得到的obj文件比gcc編譯器大10%。?
??? 分別對三個程序進行編譯后的測試結果如表2所示。?
?
?
??? 表2中Instructions為指令數,Core_cycles為系統程序運行時占用的內核時鐘周期,S_cycles和 A_cycles分別為程序運行時地址連續操作和空地址操作占用的時鐘周期數,Total為兩者總和[9]。?
??? 從測試數據可以看出,ADD加法程序和3DES加密程序三種編譯器的編譯效率相差不大;ADS1.2的armcc編譯器要略好于Tornado2.2的gcc編譯器和RVDS2.2的RVCT編譯器;而對于熵編碼程序,RVDS2.2的RVCT編譯器的編譯效率明顯高于Tornado2.2的gcc編譯器和DS1.2的armcc編譯器。這是因為ADD加法程序和3DES加密程序是比較簡單、規范的C語言程序,文件數、函數調用、指針和循環都較少,無法發揮RVCT的優勢;而對于熵編碼程序,各種函數調用非常多,指針跳轉頻繁,RVCT編譯器會根據代碼的具體情況,針對函數調用、循環、指針等進行高階優化,自動進行循環解開、融合、位置調整、指針優化等操作,使代碼由繁化簡更加合理,雖然代碼量略有增大,但是大幅提高了代碼的執行效率[10]。因此,綜合比較的結果是:RVDS2.2的RVCT編譯器的編譯效率是三者中最好的,ADS1.2的armcc編譯器略好于Tornado2.2的gcc編譯器。?
??? 本文對于目前廣泛使用的三種嵌入式系統集成開發環境的編譯器效率進行了測試,通過綜合對比,得出了結論。還有很多公司,如IAR、Embest的IDE都有不錯性能,因此,對編譯器的研究有待于更進一步深入。?
參考文獻?
[1] 周立功.ARM嵌入式系統基礎教程.北京:航空航天大學出版社,2005.?
[2] ARM.ADS1.2 USER′S MANUAL.2004.?
[3] 孫秋野,孫凱,馮健.ARM嵌入式系統開發典型模塊.北京:人民郵電出版社,2007.?
[4] ARM.RVDS2.2 Introductory Tutorial.2006.?
[5] WindRiver System.Tornado2.2 UserGuide.2003.?
[6] 陳火旺,劉春林,譚慶平,等.程序設計語言編譯原理(第三版).北京:國防工業出版社,2000.?
[7] Bruce Schneier著,吳世忠譯.應用密碼學——協議、算法與C源程序.北京:機械工業出版社,2001.?
[8] HUFFMAN D A.A method for the construction of minimum?redundancy codes[J].Proc.IRE,1952,40(9):1098-1101.?
[9] Samsung Electronics.S3C2410A USER′S MANUAL.2004.?
[10] ARM中國.RVDS-ARM系統開發的首選工具.單片機與嵌入式系統應用,2007,(2)-(3).?