周兆豐,侯向鋒
(湖北師范學院,黃石435002)
以手機和信息家電為代表的嵌入式系統的應用開發已經成為現代工業最熱門的領域之一,其靈魂就是嵌入在其中的計算機系統——嵌入式系統。嵌入式系統仿真環境是支持嵌入式系統軟件開發的一種快速、高效和低成本的工具,對于提高嵌入式系統的開發效率和開發質量具有重要意義。SkyEye是一個支持多架構、多核并且具有高度可擴展性的硬件仿真平臺,是國內最優秀的開源軟件(opensource software)項目之一,中文名字是“天目”。SkyEye的目標是在通用的Linux和Windows平臺實現一個仿真集成開發環境,模擬常見的嵌入式計算機系統,使μ Clinux以及μ C/OS-II等多種嵌入式操作系統和各種系統軟件(如TCP/IP、圖形子系統、文件子系統等)能夠良好運行,并可對它們進行源碼級的分析和測試。
如果要學習Linux操作系統或者進行嵌入式系統開發,但缺少硬件支持,嵌入式系統仿真環境軟件SkyEye將是一個非常有效的學習工具和開發手段。如果想研究與具體硬件無關的系統軟件(如TCP/IP協議棧等),采用SkyEye可以有效地提高工作效率。
構建基于SkyEye的嵌入式系統仿真環境是借助于該仿真環境進行學習和研究的前提。但是目前基于Sky-Eye的嵌入式系統仿真環境的構建沒有詳細、系統的說明資料。在不同版本的Linux環境下,采用源碼安裝方式安裝軟件所需的庫文件和軟件包的種類各不相同。安裝編譯源碼時所需的庫文件和軟件包,也就是編譯環境的配置。通常源碼安裝需要編譯器(預處理器、C編譯器和匯編器),鏈接器等開發工具以及相關的程序庫(C或C++標準庫和特殊軟件需要的支持庫)支持。而像SkyEye這樣的專業軟件安裝還需要額外的庫文件和軟件包支持,并且所需的庫文件和軟件包隨著Linux版本的不同而不同,安裝過程較為復雜。這也是SkyEye源碼安裝難以成功的最主要原因。
因此在SkyEye的安裝過程中,配置編譯環境是比較困難的,更是至關重要的。本文在說明基于SkyEye的嵌入式系統仿真環境如何構建的過程中,詳細講述了如何配置SkyEye所需的編譯環境,為快速構建基于 SkyEye的嵌入式系統仿真環境提供了良好的方案。
SkyEye在Linux上的安裝方式主要有兩種,分別是二進制的RPM包安裝和源碼安裝。
二進制的RPM包安裝主要是針對普通用戶的,通過命令rpm–ivh skyeye-1.2.9-rc1.i386.rpm就可以將其安裝到默認的/opt/skyeye路徑下。RPM包安裝雖然被廣泛應用于 Radhat、Fedora、SUSE 和 Mandriva等 Linux版本,但仍然有很多其他的Linux版本不支持此安裝方式,因此其應用受到很大限制。
源碼安裝就是需要對源代碼進行重新編譯的安裝。這種安裝方式不僅適用于所有版本的Linux系統,而且可以自行修改編譯參數、增加或刪除相應功能。最新的Linux軟件版本一般都是先以源碼形式出現的,所以源碼安裝方式在Linux上最為流行。本文討論的基于SkyEye的嵌入式系統仿真環境的構建也是以源碼安裝方式進行的。
構建基于SkyEye的嵌入式系統仿真環境通常需要以下幾個的步驟:
①配置編譯環境;
②SkyEye軟件安裝;
./configure;
make;
make install;
③交叉工具鏈安裝;
④測試。
能否正確配置好所需要的編譯環境是源碼編譯成功與否的關鍵所在。配置SkyEye的編譯環境,就是安裝編譯SkyEye源碼時所需要的開發工具包、關鍵庫文件、頭文件等。由于Linux版本以及安裝風格的多樣性,導致很難確定SkyEye所需要的編譯環境。下面以剛安裝好未作任何設置的Ubuntu環境為例,講述如何正確、有效地配置SkyEye所需要的編譯環境。
為了提高安裝效率,需要對Ubuntu系統作一些必要的設置,如切換到root用戶和更新源列表source.list等。
(1)切換到root用戶
安裝是需要權限的,在 root用戶下操作可以省去很多麻煩。更改root用戶步驟如下:
①sudo passwd root;(輸入當前用戶密碼后并設置root用戶新密碼)
②su root;(輸入新密碼后進入root用戶)
(2)更新源列表source.list
source.list就是下載軟件和更新系統的源列表,對用戶成功安裝SkyEye非常重要。可以通過netselect和netselect-apt命令自動生成源列表,也可以手動操作得到。手動操作的步驟如下:
①在ubuntu論壇上(http://wiki.ubuntu.org.cn/Template:8.04source)找到與 Ubuntu8.04對應的源列表,然后再根據實際的網絡情況選擇更新源;
②通過cd/etc/apt,進入apt目錄;
③通過cp soure.list source.list_bak,備份源列表;
④通過gedit source.list,把需要的源(如成都電子科技大學、上海交通大學、中國科技大學)復制到最前端,然后保存;
⑤通過apt-get update,更新源列表,并借助于提示看選擇是否合適。若存在不合適的源,則刪除,最終可使下載的速度達到最佳。
如何快速、有效、全面地配置SkyEye所需要的編譯環境是本文討論的重點,也是構建基于SkyEye的嵌入式系統仿真環境的難點。要配置SkyEye所需要的編譯環境,首先要明確SkyEye需要什么樣的開發工具和軟件包支持。用戶可以通過下面幾種方法來獲得所需要的信息并進行相關的配置。
①通過SkyEye提供的 INSTALL、README和UserManual來得到源碼安裝所需要的信息。權威的官方資料給出了必要的信息和常規的安裝步驟,但是信息不夠全面,沒有告訴用戶如何針對具體的 Linux平臺(如Ubuntu)去配置編譯環境,用戶仍然需要去自己查找所需要的軟件包,難度較大。
②通過分析configure.in等文件得到。因為configure.in文件是對由autoscan掃描源代碼后形成的configure.scan更改得來的,是形成configure腳本文件的基礎,是執行./configure命令的主要依據,所以其提供的信息最全。但是要想從中提取出SkyEye所需要的信息,必須具有一定的專業知識。因此該方法不適用于一般的用戶。
③通過apt-cache showsrc skyeye命令語句得到。showsrc命令會列舉出SkyEye編譯時依賴的軟件包。用戶只要通過“apt-get install+軟件包列表”命令,就可以安裝絕大多數必需的軟件包,在多數情況下都可以配置好SkyEye所需要的編譯環境。
④通過apt-get build-dep skyeye命令語句得到。build-dep是專門配置將要安裝軟件所需編譯環境的語句。利用該命令配置的編譯環境比方法③配置得更全面。
但是利用方法③和方法④配置SkyEye的編譯環境是有前提的,那就是Ubuntu的軟件庫里要有 SkyEye軟件存在。對于Ubuntu8.04來講,軟件倉庫中SkyEye的版本為1.2.3(Ubuntu9.10軟件庫中SkyEye的版本為1.2.5),版本相對較老。因為新老版本的SkyEye所需要的編譯環境大體相似,所以可以利用方法③或方法④來配置編譯環境。但是配置后,還需要再安裝新版本額外需要的軟件包。
⑤通過auto-apt run./configure命令自動得到。當采用源碼方式安裝一個軟件,卻因為缺少頭文件而失敗時,auto-apt可以搜索到包含頭文件的包并自動安裝該文件。雖然此方法需要先安裝build-essential軟件包,但是可以獲得較完整的編譯環境。
該配置方法是直接針對configure腳本來進行自動安裝的,適用范圍很廣。無論是新版本的軟件還是舊版本的,無論Ubuntu軟件庫中是否存在要安裝的軟件,只要configure腳本信息全面,就可以把編譯環境配置成功。
在Ubuntu8.4環境下,安裝SkyEye的一種最簡單的方法就是通過apt-get install skyeye命令語句來實現。安裝的是軟件庫中的SkyEye1.2.3,版本較老,而且只具備基本功能。
對于源碼安裝來說,安裝之前需要先對源碼包進行解壓,然后進入解壓后的目錄。通過下面的命令實現:
tar xzvf skyeye-1.2.9-rc1.i386.tr.gz;
cd skyeye-1.2.9-rc1;
進入目錄后,用戶可以通過下面幾種方法來實現SkyEye的安裝:
(1)基本安裝
通過這種安裝方法,用戶可以得到SkyEye-1.2.9版本最基本的功能。安裝步驟如下:
①apt-apt-get install build-essential;
build-essential軟件包包含一個列表,表中列出了在編譯Ubuntu軟件包時所必需的軟件包(如C與C++編譯器等)。
②apt-get install binutils-dev;
binutils-dev軟件包是GNU二進制工具(BFD開發文件),依賴于binutils,安裝此軟件包會同時安裝binutils軟件包。binutils是一套用來構造和使用二進制文件所需要的工具,是用來編譯、測試和分析軟件的。binutils最重要的成員是匯編器as和鏈接器ld,還包括一些二進制代碼工具。
③apt-get install libreadline5-dev;
readline庫用于向需要提供命令行界面的不同程序提供一個一致的用戶界面。libreadline5-dev依賴于軟件包libncurses-dev,安裝libreadline5-dev時會同時安裝libncurses-dev軟件包。
④./configure--prefix=/usr/local|tee simple_install.log;
./configure主要是用來測試編譯環境的,成功執行該命令后會生成一個makefile文件。該文件包含編譯的過程和所需要的庫。--prefix=/usr/local是用來指定安裝路徑的。tee simple_install.log是用來生成一個日志文件的,生成的日志文件記錄了./configure的執行過程。這樣可以供用戶詳細分析整個過程和找出缺少的文件信息。
⑤make;
按照makefile文件來編譯和執行。
⑥make install;
把編譯好的文件安裝到指定目錄。
(2)通過build-dep或showsrc提供的軟件包列表安裝
利用build-dep或showsrc命令安裝的主要區別在于,build-dep可以自動安裝build-essential軟件包文件,而showsrc不會。下面給出利用build-dep命令安裝skyeye的步驟:
①apt-get build-dep skyeye;
創建skyeye的配置環境;
②apt-get install libreadline5-dev;
③./configure-prefix=/usr/local|tee build-dep_install.log;
④make;
⑤make install。
(3)通過auto-apt安裝
使用auto-apt命令前,需要先安裝該命令并更新數據庫。通過下面的命令實現:
apt-get install auto-apt;
auto-apt update&&updatedb&&update-local。
auto-apt工具安裝好以后,再通過下面的步驟來安裝SkyEye:
①apt-get install libreadline5-dev;
②apt-get install gawk;
awk是一個程式語言,對于資料的處理具有很強的功能。gawk是GNU所做的awk,gawk包含awk的所有功能。
③apt-get install f77;
f77就是指GNU的Fortran77編譯器。auto-apt可以自動安裝,但是當找不到相應文件時,不會自動跳過此文件的安裝(如gawk與 f77)。安裝步驟②與③是為了使auto-apt更順利地執行。
④auto-apt run./configure-prefix=/usr/local|tee auto-apt_instll.log;
⑤make;
⑥make install。
用戶通過方法(1)安裝SkyEye,只能得到其最基本的功能。建議用戶使用方法(2)或方法(3)安裝SkyEye。方法(2)適用于所有版本的SkyEye;而方法(3)只適用于具有configure腳本的SkyEye的安裝,也就是說版本要在1.2.5以上。但是方法(2)不能完全提供新版本需要的編譯環境,還需安裝新版本額外需要的軟件包。方法(3)幾乎可以滿足編譯環境的需要,除非auto-apt在configure腳本中沒有發現需要安裝的軟件包。另外需要注意的是,在執行./configure或者make階段警告是不影響正常安裝的,但是錯誤提示的問題必須要解決,否則安裝不成功。
本文以無MMU的 ARM7TDMI為測試用處理器內核,所以要安裝交叉編譯工具鏈arm-tools-elf20030314.sh。安裝步驟如下:
①通過chmod+x arm-elf-tools-20030314.sh增加可執行屬性;
②通過vi arm-elf-tools-20030314.sh打開此文件,然后到arm-elf-tools-20030314.sh文件的第39行,將tail+${SKIP}${SCRIPT}|gunzip|tar xvf–語句改為tail-n+${SKIP}${SCRIPT}|gunzip|tar xvf–并保存,以消除本身存在的錯誤;
③通過sh arm-elf-tools-20030314.sh解壓此工具包到默認目錄;
④通過輸入arm-elf-再按Tab鍵,看是否出現一系列的arm-elf-xxx二進制工具,如果有 arm-elf-gdb等,則說明需要的工具已經在安裝目錄下;
⑤通過ldd arm-elf-gdb測試一下,看是否有(not found)文字。如果沒有,則說明此調試工具可以用。其余類同。
利用SkyEye-1.2.9自帶的測試例子arm_hello來驗證搭建的交叉編譯環境是否成功。測試步驟如下:
①利用cd/usr/local/testsuite/arm_hello命令進入測試例子目錄;
②執行make指令,編譯出可執行程序;
③執行skyeye–e hello后進入(skyeye)狀態;
④在(skyeye)提示符下輸入 start命令,啟動調試功能;
⑤在(skyeye)提示符下輸入 run命令,輸出結果如圖1所示。

圖1 測試結果
測試結果說明測試程序arm_hello運行正常,證明了搭建的基于SkyEye-1.2.9的嵌入式系統仿真環境是成功的。
因為SkyEye-1.0.0之前的版本用戶較少,所以本文只對SkyEye1.0.0及其以后的版本進行了安裝測試。下面的測試都是基于apt-get build-dep skyeye來配置編譯環境的。
①SkyEye-1.0.0、SkyEye-1.2.3及SkyEye-1.2.4的安裝測試
因為SkyEye-1.0.0、SkyEye-1.2.3及 SkyEye-1.2.4三個版本都沒有configure腳本,所以安裝SkyEye-1.0.0時直接用make編譯就可以了,而SkyEye-1.2.3與Sky-Eye-1.2.4需要用make NO_DBCT=1來編譯。編譯后把binary文件夾中的 skyeye可執行文件拷貝到/usr/local/bin中就可以了。
②SkyEye-1.2.5、SkyEye-1.2.6、SkyEye-1.2.7 及SkyEye-1.2.8的安裝測試。
因為SkyEye-1.2.5、SkyEye-1.2.6、SkyEye-1.2.7 及SkyEye-1.2.8五個版本存在configure腳本,所以安裝時需先執行./configure腳本,以生成makefile文件。五個版本都可以順利地執行./configure。在執行make時,只有SkyEye-1.2.8需要安裝texinfo軟件包,命令為apt-get install texinfo。
最后執行make install就可以正確安裝SkyEye了。由于測試程序方法與SkyEye-1.2.9類似,本文不再贅述。
總之,多個版本SkyEye的測試結果證明,本文提出的仿真環境構建方案是正確的、可行的。
[1]宋靖,吳慶波.嵌入式系統仿真運行環境SkyEye應用研究[J].微處理機,2007(2).
[2]陳渝,楊曄,李明,等.嵌入式系統仿真環境——SkyEye[J].電子設計應用,2004(2).
[3]王利明.一個開放源碼的嵌入式仿真環境——SkyEye[J].單片機與嵌入式系統應用,2003(9).