最近在调研实时操作系统的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 查看我们编译的编译器版本,示意图如下:
$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目录,示意图如下:
备注:
如果用上述的软件包直接编译基于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