您的位置 首页 电路

AT91RM9200引导程序的树立(一)树立穿插编译东西链

写在前面:本系列文章将详细的讲述AT91RM9200引导程序的建立过程,其中包括建立交叉编译工具链,gdb+gdbserver的编译安装使用,tftp,NFS的…

写在前面:

本系列文章将详细的叙述AT91RM9200引导程序的树立进程,其间包含树立穿插编译东西链,gdb+gdbserver的编译装置运用,tftp,NFS的装置运用,超级终端或许minicom的运用,内核的编译晋级,U-Boot的移植,Ramdisk、根文件体系的树立制造,busybox的编译、运用等。然后重现完好的开发进程。在写这个文档的进程中,自己参阅了许多材料,在这儿要感谢互联网,感谢一切社区,论坛里忘我供给协助的同行们。特别感谢一下鲁郁先生,是他让我在AT91RM9200上成功的移植了U-Boot1.1.4。自己是从不明白一路走来,走的进程中将开发进程详细记叙下来,从一个初学者的视点来写下这个系列的文章,以便利其他初学者能得到一些协助,少走一些弯路。本系列文章首要叙述开发进程及实践运用,并不能很好的叙述一些原理性的东西,所以您在看这篇文章的时分最好要参阅其他材料,以构成一个完好的常识链。祝你旅途愉快。

开发环境

软件环境

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

U-Boot1.1.4,busybox1.2.2.1

硬件环境

CPU:AT91RM9200 ,180MHz(200MIPS)

存储器:32MSDRAM(MT48LC8M16A2)

64MbitsFlash(SST39VF6401B)

USB接口:USB-HostUSB-Device

网络接口:10/100MDM9161E

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 dont 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-x1 zzlzzl1806212 12月29 09:02 arm-softfloat-linux-gnu-addr2line

-rwxr-xr-x2 zzlzzl1864030 12月29 09:02 arm-softfloat-linux-gnu-ar

-rwxr-xr-x2 zzlzzl3248953 12月29 09:02 arm-softfloat-linux-gnu-as

-rwxr-xr-x2 zzlzzl287996 12月29 09:43 arm-softfloat-linux-gnu-c++

-rwxr-xr-x1 zzlzzl1761855 12月29 09:02 arm-softfloat-linux-gnu-c++filt

-rwxr-xr-x1 zzlzzl287111 12月29 09:43 arm-softfloat-linux-gnu-cpp

-rwxr-xr-x2 zzlzzl287996 12月29 09:43 arm-softfloat-linux-gnu-g++

-rwxr-xr-x2 zzlzzl285852 12月29 09:43 arm-softfloat-linux-gnu-gcc

-rwxr-xr-x2 zzlzzl285852 12月29 09:43 arm-softfloat-linux-gnu-gcc-3.4.1

-rwxr-xr-x1 zzlzzl16241 12月29 09:43 arm-softfloat-linux-gnu-gccbug

-rwxr-xr-x1 zzlzzl103366 12月29 09:43 arm-softfloat-linux-gnu-gcov

-rwxr-xr-x1 zzlzzl2286490 12月29 09:02 arm-softfloat-linux-gnu-gprof

-rwxr-xr-x2 zzlzzl2542659 12月29 09:02 arm-softfloat-linux-gnu-ld

-rwxr-xr-x2 zzlzzl1840205 12月29 09:02 arm-softfloat-linux-gnu-nm

-rwxr-xr-x1 zzlzzl2344807 12月29 09:02 arm-softfloat-linux-gnu-objcopy

-rwxr-xr-x1 zzlzzl2487727 12月29 09:01 arm-softfloat-linux-gnu-objdump

-rwxr-xr-x2 zzlzzl1864029 12月29 09:02 arm-softfloat-linux-gnu-ranlib

-rwxr-xr-x1 zzlzzl384396 12月29 09:02 arm-softfloat-linux-gnu-readelf

-rwxr-xr-x1 zzlzzl1712993 12月29 09:01 arm-softfloat-linux-gnu-size

-rwxr-xr-x1 zzlzzl1689683 12月29 09:02 arm-softfloat-linux-gnu-strings

-rwxr-xr-x2 zzlzzl2344806 12月29 09:02 arm-softfloat-linux-gnu-strip

-rwxrwxr-x1 zzlzzl19084 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 HISTSIZEINPUTRC

在其上面一行增加:

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-x1 rootroot14335251 12月29 15:53 arm-softfloat-linux-gnu-gdb

-rwxr-xr-x1 rootroot14335296 12月29 15:53 arm-softfloat-linux-gnu-gdbtui

-rwxr-xr-x1 rootroot2489663 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体系下则康复正常。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/277276.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部