?

基于GCC的cmdsp2f01編譯工具移植開發

2018-01-23 06:29張梅娟
電子與封裝 2018年1期
關鍵詞:編譯器套件寄存器

張梅娟,張 榮,張 鉚,韋 祎

(中國電子科技集團公司第五十八研究所,江蘇無錫 214072)

1 引言

編譯工具是指一組編譯套件,實現把某種編程語言編寫的代碼轉變成另一種計算機語言的功能。編譯技術是計算機領域的關鍵技術之一,隨計算機語言和處理器體系結構的發展而發展,目前計算機系統高級語言已幾乎完全代替了匯編語言。常用的編譯工具包含了高級語言編譯器(C/C++等)、匯編器、鏈接器和其他二進制工具。

高級語言編譯工具是一個大型系統軟件,開發難度較大,最早期的高級語言編譯工具共花費了18人/年的時間[1]。研究者們經過幾十年的不懈努力,在編譯理論、技術和實驗上積累了豐富的成果[2,3,4]。隨著嵌入式系統的發展和高性能體系結構的出現,編譯工具的開發速度和質量有了更高的要求,推動了可重定向編譯系統的研究,逐步將與高級語言相關的詞法語法分析模塊設計成可復用的前端,機器相關的部分被封裝起來,前端通過間接調用的方式與機器相關的部分發生關系。如圖1所示,針對不同處理器,只需要進行目標機器信息的描述(即編譯工具的移植),即可快速生成一套編譯工具。這大大減小了編譯工具的開發難度和開發時間。

圖1 可重定向編譯系統

可重定向編譯系統結構定義良好,針對不同的后端,前端代碼基本上不用修改,做到了最大限度的代碼復用。但是前端只進行了一些通用的代碼優化,沒有做與目標機相關的優化,運行效率有一定的提升空間。

GCC(GNU Compiler Collection,GNU 編譯器套件),是一套以GPL及LGPL許可證所發行的自由軟件,是可重定向編譯系統的代表,常被認為是跨平臺編譯工具移植的事實標準。該系統在所有平臺上都能使用同一個前端處理程序,產生相同的中間代碼,因此在不同平臺上,使用GCC系統移植編譯工具,不僅可以保證編譯工具的性能質量,還能縮短開發周期[5]。但是嵌入式處理器體系結構一般都不規則,對代碼質量要求嚴格,必須對編譯系統的前端和后端進行針對性的優化設計才能滿足要求,因此移植具有其特殊的難度和復雜性[6]。

本文基于可重定向的GCC編譯系統的移植,成功構建了cmdsp2f01處理器的編譯工具套件,經測試驗證,編譯工具套件編譯功能正確。

2 cmdsp2f01結構

編譯工具的移植,需要描述目標機器信息。cmdsp2f01是中國電科第58所開發的一款高性能DSP芯片,該芯片處理器采用超長指令字(VLIW)架構,支持單周期5條指令并行執行,支持單指令多數據流(SIMD),使數據處理并行度更高,128 bit程序總線,雙256 bit數據總線,具備單精度浮點運算,支持16 bit、24 bit指令編碼。其內部流水線支持7級,運算能力達12.8 GMACs。

cmdsp2f01的DSP內核架構支持1字節、2字節和4字節數據格式,另支持32 bit單精度浮點數據格式和40 bit累加器值(MAC16時使用)。所有存儲在內存的數據CPU都是字節尋址,字節順序固定為小端模式,即0字節是最低有效位字節。核指令基于32 bit虛擬和物理內存尋址,指令和數據尋址可達4 GB尋址空間。尋址方式支持寄存器加立即數尋址。

圖2 處理器架構信息

如圖2所示,cmdsp2f01 DSP除支持通用運算和存取指令外,還增加了專用定點矢量指令。其中,通用指令包含Move指令、加減指令、乘加指令、比較指令、分支指令、地址運算指令和存取指令。

3 移植設計

本文所述的編譯工具是指一組編譯套件,含C編譯器和匯編器、鏈接器等二進制工具集。移植的主要任務是目標機器信息的描述。GCC系統中,機器信息的描述主要采用寄存器轉換語言RTL(Register Transfer Language)語言實現,輔助以C接口函數(API)的設計。RTL中間表作為GCC C編譯器后端的核心內容,將后端中可重用的部分剝離出來,再通過相應的接口為不同的目標機器定義各自的映射規則,這種方式極大地提高了GCC的適應性,也增強了它的可維護性、可擴展性以及可移植性[7]。

本文的移植是結合cmdsp2f01處理器特點,對機器描述進行設計和實現,構建一套新的編譯工具。編譯工具套件基本功能如下:

(1)C編譯器(C-Compiler),將C語言程序代碼編譯成cmdsp2f01處理器對應的匯編代碼,編譯器包括外殼程序(shell program)、優化器和預處理器;

(2)匯編器(Assembler),把匯編語言源文件轉換成基于公用目標文件(ELF)的機器目標文件,也就是常用的*.out文件;

(3)鏈接器(Linker),把多個目標文件組合成單個可執行目標模塊,除了能夠創建可執行文件外,還可以調整外部符號的引用,鏈接器輸入的是可重定位的目標文件和目標文件庫;

(4)歸檔器(archiver),允許用戶將一組文件收集到一個歸檔文件中,也叫歸檔庫,其最常見的用法是創建目標文件庫,也可以通過刪除、替換、提取或添加文件操作來調整庫;

(5)Objdump,用來查看目標程序中的段信息和調試信息,也可以用來對目標程序進行反匯編;

(6)Objcopy,用來拷貝或是翻譯目標文件;

(7)Nm,列出目標文件、庫或是可執行文件中的代碼符號及代碼符號所對應的程序開始地址;

(8)Size,顯示程序文件的段信息。

3.1 移植思路

編譯工具包含C/C++編譯器及二進制工具集(匯編、鏈接等工具),需要分別基于兩套代碼系統進行移植。GCC是高級語言編譯器相關的工具代碼,移植后可生成預處理器、高級語言編譯器等工具,binutils是二進制工具集代碼,移植后可生成匯編器、鏈接器、反匯編器等二進制工具。

通常在編譯過程中所使用的GCC是一個驅動程序,在實際執行編譯的過程中將根據輸入的命令參數,調用不同的程序(包括預處理器、編譯器、匯編器以及鏈接器等)進行分析處理,實現對整個編譯過程的控制。

編譯工具移植實現步驟如下:

(1)移植環境準備(源代碼獲取、移植環境選擇);

(2)分析處理器結構及指令特點,進行目標機信息的描述;

(3)構建編譯工具;

(4)測試驗證編譯工具。

3.2 移植實現過程

GCC幾乎可以運行在所有操作系統平臺上,如GNU/Linux、其他自由軟件平臺(BSD系列)等。通過Cygwin(或MinGW)工具,GCC也可以運行在MS DOS、MS Windows多個版本的平臺上。本文移植工作主機系統選擇Windows平臺,采用Cygwin作為虛擬環境。必要的源代碼包括gcc-5.2.0、二進制工具源代碼binutils-2.23.1。代碼閱讀使用Source Insight3.5工具。

3.2.1 編譯器代碼移植

代碼移植就是在GCC框架內添加目標機器信息的描述,在./gcc-5.2.0/gcc/路徑中創建target文件夾,并在該文件夾中創建機器描述文件(如target.c、target.h、target.md等文件)。target.h定義大小端、指令類型、數據類型及字長、內存邊界及對齊、尋址模式類型、標準寄存器的分配等信息。

cmdsp2f01處理器有16個32位通用地址寄存器,分別為a0~a15。設計 a1用作棧指針sp,a2~a7用于函數調用處理。處理器寄存器信息定義如圖3所示。

target.c文件中定義一些API接口函數,供target.md描述指令時使用。如圖4所示,在target.c文件中定義有符號8位立即數。

在target.md中描述加法操作數時引用該接口函數,加法操作數詳細描述方法如圖5所示。

target.md文件中,使用RTL語言對機器指令特點進行描述,描述語句遵循RTL語言規則。處理器支持5種加法類型指令,16位寄存器尋址加法指令add.n,16位立即數尋址加法指令,24位寄存器尋址加法指令add,24位立即數尋址加法指令addi,24位立即數尋址加法指令addmi,立即數尋址時左移8位。加法指令的描述如圖6所示。

圖3 target.h文件內容摘要

圖4 8位立即數API定義

圖5 加法操作數定義

圖6 加法指令描述

3.2.2 編譯器構建過程

gcc-5.2.0版本的編譯需要mpc的支持,而mpc又依賴于gmp和mpfr庫,因此需要從官網上下載源代碼mpc-0.8.1、gmp-4.3.2、mpfr-2.4.2。分別安裝3個庫,由于庫之間有依賴關系,庫的安裝有先后順序,安裝順序為gmp/mpfr/mpc。3個庫安裝在默認庫的路徑下(./usr/lib)。

GCC構建時,按照configure/make的步驟,詳細步驟如下:

構建好的工具在路徑./usr/local/bin下。

3.2.3 二進制代碼構建

在../Binutils-2.23.1/include/路徑下,創建文件target-isa.h進行處理器架構宏定義。在../Binutils-2.23.1/gas/config路徑下,創建target.c和target.h指令集描述文件,實現對指令集的映射。構建過程與GCC構建過程類似,配置選項相對簡單很多。

3.3 應用驗證

編譯工具本身結構復雜,進行全面的測試比較困難。編譯工具的測試與其他類型軟件的測試一樣,同樣分為黑盒測試與白盒測試。在實際工程應用中,通常以黑盒測試為主,以白盒測試為輔[8]。黑盒測試具體是提供測試用例,將產生的結果與預期結果進行比較,測試用例的設計和選擇尤為重要。為了避免測試用例受到開發人員經驗、偏好等因素的影響,本文選擇處理器性能評價標準程序為測試用例,對本文構建的編譯工具進行測試驗證。黑盒測試流程如圖7所示。

表1 標準benchmark測試程序

測試程序執行如圖8所示的自定義makefile文件后,輸出編譯中間結果及最終可執行二進制文件。使用移植后的gdb加載運行后,執行結果與VS2008下編譯程序執行的結果比較,結果正確無誤。

白盒測試,C語言編譯器輸出匯編代碼,編寫簡單的C源代碼如圖9 a.c文件,執行taret-gcc5.2.0.exe-S a.c-o a.S命令后,輸出相應匯編代碼,如圖9所示。加法操作被翻譯為16位寄存器尋址的加法指令add.n。常量數據放入特定的數據段.literal,每個變量定義了地址標號,便于立即尋址。

圖7 黑盒測試流程

圖8 自定義makefile文件

圖9 C語言編譯結果

4 結束語

本文基于GCC,針對特定目標處理器實現了編譯工具的移植,全面描述了編譯工具移植的實施流程,針對目標處理器架構特點,設計了機器描述文件內容,成功構建了特定處理器的編譯工具套件,并對工具套件進行了功能驗證。本文描述的技術同樣可用于其他處理器架構編譯工具的移植開發,可節省開發調試時間。

[1]Backus,J W,R J Beeber,S Best,et al.The Fortran automatic coding system[C].Western Joint Computer Conference,1957:188-198.

[2]Appel A W,Palsberg J.Modern Compiler Implementation in Java[M].Cambridge University Press,second edition,2002.

[3]Aho A V,Sethi R,Ullman JD.Compilers Principles,Techniques,and Tools[M].Person Education,1986.

[4]Muchnick S S.Advanced Compiler Design and Implementation[M].San Francisco,California:Morgan Kaufmann,1997.

[5]Wang Xiaowei,Wang Kuixing,Yang Quansheng.Research and DevelopmentofCompilerBased on GCC[C].CSIE 2011,LNEE 126:809-814.

[6]Rainer Leupers,Peter Marwedel.Retargetable compiler technology for embeded systems,tools and applications[M].Kluwer Academic Publishers,October 2001.

[7]石博慧,陳英.GCC代碼優化技術研究[J].微機發展,2004(8):67-70.

[8]陳慈勇.基于GCC的交叉編譯器移植開發及其測試方案的設計研究[D].廈門,2011:67.

猜你喜歡
編譯器套件寄存器
STM32和51單片機寄存器映射原理異同分析
基于維修費用的關鍵部套件分析
Lite寄存器模型的設計與實現
“龍吟套件”創作感悟
基于相異編譯器的安全計算機平臺交叉編譯環境設計
工業照明超頻三天棚燈套件改造工程
CSRmesh開發套件加速物聯網產品開發
通用NC代碼編譯器的設計與實現
高速數模轉換器AD9779/AD9788的應用
一種可重構線性反饋移位寄存器設計
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合