深度剖析E680G開發一.所謂的交叉編譯環境
草木瓜
相關資源下載 http://play.younet.com/view.php?tid=18578
20060906
一、前言
前面文章涵蓋的內容對普通人來說應該都比較容易理解和運用,然而這
僅僅只能說明你會剛會用罷了,從本文開始,我們需要更深入一步,去探討
E680G的作業系統的開發環境,自然內容也變專業了。
很遺憾目前網上有關的資料都不盡如人意,也許是水平太高了吧,反而
寫出來的文章讓人看了一頭霧水。為了能讓更多人能跨過這個門檻,我會用
較多的篇幅來介紹相關專業知識。另外最好有真實的Linux環境,文中操作
皆使用虛擬機器RedHatLinux9。
希望看完這篇文章得出的結論是:搭建E680交叉編譯開發環境並不難!
二、交叉編譯理論準備
我們經常會說平台,平台出現的根源要從處理器(CPU)說起,不同的CPU
採用不同的指令集。所謂指令集,則是CPU中用來計算和控制電腦系統的一
套指令的集合,而每一種新型的CPU在設計時就規定了一系列與其他硬體電路
相配合的指令系統。
E680手機系列採用的是Inter XScale處理器,基於ARM v5TE體繫結構,
擴充了ARM指令集的核心,本質還是ARM處理器。這和我們平時經常接觸PC機
的CPU是不同的,PC機大多採用Inter X86的指令集。
ARM處理器最大的特點就是:功耗低,應用方案靈活,可以方便為多媒體
訊號添加指令集等。目前來說幾乎所有的手持作業系統包括智能手機都採用了
ARM架構進行設計。
我們如果要在E680系列所採用的作業系統----MontaVista Linux下開發,
就需要一個編譯器能把C程式碼轉換為相容ARM指令集的機器語言。這種編譯
就稱為交叉編譯。
要深刻理解這個概念,我們再對比一下C,Java這兩種語言。
Java號稱Compile once,run everywhere。即編譯一次到處運行。事實
也確實如此,Java編譯產生的是位元組代碼,然後由各個平台的Java虛擬機器解
釋執行。實際上在E680G上,J2ME的JAR包是由/usr/SYSjava/kvm解釋執行的。
Java是通過提供各類平台的虛擬機器程式來實現平台無關性。這樣也很大的犧
牲了執行效率。
C語言則不一樣,主要特點就是接近低層,可根據不同處理器產生高效的
機器代碼。適合做複雜的運算和即時的控制。所以針對C語言,會有很多不同
平台的編譯器負責將代碼直接編譯成高效的機器指令。
說到這裡,我們顯然明白了:普通Linux PC機上的GCC編譯器編譯的可執
行程式複製到E680上是不能夠被執行的。要在E680平台上進行開發,需要構造
一個能相容ARM的GCC了,這就是所謂的交叉編譯環境。
三、構造E680交叉編譯環境
這裡我們使用很簡單的一個構造方法。在http://lsb.blogdns.net/ezx-crosstool
下載ezx-crosstool-0.5.tar.bz2檔案,這個工具是由個人整理的,去掉了與ARM
無關的很多指令碼,並且限定了需要編譯的檔案版本,使用起來比較簡單。
本機建立了一個使用者gcc,準備用於編譯,root使用者會提示禁止操作的。
這裡使用的是在/home/gcc目錄下用gcc使用者解壓:
bunzip2 ezx-crosstool-0.5.tar.bz2
tar xvf ezx-crosstool-0.5.tar
系統會自動產生/home/gcc/ezx-crosstool-0.5這個目錄。
在ftp://ftp.gnu.org/pub/gnu下載如下四個檔案,且必須是如下版本:
binutils-2.15.tar.bz2 一組開發工具,包括連接器、彙編器
和其他用於目標檔案和檔案的工具
gcc-3.3.6.tar.bz2 GCC編譯器的原始碼
glibc-2.3.2.tar.bz2 提供系統調用和基本函數庫
glibc-linuxthreads-2.3.2.tar.bz2 用於支援POSIX線程的函數庫
在http://www.kernel.org/pub/linux/kernel/v2.4/下載如下一個檔案:
linux-2.4.26.tar.bz2 Linux核心原始碼
全部下載後,放在/home/gcc/ezx-crosstool-0.5/downloads下,開啟
/home/gcc/ezx-crosstool-0.5/build.sh檔案,內容如下:
#!/bin/sh
set -ex
CROSSTOOL_DIR=`pwd`
TARBALLS_DIR=$CROSSTOOL_DIR/downloads
RESULT_TOP=$CROSSTOOL_DIR/gcc-arm-iwmmxt
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES
...
詳細內容以後會解釋,這裡只注意RESULT_TOP=$CROSSTOOL_DIR/gcc-arm-iwmmxt
這句,這是說明編譯後的路徑,可以自訂修改。
如:
RESULT_TOP=/home/gcc/arm
到這裡,準備工作就結束了。
cd /home/gcc/ezx-crosstool-0.5
./build.sh
我使用的筆記本(512M+PM1.7G)+虛擬機器,大概不到兩個小時。完成後在系統內容
PATH添加新路徑內容。
export PATH=$PATH:/home/gcc/arm/gcc-3.3.6-glibc-2.3.2/arm-linux/bin
四、測試環境
hello.c
#include <stdio.h>
int main()
{
float myValueA=1.9;
float myValueB=2.8;
printf("Hello!My E680!/n");
printf("TestValue:%f/n",myValueA+myValueB);
return 0;
}
輸入:arm-linux-gcc -o moto hello.c,產生可執行檔,這裡在Linux下顯
然是不能執行的,複製到你的手機上,在telnet下進入可執行檔所在目錄,輸入
命令:./moto,顯示:
Hello!My E680!
TestValue:4.700000
可以看到正常顯示,而且也沒有所謂的浮點型Bug。這裡我們沒有使用圖形化的
內容,所以不需要設定環境變數,以後會有更具體的例子說明,現在交叉編譯環境
已成功搭建,終於邁開第一步了。我們也將在下文做進一步的討論。