深度剖析E680G開發一.所謂的交叉編譯環境

來源:互聯網
上載者:User

深度剖析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。這裡我們沒有使用圖形化的
內容,所以不需要設定環境變數,以後會有更具體的例子說明,現在交叉編譯環境
已成功搭建,終於邁開第一步了。我們也將在下文做進一步的討論。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.