搭建RTEMS的交叉工具链-针对arm,powerpc,i386

最近在调研实时操作系统的SMP扩展时,偶尔瞅了瞅RTEMS实时操作系统,深深的被它的性能和与众不同的结构所吸引,于是下决心把RTEMS的内核研读一下。在读它的内核代码之前,按照我的习惯首先搭建RTEMS的交叉编译器O(∩_∩)O~。

备注:

关于RTMES系统参考:

http://www.rtems.org/

http://www.rtems.net/index.htm

 

我在fedora14中成功搭建了基于powerpc、arm以及i386平台的交叉编译器,为方便描述我以powerpc平台对象。

第一部分 实验环境配置

主机环境:Linux-2.6.35.6-45.fc14.i686

目标平台:powerpc

1.1 搭建编译器所需要的软件包

Gcc软件包:gcc-4.3.2.tar.bz2

下载网址:

http://ftp.gnu.org/gnu/gcc/gcc-4.3.2

ftp://ftp.rtems.com/pub/rtems/SOURCES

gcc软件包补丁:gcc-4.3.2-20080910.diff

下载网址:ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/

Binutils软件包:binutils-2.20.tar.bz2

下载网址:

http://ftp.gnu.org/gnu/binutils/

ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/

Newlib软件包:newlib-1.17.0.tar.gz

Newlib软件包补丁:newlib-1.17.0-rtems4.10-20091009.diff

下载网址:

ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/

1.2 RTEMS软件包

rtems源码:rtems-4.10.2.tar.bz2

下载目录:ftp://ftp.rtems.com/pub/rtems/4.10.2/

1.3 开发平台目录树

在我的主机上建立的目录树:

/whatever/prefix/you/choose/

archive/               //存放源码包目录

         gcc-4.3.2.tar.bz2

         gcc-4.3.2-20080910.diff

         binutils-2.20.tar.bz2

         newlib-1.17.0.tar.gz

         newlib-1.17.0-rtems4.10-20091009.diff

         rtems-4.10.2.tar.bz2

build/                //存放解压包和编译包目录

tools/                //存放编译的交叉包目录

1.3 创建环境变量

在build目录下创建一个set-rtems.sh的脚本文件,内容如下:

#! /bin/sh

export PRJECT=rtems

export PRJROOT=/home/tom/${PRJECT}

export TARGET=powerpc-rtems4.10

export PREFIX=${PRJROOT}/tools/rtems-4.10

export TARGET_PREFIX=${PREFIX}/${TARGET}

export PATH=${PREFIX}/bin:${PATH}

pwd

cd $PRJROOT

执行命令:

$cd build

$sudo chmod +x  ./set-rtems.sh

备注:给set-rtems.sh加上可执行权限需要用到root权限。

$source  ./set-rtems.sh

备注:该命令使得set-rtems.sh中的环境变量在当前shell中可见,也可以使用

$. ./set-rtems.sh  

注意:两个点之间至少要有一个空格

 

备注三:如果编译基于arm平台的编译器,需要将:

export TARGET=powerpc-rtems4.10

更改为:

export TARGET=arm-rtems4.10

同时把newlib更新至:newlib-1.18.0.tar.gz

同时应用补丁:newlib-1.18.0-rtems4.11-20101126.diff

补丁下载网址:

ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/

需要注意在下载网址中的补丁是逐个累积的,我们只需要应用最新的补丁即可。

第二部建立步骤:

第一步:安装binutils工具包

$cd build

$tar xvf ../archive/binutils-2.20.tar.bz2

$mkdir b-binutils

$cd b-binutils

$../ binutils-2.20/configure --target=$TARGET --prefix=$PREFIX

$make

$make install

第二步:解压gcc-4.3.2.tar.bz2,并应用补丁

$cd build

$tar xvf tar xvf ../archive/gcc-4.3.2.tar.bz2

$cd gcc-4.3.2

$patch -p1 <../../archive/gcc-4.3.2-20080910.diff  //应用补丁

$find . -name "*.rej" -print                       //如果没有扩展名为.rej的文件,说明补丁应用成功

第三步:解压newlib-1.17.0.tar.gz,并应用补丁

$cd build

$tar xvf tar xvf ../archive/newlib-1.17.0.tar.gz

$cd newlib-1.17.0

$patch -p1 <../../archive/newlib-1.17.0-rtems4.10-20091009.diff  //应用补丁

$find . -name "*.rej" -print       //如果没有扩展名为.rej的文件,说明补丁应用成功

第四步:为了避免通常的两步编译gcc(即第一步:编译bootstrap gcc,第二步编译:full gcc)我们把newlib库作为gcc的一个子目录进行编译,即使用符号链接将newlib库作为一个子目录链接到gcc目录中。

$cd gcc- 4.3.2

$ln -s ../newlib-1.16.0/newlib .

第五步:完全编译gcc

$mkdir b-gcc

$cd b-gcc

$../gcc-4.3.2/configure --target=$TARGET \

 --with-gnu-as --with-gnu-ld --with-newlib --verbose \

 --enable-threads --enable-languages="c,c++" \

 --prefix=$PREFIX

$make all

$make info

$make install

经过上面的五步之后,基于PowerPC的交叉编译器就搭建起来了,我们可以用 $powerpc-rtems4.10-gcc –v 查看我们编译的编译器版本,示意图如下:

 搭建RTEMS的交叉工具链-针对arm,powerpc,i386_第1张图片
第三部分 编译rtems系统

$cd tools

$tar xjf ../archive/rtems-4.10.2.tar.bz2

$mkdir build-rtems

$cd build-rtems

$../rtems-4.10.2/configure --target=$TARGET \

 --disable-posix --disable-networking --disable-cxx \

 --enable-rtemsbsp=mpc8349eamds\

 --prefix=/home/tom/install_dir

$make all

$make install

这样编译的rtems系统就被安装到install_dir目录,示意图如下:

 搭建RTEMS的交叉工具链-针对arm,powerpc,i386_第2张图片

备注:

如果用上述的软件包直接编译基于arm的编译器,怎会出现:

checking sched.h usability... no

checking sched.h presence... no

checking for sched.h... no

configure: error: Required header sched.h not found

configure: error: /bin/sh '../../../../../rtems-4.10.2/c/src/../../cpukit/configure' failed for ../../cpukit

gmake[2]: *** [smdk2410] Error 1

 

解决办法:把newlib更新至:newlib-1.18.0.tar.gz

同时应用补丁:newlib-1.18.0-rtems4.11-20101126.diff

下载目录:

ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/

需要注意:下载目录中的补丁是逐个累积的,我们只需要应用最新的补丁即可

另外使用newlib-1.18.0.tar.gz其它软件包不变,可以直接编译i386平台的编译器,该平台newlib-1.18.0.tar.gz不需要打补丁。

 

附注:

为了把我们制作的上述编译器打包,这里说明一下经常用到的tar打包命令,tar在linux上是常用的打包、压缩、加压缩工具,参数很多,这儿仅仅列举常用的压缩与解压缩参数

参数:

-c :create 建立压缩档案的参数;

-x : 解压缩压缩档案的参数;

-z : 是否需要用gzip压缩;

-v: 压缩的过程中显示档案;

-f: 置顶文档名,在f后面立即接文件名,不能再加参数

举例:

1.将整个/home/tom/images 目录下的文件全部打包为/home/tom/images.tar

$tar -cvf /home/tom/images.tar /home/tom/images       //仅打包,不压缩

$tar -zcvf /home/tom/images.tar.gz /home/tom/images   //打包后,以gzip压缩

在参数f后面的压缩文件名是自己取的,习惯上用tar来做,如果加z参数,则以tar.gz 或tgz来代表gzip压缩过的tar file文件

2.将 /home/tom/images.tar.gz 解压到/home/tom下面

$ cd /home/tom

$ tar -zxvf /home/images.tar.gz

解压到指定的目录

$ tar -zxvf /home/images.tar.gz -C /specific dir

解包到指定的目录

tar xvf filename.tar -C /specific dir

参考资料:

http://www.rtems.com/onlinedocs/releases/rtemsdocs-4.6.5/share/rtems/pdf/started.pdf

http://www.aps.anl.gov/epics/base/RTEMS/tutorial/

http://www.rtems.com/ml/rtems-users/2012/august/msg00040.html

http://www.rtems.com/wiki/index.php/Building_Tools

你可能感兴趣的:(搭建RTEMS的交叉工具链-针对arm,powerpc,i386)