您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 嵌入式预习报告6交叉编译及Linux简单程序设计实验
实验六交叉编译及Linux简单程序设计实验的预习报告一实验内容和背景实验背景:交叉编译,就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86Linux平台实际上是Intelx86体系结构和Linuxforx86操作系统的统称;而x86WinNT平台实际上是Intelx86体系结构和WindowsNTforx86操作系统的简称。就我们这个项目而言,需要交叉编译的原因有两个:首先,在项目的起始阶段,目的平台尚未建立,因此需要做交叉编译,以生成我们所需要的bootloader(启动引导代码)以及操作系统核心;其次,当目的平台能启动之后,由于目的平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用VisualC++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为nativecompilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilationtoolchain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储空间足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。本次实验的目的:1、了解和掌握交叉编译模式和方法;2、熟悉和掌握Linux简单程序设计。实验内容:1、连接主机和目标板;(三根线,注意网线和串口线是否连接正常)2、安装交叉编译器arm-linux-gcc,并配置环境。a)在命令行中输入arm-linux-后按tab键,如果命令能够补齐,说明里面已经有交叉编译工具了,环境变量已经设置好,那接下来的步骤,可以作为参考。如果不能补齐,则把电脑“E:\cvtech\CVT-A8-IIILinux光盘\Linux系统及应用源码”目录下的“4.3.3.tar.gz”文件拷贝到Fedora10的/usr/local目录下b)转到文件夹/usr/localcd/usr/localc)解压交叉编译工具链tar-vzxf4.3.3.tar.gzcd4.4.3/bin执行pwd命令得到这个目录的绝对路径,用右键复制这个路径,这个路径一般为/usr/local/4.3.3/bin。d)打开环境变量设置脚本文件vi~/.bash_profilee)在文件中倒数第几行中,把“/usr/local/4.3.3/bin”添加到PATH环境变量路径的后面,类似于PATH=$PATH:/usr/local/4.3.3/bin$PATH表示原来的环境变量路径,添加的/usr/local/4.3.3/bin部分表示在原来的环境变量PATH中添加此交叉编译器的路径f)vi保存并退出g)输入命令source~/.bash_profile使环境变量路径生效h)在任意目录下输入arm-linux-gcc后回车,如果是arm-linux-gccnoinputfile表示配置成功,或者仅输入“arm-linu”之后按TAB键看是否能补齐arm-linux-gcc命令,如果能够补齐,说明交叉编译工具链的环境变量设置成功。3,Linux简单程序设计a)使用vi等编辑器编写一个简单程序,比如输出“helloworld”,实现a+b等C语言程序。b)在命令行中使用gcc编译器编译并运行程序;使用file命令查看编译后的可执行文件信息。c)使用交叉编译器arm-linux-gcc编译并运行程序,记录结果;使用file命令查看交叉编译后的可执行文件信息。d)将交叉编译得到的可执行文件通过tftp下载到目标机,在目标机上执行,记录结果二实验涉及的知识点知识点1:了解和掌握交叉编译模式和方法;1.将下载好后的arm-linux-gcc交叉编译软件包(我用的arm-linux-gcc-4.3.2.tgz)拷贝到你自己建的文件夹目录下,我们要把交叉编译器安装到/usr/local/目录下,在终端root用户下执行命令:tarzxvfarm-linux-gcc-4.3.2.tgz–C/注意:以上命令中的C是大写,后面有个空格。执行完以上命令后,交叉编译器arm-linux-gcc就安装在/usr/local/arm/4.3.2目录下了。安装好后,还需要配置PATH环境变量(初学者建议使用),这样在操作系统的其他目录下都可以使用arm-linux-gcc交叉编译器。2.配置环境变量的步骤如下:在终端输入命令:vim/root/.bashr在.bashrc文件中增加以下的命令:exportPATH=$PATH:/usr/local/arm/4.3.2/bin,然后保存退出。如下图所示:3.在终端输入命令:arm-linux-gcc–v可查看安装的交叉编译器版本信息。如下图所示:从上图中可以看出该编译器gcc版本为4.3.2。安装成功到此结束。知识点1:熟悉和掌握Linux简单程序设计。helloworld的编译helloworld可以说是最简单的应用程序,通过如下命令进行编译:gcc-ohelloworldhelloworld.c其中-o指定输出文件到helloworld,helloworld.c为编译的源文件。该命令执行后,将对helloworld.c文件进行编译,并将生成helloworld可执行文件。这个文件就是在指定平台上可以运行的执行程序,如果使用gcc进行编译即为可在x86平台上运行的程序,如果使用arm-linux-gcc进行编译则为可以在ARM平台上运行的程序。Makefile文件Makefile文件的作用有点类似于DOS下的批处理文件,通过编写Makefile文件,用户可以将一个很复杂的程序(可能包含上百个甚至更多的源文件或者目录)通过简单的make命令进行编译。【实验说明】1.建立工作目录注:本实验以及后续的所有实验中用“$”符号表示在主机的Linux控制台上输入的命令行。用“#”符号表示在目标机的Linux控制台上输入的命令行。$cd/opt/cvtech/examples$cdhelloworld步骤:1.建立工作目录实验以及后续的所有实验中用“$”符号表示在主机的Linux控制台上输入的命令行。用“#”符号表示在目标机的Linux控制台上输入的命令行。$cd/opt/cvtech/examples$cdhelloworld2.编写程序源代码在Linux下的文本编辑器有许多,常用的是vim,Xwindow界面下的gedit等,我们在开发过程中推荐使用gedit,用户需要学习gedit的操作方法。实际的源代码较简单,如下:#includestdio.hintmain(){printf(Hello,World!\n);}3.在主机端编译并运行helloworld程序$gcc-ohelloworldhelloworld.c$./helloworld正确的结果将在主机的显示器上打印如下字符串:Hello,World!4.编译在目标机运行的helloworld程序$arm-linux-gcc-ohelloworldhelloworld.c由于编译器采用的是arm-linux-gcc编译器,因此使用上述命令编译出来的程序只能在ARM处理器上运行,不能在x86平台下运行,如果在Fedora10中运行该程序将出现如下错误结果。$./helloworldbash:./helloworld:cannotexecutebinaryfile5.下载helloworld程序到CVT-A8中调试CVT-A8通过将主机的/tftpboot/目录挂接到目标机的/mnt/目录中,因此,需要将第四步编译的程序helloworld拷贝到主机的/tftpboot/目录或其子目录下。$cphelloworld/tftpboot/在PC电脑的超级终端输入如下命令将主机端/tftpboot/目录挂接到/mnt目录下:#mount192.168.1.180:/tftpboot//mnt/–olock然后就可以运行helloworld程序:#cd/mnt#./helloworld正确的结果将在超级终端上打印如下字符串:Hello,World!6.编写Makefile文件使用vi编辑工具编辑Makefile,请注意文件名的M必须大写,其余为小写,如下所示,。注意其中每行前面的空格位置必须使用’Tab’键。CC=arm-linux-gccLD=arm-linux-ldEXEC=helloworldOBJS=helloworld.oCFLAGS+=LDFLAGS+=all:$(EXEC)$(EXEC):$(OBJS)$(CC)$(LDFLAGS)-o$@$(OBJS)$(LDLIBS$(LDLIBS_$@))cp$(EXEC)/tftpboot/clean:-rm-f$(EXEC)*.elf*.gdb*.o上述为一个典型的Makefile脚本文件的格式。下面简单介绍一下各个部分的含义:1)所采用的编译器和链接器CC=arm-linux-gccLD=arm-linux-ld2)生成的执行文件和链接过程中的目标文件EXEC=helloworldOBJS=helloworld.o3)编译和链接的参数$(EXEC):$(OBJS)CFLAGS+=LDFLAGS+=4)编译命令,执行完成将生成helloworld映像文件$(CC)$(LDFLAGS)-o$@$(OBJS)$(LDLIBS$(LDLIBS_$@))5)清除clean:-rm-f$(EXEC)*.elf*.gdb*.o$(OBJS):6)使用make进行编译使用如下命令编译ARM平台的helloworld程序。$makeclean$makearm-linux-gcc-c-ohelloworld.ohelloworld.carm-linux-gcc-ohelloworldhelloworld.o使用如下命令编译x86平台的helloworld程序。$makeclean$makeCC=gccgcc-c-ohelloworld.ohelloworld.cgcc-ohelloworldhelloworld.o分别参照步骤3和步骤5运行两种不同版本的程序,将得到相同的结果。【实验步骤】$cd/opt/cvtech/examples$cdhelloworld$make$cphelloworld/tftpboot/连接好串口,并打开超级终端工具。打开实验箱,启动Linux。在超级终端下输入:#mount192.168.1.180:/tftpboot/mnt/–onolock#cd/mnt/#./helloworld
本文标题:嵌入式预习报告6交叉编译及Linux简单程序设计实验
链接地址:https://www.777doc.com/doc-5472781 .html