深度剖析E680G开发一.所谓的交叉编译环境

深度剖析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。这里我们没有使用图形化的
内容,所以不需要设置环境变量,以后会有更具体的例子说明,现在交叉编译环境
已成功搭建,终于迈开第一步了。我们也将在下文做进一步的讨论。

你可能感兴趣的:(深度剖析E680G开发一.所谓的交叉编译环境)