`
izuoyan
  • 浏览: 9220698 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

AT91RM9200引导程序的建立(一)--------建立交叉编译工具链

阅读更多

写在前面:

本系列文章将详细的讲述AT91RM9200引导程序的建立过程,其中包括建立交叉编译工具链,gdb+gdbserver的编译安装使用,tftp,NFS的安装使用,超级终端或者minicom的使用,内核的编译升级,U-Boot的移植,Ramdisk、根文件系统的建立制作,busybox的编译、应用等。从而重现完整的开发过程。在写这个文档的过程中,本人参考了许多资料,在这里要感谢互联网,感谢所有社区,论坛里无私提供帮助的同行们。特别感谢一下鲁郁先生,是他让我在AT91RM9200上成功的移植了U-Boot<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.1.4</chsdate>。本人是从不懂一路走来,走的过程中将开发过程详细记述下来,从一个初学者的角度来写下这个系列的文章,以方便其他初学者能得到一些帮助,少走一些弯路。本系列文章主要讲述开发过程及实际应用,并不能很好的讲述一些原理性的东西,所以您在看这篇文章的时候最好要参考其他资料,以形成一个完整的知识链。祝你旅途愉快。

开发环境

软件环境

宿主机:Redhat9.0 ,虚拟机vmware<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">5.5.1</chsdate>

U-Boot <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.1.4</chsdate>, busybox1.2.2.1

硬件环境

CPU:AT91RM9200 ,180MHz(200MIPS)

存储器:<chmetcnv w:st="on" unitname="m" sourcevalue="32" hasspace="False" negative="False" numbertype="1" tcsc="0"><span lang="EN-US">32M</span></chmetcnv> SDRAM(MT48LC<chmetcnv w:st="on" unitname="m" sourcevalue="8" hasspace="False" negative="False" numbertype="1" tcsc="0">8M</chmetcnv><chmetcnv w:st="on" unitname="a" sourcevalue="16" hasspace="False" negative="False" numbertype="1" tcsc="0">16A</chmetcnv>2)

64Mbits Flash(SST39VF6401B)

USB接口:USB-Host USB-Device

网络接口: 10/<chmetcnv w:st="on" unitname="m" sourcevalue="100" hasspace="False" negative="False" numbertype="1" tcsc="0">100M</chmetcnv> DM9161E

DBGU串行调试接口

JTAG接口

移植过程

虚拟机

关于虚拟机的安装使用,这里就不介绍了。使用很方便,网上也有大量的资料。大家可自行查阅。我们使用的是<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">5.5.1</font></span></chsdate>版本,当然,你也可以使用最新的版本。

建立交叉编译工具链。

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

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

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

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

本文以i686平台,虚拟机vmware<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">5.5.1</chsdate>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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>.tar.gz glibc-2.3.3.tar.gz linux-2.6.17

binutils-2.15.tar.gz glibc-linuxthreads-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.3.3</chsdate>.tar.gz

所以,你的首要任务是下载这些源代码软件包,并将它们放在/home/zzl/downloads下面,保证这些包的所有者为当前用户而不是根用户。

由于我们以后的内核版本为<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US"><font face="Times New Roman">2.6.17</font></span></chsdate>,所以我们还需要下载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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.3.3</chsdate>-glibc-2.3.2.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.0</chsdate>-glibc-2.3.2.dat` sh all.sh --notest

eval `cat arm-softfloat.dat gcc-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-glibc-2.3.3.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-glibc-20040827.dat` sh all.sh --notest

echo Done.

从这一行eval `cat arm-softfloat.dat gcc-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-glibc-2.3.3.dat` sh all.sh --notest

可以看出,我们的gcc版本采用<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US"><font face="Times New Roman">3.4.1</font></span></chsdate>glibc版本采用2.3.3
我们再来看gcc-3.4.1-glibc-2.3.3.dat这个文件

BINUTILS_DIR=binutils-2.15

GCC_DIR=gcc-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>

GLIBC_DIR=glibc-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.3.3</chsdate>

LINUX_DIR=linux-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.6.8</chsdate>

GLIBCTHREADS_FILENAME=glibc-linuxthreads-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.3.3</chsdate>

由于我们采用的是Linux-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.6.17</chsdate>的内核包,所以这里要将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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-glibc-2.3.3/arm-softfloat-linux-gnu

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

[zzl@localhost]ls –l /opt/crosstool/gcc-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>

-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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-glibc-2.3.3/arm-softfloat-linux-gnu/bin

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

当然,应用程序的调试是开发过程中必不可少的环节之一。Linux下的GNU的调试器即是GDB。所以我们有了这个交叉编译工具链之后,可以用它来编译gdbgdbserver。如果你暂时不需要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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6

[root@localhost]./configure --target=arm-softfloat-linux-gnu --prefix=/opt/crosstool/gcc-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-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-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.1</chsdate>-glibc-2.3.3/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc

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

GDB+GDBServer的使用

在目标系统上启动gdbserver,其实就是在超级终端下或者minicom下启动gdbserver。这里将gdbserver放在宿主机的NFS设置的共享目录下/home/zzl,该目录挂载在目标板/work下。宿主机的ip192.168.1.1,目标板的ip192.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命令如listcontinuenextstepbreak等进行程序调试了。

对于GDBServer出现的问题

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

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

分享到:
评论

相关推荐

    AT91RM9200-U-Boot.rar_AT91RM9200-U-Boot_at91rm9200

    AT91RM9200-U-Boot是一个针对AT91RM9200微处理器的引导加载程序,主要用于在傅里叶开发板上进行系统启动和移植操作。AT91RM9200是Atmel公司推出的一款基于ARM920T内核的微控制器,广泛应用于嵌入式系统设计,特别是...

    AT91RM9200-Boot.tar.gz_at91rm9200_at91rm9200 boot_at91rm9200-lin

    AT91RM9200-Boot.tar.gz 是一个针对AT91RM9200微处理器的引导源代码包,这个压缩文件包含了用于在AT91RM9200板上启动系统的必要代码。AT91RM9200是由Atmel公司设计的一款基于ARM920T内核的微控制器,广泛应用于工业...

    AT91RM9200-BasicUHP-ARM1_2-2_0

    AT91RM9200-BasicUHP-ARM1_2-2_0 是一个针对AT91RM9200微处理器的基础超高速USB(Universal Host Peripheral, UHP)开发平台。这个平台主要用于帮助开发者理解和应用AT91RM9200芯片在USB设备和主机模式下的功能。...

    Linux-2.6.20内核移植到AT91RM9200-EK.docx

    - 为了编译内核,需要交叉编译工具链,如`arm-linux-gcc-3.4.1.tar.bz2`,通常可以从`handhelds.org`获取。 - 同时,还需要BusyBox 1.2.2.1,用于构建基础系统服务的精简版工具集。 2. **建立交叉编译环境** - ...

    Linux-At91rm9200.rar_at91rm9200_at91rm9200 linux_linux

    为了编译Linux内核和用户空间应用程序,需要一个适合At91rm9200架构的交叉编译工具链。这包括了GCC编译器、链接器和头文件等,确保生成的二进制代码能在目标硬件上执行。 四、引导加载程序 在Linux启动前,通常需要...

    AT91RM9200-Boot.tar.gz_at91rm9200

    4. **开发环境**:为了编译和调试这个引导加载程序,开发者通常需要一个包含交叉编译工具链的开发环境,如GNU Arm Embedded Toolchain,并可能需要集成开发环境(IDE)如Eclipse或Makefile项目结构。此外,可能还...

    Linux-2.6.20内核移植到AT91RM9200-EK[定义].pdf

    在本文中,我们将深入探讨如何将Linux-2.6.20内核移植到AT91RM9200-EK开发板上,这是一个涉及嵌入式Linux系统开发的重要过程。AT91RM9200-EK是一款基于ARM920T处理器的开发套件,广泛用于嵌入式系统的原型设计和开发...

    AT91RM9200-Loader.rar_at91rm9200_loader

    AT91RM9200-Loader 是一个针对AT91RM9200微处理器的引导加载程序,主要用于在系统启动时加载操作系统或者其他固件到芯片的内存中。AT91RM9200是Atmel公司设计的一款基于ARM920T内核的微控制器,广泛应用于嵌入式系统...

    AT91RM9200开发笔记(10):PPPD-2.4.3交叉编译

    由于AT91RM9200的硬件架构与我们通常使用的开发环境(如Linux或Windows桌面系统)不同,我们需要在主机系统上使用特定的交叉编译工具链来构建适用于目标设备的PPPD软件。 在开始交叉编译之前,确保你已经安装了以下...

    MiniGUI在AT91RM9200开发板上的移植

    需要注意的是,AT91RM9200开发板上使用的Glibc库版本为2.1.3,而默认的交叉编译工具链中包含的库版本为2.2.3。因此,为了确保编译出的程序能在开发板上顺利运行,需要使用与开发板上Linux内核版本相同的库进行编译。...

    AT91RM9200-Loader.tar.gz_Bootloader_at91 bootloader_at91rm9200_i

    5. **编译与烧录**:用户需要一个交叉编译工具链来编译源代码,生成可执行文件,然后通过编程器或调试器将其烧录到AT91RM9200的Flash中。 6. **调试与测试**:开发过程中,可能需要使用仿真器或JTAG接口进行调试,...

    minigui 在AT91RM9200上的移植,

    1. **交叉编译工具链准备**:首先,需要搭建一个针对AT91RM9200架构的交叉编译工具链,确保MiniGUI源码能够被正确编译为目标平台可执行的二进制代码。 2. **MiniGUI源码获取**:下载MiniGUI源码包,并根据官方文档...

    at91rm9200使用手册

    ### AT91RM9200使用手册关键知识点解析 #### 第一章:YL9200开发板套件介绍 ##### 1.1 YL9200开发板简介 - **概述**:YL9200是一款基于ARM920T内核的工业级开发板,该开发板内置了100M以太网接口,同时支持USB ...

    at91rm9200_test.rar_at91rm9200

    这种开发环境需要一个交叉编译工具链,它包含了针对目标架构的编译器、链接器和其他工具,使得可以在不同的处理器架构之间构建软件。 3. **leddrv.c**:这个文件很可能是LED驱动程序的源代码。在嵌入式系统中,LED...

    AT91RM9200开发笔记(1):准备工作

    AT91RM9200是一款基于ARM920T内核的微处理器,由Atmel公司设计,常用于嵌入式系统开发。本篇笔记将深入探讨AT91RM9200的开发准备工作,旨在帮助开发者快速上手这款芯片的使用。 一、硬件平台准备 在开始AT91RM9200...

    MiniGUI_at_AT91RM9200.rar_9200_at91_at91rm9200_minigui_minigui p

    5. **编译环境搭建**:建立一个适合AT91RM9200的交叉编译环境,包括选择合适的工具链,配置编译选项,以生成能在目标硬件上运行的二进制代码。 6. **配置与构建**:MiniGUI通常有多种配置选项,如窗口系统、事件...

    MiniGUI_on_AT91RM9200.rar_at91_at91rm9200_minigui

    1. **环境准备**:首先,确保Linux操作系统已经成功地在AT91RM9200上运行,包括交叉编译工具链的配置和内核的编译。安装必要的开发工具,如make、gcc、gdb等,以便进行源码编译和调试。 2. **获取MiniGUI源码**:从...

Global site tag (gtag.js) - Google Analytics