公告

非常抱歉,由于我们的服务器提供商硬盘出错,数据丢失,网站重建中...
I am so sorry, because of our server's hard disk error, data lost, the website reconstructioning
QQ:512000523
MSN : funchip@hotmail.com

 
首页 arrow 技术文章 arrow setp arrow AT91RM9200引导程序的建立--------建立交叉编译工具链
AT91RM9200引导程序的建立--------建立交叉编译工具链 Recommend to my friend via E-mail(推荐给朋友)
作者: Administrator   
2007-11-14

开发环境
软件环境

              宿主机:Redhat9.0 ,虚拟机vmware5.5.1

U-Boot 1.1.4,    busybox1.2.2.1

硬件环境

              CPU:AT91RM9200 ,180MHz(200MIPS)

              存储器:32M   SDRAM(MT48LC8M16A2)

                            64Mbits   Flash(SST39VF6401B)

              USB接口:USB-Host     USB-Device

           网络接口: 10/100M    DM9161E

              DBGU串行调试接口

            JTAG接口

 

移植过程
虚拟机

关于虚拟机的安装使用,这里就不介绍了。使用很方便,网上也有大量的资料。大家可自行查阅。我们使用的是5.5.1版本,当然,你也可以使用最新的版本。

 

建立交叉编译工具链。

交叉编译工具链就是为了在一个平台体系结构下(如X86 PC机)能编译,链接,处理和调试另一个平台体系结构下(如ARM)的程序,使得编译生成的程序能够在另一平台下运行。

Linux使用的工具链软件是:Binutils,gcc,glibc,gdb。

其中binutils是二进制程序处理工具。gcc是编译器。glibc是应用程序编程的函数库文件软件包。gdb是调试工具。

对交叉编译工具链的编译是很麻烦和琐碎的一件事,如果自己一个一个编译,很可能会遇到各种各样的麻烦。幸好有人做了一套脚本程序,可以很方便的生成你所需要的交叉编译工具链。我们使用的脚本就是crosstool,关于详细内容可以访问http://kegel.com/crosstool/,可以从该网站下载到它的脚本,补丁和文档。

本文以i686平台,虚拟机vmware5.5.1,redhat9.0来建立arm交叉编译工具链。

我们采用crosstool0.42来作为我们编译交叉编译工具链的脚本。详细的用法说明请阅读网站上的文档crosstool-how to 。

[zzl@localhost] tar -xzvf crosstool-0.42.tar.gz

[zzl@localhost]cd crosstool-0.42

我们可以看到目录下有很多.sh脚本和.dat配置文件。每一个支持的CPU都有它所相应的脚本,如我们选用demo-arm-softfloat.sh 就是建立目标为支持软浮点的arm的交叉编译工具链。其中需要我们记住的三个重要的变量:
             TARBALLS_DIR=$HOME/downloads  

RESULT_TOP=/opt/crosstool

GCC_LANGUAGES="c,c++"

第一行指明我们放置源代码软件包的目录,我的主目录是/home/zzl。第二行指明我们生成的交叉编译工具链在/opt/crosstool下。第三行表示,我们的交叉编译工具链支持c,c++语言。

我们需要如下压缩包:
gcc-3.4.1.tar.gz                glibc-2.3.3.tar.gz         linux-2.6.17
binutils-2.15.tar.gz            glibc-linuxthreads-2.3.3.tar.gz
所以,你的首要任务是下载这些源代码软件包,并将它们放在/home/zzl/downloads下面,保证这些包的所有者为当前用户而不是根用户。

由于我们以后的内核版本为2.6.17,所以我们还需要下载linux2.6.17的内核包,并放在/home/zzl/downloads/下。

我们选择的配置是:demo-arm-softfloat.sh,其内容具体如下:

                #!/bin/sh

set -ex

TARBALLS_DIR=$HOME/downloads

RESULT_TOP=/opt/crosstool

export TARBALLS_DIR RESULT_TOP

GCC_LANGUAGES="c,c++"

export GCC_LANGUAGES

 

# Really, you should do the mkdir before running this,

# and chown /opt/crosstool to yourself so you don't need to run as root.

mkdir -p $RESULT_TOP

 

# Build the toolchain.  Takes a couple hours and a couple gigabytes.

 

#eval `cat arm-softfloat.dat gcc-3.3.3-glibc-2.3.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.4.0-glibc-2.3.2.dat` sh all.sh --notest

 eval `cat arm-softfloat.dat gcc-3.4.1-glibc-2.3.3.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-3.4.1-glibc-20040827.dat`  sh all.sh --notest

 

echo Done.

从这一行eval `cat arm-softfloat.dat gcc-3.4.1-glibc-2.3.3.dat` sh all.sh --notest

可以看出,我们的gcc版本采用3.4.1,glibc版本采用2.3.3。
       我们再来看gcc-3.4.1-glibc-2.3.3.dat这个文件

BINUTILS_DIR=binutils-2.15

GCC_DIR=gcc-3.4.1

GLIBC_DIR=glibc-2.3.3

LINUX_DIR=linux-2.6.8

GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.3

由于我们采用的是Linux-2.6.17的内核包,所以这里要将linux-2.6.8改成linux-2.6.17。否则,脚本执行解压缩时,找不到linux源代码包。

建立我们的目标生成目录

[zzl@localhost]sudo mkdir /opt/crosstool

[zzl@localhost]sudo chown zzl /opt/crosstool

 

执行我们的配置文件arm-softfloat.sh

[zzl@localhost]sh demo-arm-softfloat.sh

    这里要注意运行该配置文件不能以root来运行,crosstool-0.42, /opt/crosstool为非root用户所有。

如果一切顺利的话,经过一段时间的等待,得到一个新目录:(如果不顺利且始终找不到错误原因的话,我建议你重新安装redhat9.0的操作系统,然后按照先前步骤进行。:))

/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu

交叉编译工具就在该目录的bin/下

[zzl@localhost]ls –l /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin

总用量 29184

-rwxr-xr-x    1 zzl      zzl       1806212 12月 29 09:02 arm-softfloat-linux-gnu-addr2line

-rwxr-xr-x    2 zzl      zzl       1864030 12月 29 09:02 arm-softfloat-linux-gnu-ar

-rwxr-xr-x    2 zzl      zzl       3248953 12月 29 09:02 arm-softfloat-linux-gnu-as

-rwxr-xr-x    2 zzl      zzl        287996 12月 29 09:43 arm-softfloat-linux-gnu-c++

-rwxr-xr-x    1 zzl      zzl       1761855 12月 29 09:02 arm-softfloat-linux-gnu-c++filt

-rwxr-xr-x    1 zzl      zzl        287111 12月 29 09:43 arm-softfloat-linux-gnu-cpp

-rwxr-xr-x    2 zzl      zzl        287996 12月 29 09:43 arm-softfloat-linux-gnu-g++

-rwxr-xr-x    2 zzl      zzl        285852 12月 29 09:43 arm-softfloat-linux-gnu-gcc

-rwxr-xr-x    2 zzl      zzl        285852 12月 29 09:43 arm-softfloat-linux-gnu-gcc-3.4.1

-rwxr-xr-x    1 zzl      zzl         16241 12月 29 09:43 arm-softfloat-linux-gnu-gccbug

-rwxr-xr-x    1 zzl      zzl        103366 12月 29 09:43 arm-softfloat-linux-gnu-gcov

-rwxr-xr-x    1 zzl      zzl       2286490 12月 29 09:02 arm-softfloat-linux-gnu-gprof

-rwxr-xr-x    2 zzl      zzl       2542659 12月 29 09:02 arm-softfloat-linux-gnu-ld

-rwxr-xr-x    2 zzl      zzl       1840205 12月 29 09:02 arm-softfloat-linux-gnu-nm

-rwxr-xr-x    1 zzl      zzl       2344807 12月 29 09:02 arm-softfloat-linux-gnu-objcopy

-rwxr-xr-x    1 zzl      zzl       2487727 12月 29 09:01 arm-softfloat-linux-gnu-objdump

-rwxr-xr-x    2 zzl      zzl       1864029 12月 29 09:02 arm-softfloat-linux-gnu-ranlib

-rwxr-xr-x    1 zzl      zzl        384396 12月 29 09:02 arm-softfloat-linux-gnu-readelf

-rwxr-xr-x    1 zzl      zzl       1712993 12月 29 09:01 arm-softfloat-linux-gnu-size

-rwxr-xr-x    1 zzl      zzl       1689683 12月 29 09:02 arm-softfloat-linux-gnu-strings

-rwxr-xr-x    2 zzl      zzl       2344806 12月 29 09:02 arm-softfloat-linux-gnu-strip

-rwxrwxr-x    1 zzl      zzl         19084 12月 29 09:43 fix-embedded-paths

我们可以看出,交叉编译的所有工具都在这里。

将这个路径加进PATH变量中:

[zzl@localhost]export PATH=$PATH :/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin

如果每次都要输入上面的shell命令,的确是比较烦人的事情。我们可以在linux启动脚本中添加该语句。从而避免每次开机后重新输入。我是在启动脚本/etc/profile中添加了环境变量。

找到这一行export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE  INPUTRC

在其上面一行添加:

PATH=$PATH :/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin

 

今后我们编译程序的时候,就用arm-softfloat-linux-gnu-gcc 来编译我们的程序。

当然,应用程序的调试是开发过程中必不可少的环节之一。Linux下的GNU的调试器即是GDB。所以我们有了这个交叉编译工具链之后,可以用它来编译gdb和gdbserver。如果你暂时不需要GDB的话,也可以先略过这一步。

GDB的编译安装

目前比较新的是版本是GDB6.6。其官方网站是http://www.gnu.org/software/gdb/

下载gdb-6.6.tar.gz源代码包到/usr/src下。

[root@localhost]tar –zxvf gdb-6.6.tar.gz

[root@localhost]cd gdb-6.6

配置很简单,只需要指定目标板体系结构和安装路径即可。

[root@localhost]mkdir /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6

[root@localhost]./configure  --target=arm-softfloat-linux-gnu  --prefix=/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6 -v

[root@localhost]make

[root@localhost]make install

顺利的话,则在gdb6.6下生成新的目录,其中gdb工具就在bin目录下。

[root@localhost]ls –l /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6

/bin

总用量 30476

-rwxr-xr-x    1 root     root     14335251 12月 29 15:53 arm-softfloat-linux-gnu-gdb

-rwxr-xr-x    1 root     root     14335296 12月 29 15:53 arm-softfloat-linux-gnu-gdbtui

-rwxr-xr-x    1 root     root      2489663 12月 29 15:52 arm-softfloat-linux-gnu-run

同样在环境变量中添加gdb的路径

[root@localhost]export PATH=$PATH :/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6/bin

今后调试程序的时候,用arm-softfloat-linux-gnu-gdb 来调试。

gdbserver的编译

[root@localhost]cd gdb-6.6

[root@localhost]cd gdb/gdbserver

[root@localhost] ./configure --target=arm-softfloat-linux-gnu –-host=arm-softfloat-linux-gnu

[root@localhost] make CC=/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc

如果不出错的话,将在当前目录下生成两个可执行文件:gdbserver和gdbreplay。以后就可以用gdb+gdbserver调试我们开发板上的程序了。至此,我们的交叉编译工具链已经基本建立。可以用来作为我们bootloader的编译环境了。

 

GDB+GDBServer的使用

在目标系统上启动gdbserver,其实就是在超级终端下或者minicom下启动gdbserver。这里将gdbserver放在宿主机的NFS设置的共享目录下/home/zzl,该目录挂载在目标板/work下。宿主机的ip为192.168.1.1,目标板的ip为192.168.1.33

超级终端或者minicom下

[root@localhost]cd /work

[root@localhost]./gdbserver 192.168.1.1:1234 hello

出现提示:
Process /work/hello created: pid=69
Listening on port 1234

这时切换到宿主机的控制台,运行

[root@localhost] arm-softfloat-linux-gnu-gdb hello

(gdb) target remote 192.168.2.33:1234

出现提示:
Remote debugging using 192.168.1.33:1234
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()
同时在minicom下提示:
Remote debugging from host 192.168.2.100
(gdb)
连接成功,这时候就可以输入各种gdb命令如list、continue、next、step、break等进行程序调试了。

 

对于GDBServer出现的问题

1.  GDBServer调试时出现packet error 问题。

主要是虚拟机与目标机的网络连接要经过windows,数据包容易丢失。换到Linux系统下则恢复正常。

评论 (0)Add Comment

输入评论内容
quote
bold
italicize
underline
strike
url
image
quote
quote
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley
Smiley

security code
输入验证码


busy
最近更新 ( 2007-11-18 )
 
< 上一篇   下一篇 >

© 2008 杭州福芯电子 浙ICP备05040812号
Joomla!是基于GNU/GPL许可发行的免费软件.