一、前言
前面文章涵蓋的內容對普通人來說應該都比較容易理解和運用,然而這僅僅只能說明你會剛會用罷了,從本文開始,我們需要更深入一步,去探討E680G的操作系統的開發環境,自然內容也變專業了。
很遺憾目前網上有關的資料都不盡如人意,也許是水平太高了吧,反而寫出來的文章讓人看了一頭霧水。為了能讓更多人能跨過這個門檻,我會用較多的篇幅來介紹相關專業知識。另外最好有真實的linux環境,文中操作皆使用虛擬機RedHatLinux9。
希望看完這篇文章得出的結論是:搭建E680交叉編譯開發環境并不難!
相關部分附件下載http://play.younet.com/view.php?tid=18578
二、交叉編譯理論準備
我們經常會說平臺,平臺出現的根源要從處理器(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了,這就是所謂的交叉編譯環境。
這里我們使用很簡單的一個構造方法。在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下顯
然是不能執行的,復制到你的手機上,設置好環境變量,或者使用以下Shell腳本,
#!/bin/bash
export QTDIR=/usr/lib/ezx
export LD_LIBRARY_PATH=$QTDIR/lib
export EZX_RES_F >
補充說明
草木瓜
20060917
一、說明
大概是編輯的緣故,上篇文章提交上去后,審批完居然文章未尾少了很多行。
令人詫異。現只好重發一遍未尾被遺漏的內容。
再者文章本身難免有疏漏,提交又不能隨意更改,如有問題可查看:
完全系列文章地址:http://blog.csdn.net/liwei_cmg
文章相關的重要資源下載地址:http://play.younet.com/view.php?tid=18578
以上的網址倒能夠及時更新。
二、末尾內容
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。這樣沒有使用圖形化內容,所以也不需要設置環境變量,在后面的文章會有更具體的體現,現在交叉編譯環境已成功搭建,終于邁開第一步了。
新聞熱點
疑難解答
圖片精選