基于ATMEL AT91RM9200的嵌入式Linux移植笔记


先谈一下对于嵌入式开发流程和嵌入式开发环境拓扑结构的认识。
刚开始比较盲目,看得书也不多,现在才算是大体上有了些了解。从开发产品的角度简单的描述如下:
一、嵌入式开发流程简介
假设我们现在进行一项嵌入式开产品的开发,比如说智能电力系统终端,那么我想首先应该对完整的开发流程有一个大致的了解,才不致于在以后的工作中被动。下面对嵌入式linux开发简单的介绍一下。
1、系统的需求分析
2、硬件平台的选择和设计
3、软件开发
(3-1)建立开发环境。
(3-2)引导装载程序。
(3-3)内核裁减与编译。
(3-4)建立文件系统。
二、嵌入式开发环境拓扑结构简介
嵌入式开发环境一般由:宿主机(Linux Server)、工作站、嵌入式目标系统(target board)和将它们连在一起的网络环境。
1、linux server:嵌入式linux内核编译、应用程序编译的公共平台,有单独的一台pc机充当,安装标准的linux操作系统,比如redhat,debian等等。
2、工作站:为普通局域网计算机,以支持小组项目开发。工作站一般安装windows,需要linux服务器时,可以从工作站远程登陆到linux server。
3、target board:这是需要开发的最终产品,可以根据需要与工作站连接(通常通过串口或者usb接口),或连至局域网。
4、工作站需要安装ftp客户端(cuteftp、flashfxp等)和telnet客户端程序(secureCRT等),linux服务器应该开通ftp和telnet服务,还有ssh。
综 述过程:开发人员在一台工作站进行操作,通过远程登陆的方式操作linux server,并且使用ftp在linux server和工作站进行文件传输,同时target board需要与网络连接,其串口与工作站的RS232接口连接。使用工作站上的超级终端作为嵌入式目标系统输入/输出端。
对于开发流程有了一定的了解后就有了目标,这样才能够不是太郁闷。
我的开发环境:Windows XP SP2+VMWARE+RedHat 9.0
首先规划一下,我先建立了一个用户armlinux,我的全部工作都是在这个用户根目录下完成。
$pwd
/home/armlinux
$mkdir bootloader debug images software source kernel rootfiles sysapps tmp tools program
$ls
bootloader images program    software sysapps tools
debug       kernel rootfiles source    tmp
然后建立环境变量,直接在.bash_profile中改就可以了。
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
export TARGET=arm-linux
export PRJROOT=/home/armlinux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=$PATH:$HOME/bin:$PREFIX/bin:/sbin:/usr/sbin:/usr/local/sbin
unset USERNAME
这样在下一次进入此用户时,环境变量就生效了。如果想立刻生效,那么可以用下面的命令:$source .bash_profile。这种方法可以使这些环境变量在进入用户armlinux后就会成效,比较方便。
三、建立交叉编译环境
这一步工作我已经很顺利的完成了。刚开始时,手动建立交叉编译工具链,很困难,出现了很多问题,幸亏网上有不少 的资料可以参考。关于手动建立交叉编译工具链的过程我已经做了总结,放到blog上了。现在可以获得已经编译好的工具链,这样比较方便些,毕竟几个小时的 手动建立过程太繁琐,太容易出错了。
3.1 获取交叉编译工具链
在linux server上以ftp方式登陆:
这是系统提示输入用户名和密码,不要随便输,那样可能会连接失败。该ftp站点是允许匿名访问的,所以你可以用下面的用户名:anonymous登陆,密码无,直接回车就可以了。
进入后执行:
ftp>cd pub/armlinux/toolchain/
ftp>bin
ftp>get cross-2.95.3.tar.bz2
ftp>get cross-3.0.tar.bz2
ftp>get cross-3.2.tar.bz2
ftp>get README
ftp>bye
Linux 2.4.xx及其以下的内核源码用2.95.3的交叉编译器来编译就可以了;而2.6.xx的内核源码一般要用到cross-3.x以上的版本来编译。所 以我全都下载下来了,备用。要想用更新的版本,则可以到网站ftp://ftp.handhelds.org/projects/toolchain下 载,这里可以下在到cross-3.3.2和cross-3.4.1,默认路径是/usr/local/arm/<版本号>。
从手动编译就可以知道,根据环境变量PREFIX指定了安装
This works for both gcc-2.95.3 and gcc-3.0.

How to install:
cd /usr/local
mkdir arm
cd arm
tar Ixvf cross-<version>.tar.bz2
Add /usr/local/arm/<version>/bin to your path to use the cross compiler.
在Linux下面要养成看README、INSTALL文件的习惯,虽然是英文,但是写得都比较具体,比较简洁,没有很困难的。
明确了方法就比较简单了。
#mkdir /usr/local/arm
#cd /usr/local/arm
#tar jxvf cross-2.95.3.tar.bz2
然后添加路径:
$cd
$ls -a
$vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
export TARGET=arm-linux
export PRJROOT=/home/armlinux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=$PATH:$HOME/bin:$PREFIX/bin:/usr/local/arm/2.95.3/bin:/sbin:/usr/sbin:/usr/local/sbin
unset USERNAME
看见红色的行就是修改好的。只需要把你的路径添加到后面就可以了。
这样可以验证一下了。
验证:
$cd
$cd program
$vi hello.c
-------------------------------------------
#include <stdio.h>
int main()
{
        int i;
        for(i=1;i<9;i++)
                printf("Hello World %d times!\n",i);
}
--------------------------------------------
保存后退出。
$arm-linux-gcc hello.c -o hello-arm
$file hello-arm
hello-arm: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
这就说明生成的hello-arm是可以工作在ARM平台上的,也证明了你的交叉编译工具链是有效并且可用的。
在下载的2.95.3的工具链中没有包含调试工具gdb和目标板的gdbserver。在这里一起搭建好。
首先从ftp://ftp.gnu.org/gnu/gdb中获得gdb套件。解压缩关于路径就不多说了。
$cd
$cd debug
$mkdir build-gdb build-gdbserver
$cd
$cd software
$../source/gdb-5.2.1/configure --target=$TARGET --prefix=$PREFIX
$make
$make install
这样就可以顺利的完成gdb-5.2.1的安装了。
要想对目标板进行交叉编译,gdb显得太大了些,所以需要gdbserver。下面建立gdbserver。
$cd
$cd debug/build-gdbserver
$chmod +x http://www.cnblogs.com/software/gdb-5.2.1/gdb/gdbserver/configure
$CC=arm-linux-gcc http://www.cnblogs.com/software/gdb-5.2.1/gdb/gdbserver/configure --host=$TARGET --prefix=$TARGET_PREFIX
$make
$make install
n=`echo gdbserver | sed 's,x,x,'`; \
if [ x$n = x ]; then n=gdbserver; else true; fi; \
/usr/bin/install -c gdbserver /home/armlinux/tools/arm-linux/bin/$n; \
/usr/bin/install -c -m 644 http://www.cnblogs.com/software/gdb-5.2.1/gdb/gdbserver/gdbserver.1 /home/armlinux/tools/arm-linux/man/man1/$n.1
/usr/bin/install: 无法创建一般文件‘/home/armlinux/tools/arm-linux/bin/gdbserver’: 没有那个文件或目录
/usr/bin/install: 无法创建一般文件‘/home/armlinux/tools/arm-linux/man/man1/gdbserver.1’: 没有那个文件或目录
make: *** [install-only] Error 1
此处错误不难理解,主要是因为交叉编译工具放到/usr/local/arm里面了。前面的安装目录tools里面缺少几个文件夹,只需要建立就可以了。
$cd $PRJROOT/tools
$mkdir arm-linux
$cd arm-linux
$mkdir bin man
$cd man
$mkdir man1
$cd $PRJROOT/debug/build-gdbserver
$make install
这样就没有问题了,当然也可以修改makefile,但是自己还没有学好shell语言,所以采取上述方法解决了。这样首先用strip处理一下,目的是gdbserver不需要附带上调试的信息,把它们都剥离去就是了。
$arm-linux-strip $TARGET_PREFIX/bin/gdbserver
$ls -l $TARGET_PREFIX/bin/
总用量 24
-rwxr-xr-x    1 armlinux armlinux    23132 8月 10 11:33 gdbserver
也就是说,gdbserver经过strip处理之后还剩下23KB多一点,已经挺小了,适合目标板了。
附:
在CU论坛上看到tree工具可以查看目录树,觉得不错。也想要安装一个。
$cd
$cd source
$ftp mama.indstate.edu
Connected to mama.indstate.edu (139.102.70.201).
220 ProFTPD 1.3.0 Server (ProFTPD Default Installation) [139.102.70.201]
Name (mama.indstate.edu:armlinux): anonymous
331 Anonymous login ok, send your complete email address as your password.
Password:
230 Anonymous access granted, restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd linux/tree
250 CWD command successful
ftp> ls
227 Entering Passive Mode (139,102,70,201,149,53).
150 Opening ASCII mode data connection for file list
drwxr-xr-x   2 root     root         4096 Jun 4 2001 binary
drwxr-xr-x   2 root     root         4096 May 19 1999 slack
-rw-r--r--   1 root     root          406 Oct 11 1996 tree-1.1.lsm
-rw-r--r--   1 root     root        13135 Oct 11 1996 tree-1.1.tgz
-rw-r--r--   1 root     root          405 Jan 6 1997 tree-1.2.lsm
-rw-r--r--   1 root     root        16362 Jan 6 1997 tree-1.2.tgz
-rw-r--r--   1 root     root          436 Feb 21 2002 tree-1.3.lsm
-rw-r--r--   1 root     root        25060 Feb 21 2002 tree-1.3.tgz
-rw-r--r--   1 root     root          432 Feb 21 2002 tree-1.4b1.lsm
-rw-r--r--   1 root     root        27536 Feb 21 2002 tree-1.4b1.tgz
-rw-r--r--   1 root     root        27891 Mar 25 2002 tree-1.4b2.tgz
-rw-r--r--   1 root     root          432 Jun 18 2003 tree-1.4b3.lsm
-rw-r--r--   1 root     root        29366 Feb 6 2003 tree-1.4b3.tgz
-rw-r--r--   1 root     root          466 Aug 20 2004 tree-1.5.0.lsm
-rw-r--r--   1 root     root        26543 Aug 16 2004 tree-1.5.0.tgz
226 Transfer complete.
ftp> get tree-1.5.0.tgz
ftp> bye
221 Goodbye.
$mv tree-1.5.0.tgz tree-1.5.0.tar.gz
$cd ../software
$tar xvzf ../source/tree-1.5.0.tar.gz
$make
$make install
然后就可以了,安装路径查看makefile文件知道在/usr/local/bin,也可以用which查看。现在可以用tree命令来查看一下自己的目录结构了。
示例:
$cd
$tree -L 1     //显示一级目录,当然也可以显示二级目录了。
.
|-- bootloader
|-- debug
|-- images
|-- kernel
|-- program
|-- rootfiles
|-- software
|-- source
|-- sysapps
|-- tmp
`-- tools
这样对自己的组织比较好。等用tree熟悉了,在补充它的用法。
四、引导装载程序bootloader
因为u-boot的功能比较强大,所以选择了u-boot。这几天想先研究研究它的代码,好好分析一下启动过程。原来做过一次,不过是利用原来开发板做好的,熟悉过程是可以,但是不明白原理仍然不行。这次要学习掌握原理部分。
posted @ 2008-12-19 22:16  clara  阅读(1570)  评论(0编辑  收藏  举报