1、实验四 嵌入式交叉开发环境的建立 与通用计算机上的软件开发不同,嵌入式的编译过程被称为交叉编译,嵌入式系统的软件开发环境被称为嵌入式交叉开发环境。交叉编译就是把在宿主机上编写的高级语言程序编译成可以运行在目标机上的代码,即在宿主机上能够编译生成另一种CPU(嵌入式微处理器)上的二进制程序。交叉开发环境由宿主机和目标机组成,宿主机与目标机之间在物理连接的基础上建立起逻辑连接。 宿主机(Host)是用于开发嵌入式系统的计算机。一般为PC机(或者工作站),具备丰富的软硬件资源,为嵌入式软件的开发提供全过程支持。目标机(Target)即所开发的嵌入式系统,是嵌入式软件的运行环境,其硬件软件是
2、为特定应用定制的。物理连接是指宿主机与目标机通过物理线路连接在一起,连接方式主要有串口、以太网接口和OCD(On Chip Debug)三种方式。逻辑连接指宿主机与目标机间按某种通信协议建立起来的通信连接。在开发过程中,目标机端需接收和执行宿主机发出的各种命令如设置断点、读内存、写内存等,将结果返回给宿主机,配合宿主机各方面的工作。 宿主机上用于嵌入式软件开发的工具软件一般包括:文本编辑器、交叉编译器、交叉调试器、仿真器、下载器等。 当我们建立完成了嵌入式交叉开发环境后,我们就可以按照如图1所示,在宿主机上编写程序的源代码,使用交叉编译器编译成各个目标模块,使用交叉链接器链接生成可供下载调
3、试或固化的目标程序,通过目标机和宿主机之间的物理连接(串口或网络接口)将目标程序下载到目标机。 图1嵌入式软件编译过程 在这里中,我们是在宿主机的虚拟机(VMware Workstaion 6.5)上安装Red Hat Enterprise Linux 5。在Linux环境下,我们一般采用arm-linux-gcc作为交叉编译器,glibc是应用程序编程的函数库文件软件包,binutils用作二进制程序处理工具。这样一些软件构成了Linux下的交叉编译工具链。 通常构建交叉工具链有3种方法: (1)分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链;
4、 (2)通过Crosstool脚本工具来实现一次编译生成交叉编译工具链; (3)直接通过网上下载已经制作好的交叉编译工具链。 Crosstool是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用Crosstool构建交叉工具链要比分步编译容易得多,也方便许多。 本次实验采用cross-0.43来制作基于gcc4.1.1和glibc-2.3.2 的工具链。主要步骤如下: 1.从 (1)在第37行后面添加一行:(第37行应该为注释) eval `cat arm9tdmi.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh –notest 上
5、面语句表示执行demo-arm9tdmi.sh后,它将根据arm9tdmi.dat、gcc-4.1.1-glibc-2.3.2.dat这两个文件中定义的环境变量调用all.sh脚本来进行编译。gcc-4.1.1-glibc-2.3.2.dat文件指明了要下载或使用的文件。出的 (2)修改第7、8行内容如下: TARBALLS_DIR=/opt/downloads RESULT_TOP=/opt/crosstool 其中,TARBALLS_DIR表示要使用文件源码存放的位置,RESULT_TOP表示编译结果存放位置。 2.修改arm9tdmi.dat文件。打开arm9tdmi.dat,
6、将第2行修改为: TARGET=arm-linux 修改后,编译生成的工具样式为arm-linux-gcc、arm-linux-ld等。 3.修改gcc-4.1.1-glibc-2.3.2.dat文件,并下载相关源码。打开gcc-4.1.1-glibc-2.3.2.dat文件,由于我们要移植的Linux内核版本为2.6.24,所以修改第5行为: LINUX_DIR=linux-2.6.24 在编译过程中,系统会根据gcc-4.1.1-glibc-2.3.2.dat文件内容下载所需要的相关源代码,但系统自动下载速度较慢,所以我们应根据该文件的内容自行下载文件代码,将其放在/opt/do
7、wnloads下。须下载的源代码包括: binutils-2.16.1.tar.bz2 glibc-2.3.2.tar.bz2 gcc-3.3.6.tar.bz2 glibc-linuxthreads-2.3.2.tar.gz gcc-4.1.1.tar.bz2 linux-2.6.24.tar.bz2 gdb-6.5.tar.bz2 linux-libc-headers-2.6.12.0.tar.bz2 4.回到crosstool-0.43目录下,切换用户为其他用户,运行demo-arm9tdmi.sh脚本文件。直接在root用户下运行该脚
8、本文件会出现: Don't run all.sh or crosstool.sh as root, it's dangerous 的出错信息,无法进行编译。 5.其他用户下运行demo-arm9tdmi.sh;出现提示后再切换到root,再运行demo-arm9tdmi.sh脚本文件2-3个小时后,将在/opt/crosstool/目下生成gcc-4.1.1-glibc-2.3.2子目录。设置并保存PATH环境变量,则交叉工具链构建完成。运行以下命令: arm-linux-gcc –v 显示如下内容: Using built-in specs. Target: arm-linux
9、 Configured with: /opt/crosstool/crosstool0.43/build/arm-linux/gcc-4.1.1-glibc-2.3.2/gcc-4.1.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux --with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi --with-headers=/opt/crosstool/gcc-4
10、1.1-glibc-2.3.2/arm-linux/arm-linux/include --with-local-prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc
11、 version 4.1.1 在Linux环境下,采用cross-0.43制作了基于gcc4.1.1和glibc-2.3.2 的工具链,从而建立了如图2所示的嵌入式交叉开发环境。 Cd /opt/croostool Cd gcc-4.1.1-glibc-2.3.2.dat Cd arm-linux Cd bin pwd 2 嵌入式交叉开发环境 1. Vi /etc/profile 光标移动到最后一行末尾,点击“回车” 2. 输入PATH=SPATH:/OPT/... 设置路径 3. Source /etc/profile 4. 切换到根目录
12、等处输入:arm-linux-gcc –-v 5. 出现版本信息则成功。如下: 范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar tar -cvf /tmp/etc.tar /etc<==仅打包,不压缩! tar -zcvf /tmp/etc.tar.gz /etc<==打包后,以 gzip 压缩 tar -jcvf /tmp/etc.tar.bz2 /etc<==打包后,以 bzip2 压缩 # 特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 # 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~ # 如果加 j 参数,则以 .tar.bz2 来作为附档名啊~






