190 likes | 405 Views
嵌入式系统原理与应用. 实验 2 熟悉 Linux 开发环境. 一、实验目的. 熟悉 UP-TECHPXA270-S 下 Linux 的开发环境,学会使用 makefile 管理项目。熟悉 arm-linux-gcc 交叉编译的使用。使用基于 NFS 方式的下载调试,了解嵌入式开发的基本过程。. 二、实验内容.
E N D
嵌入式系统原理与应用 实验2 熟悉Linux开发环境
一、实验目的 • 熟悉UP-TECHPXA270-S下Linux的开发环境,学会使用makefile 管理项目。熟悉arm-linux-gcc交叉编译的使用。使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。
二、实验内容 • 本次实验使用Redhat linux 9.0操作系统环境安装arm-linux的开发库及编译器。新建一个目录,编写几个源文件,使用makefile管理项目。学习在linux 下的编程和编译过程,以及UP-TECHPXA270-S开发板的使用和开发环境的设置。下载已经编译好的文件到UP-TECHPXA270-S开发板中运行。
实验设备及工具(包括软件调试工具) • 硬件:UP-TECHPXA270-S嵌入式开发板、PC机Pentumn500以上, 硬盘10G以上。 • 软件:PC机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX开发环境
三、实验原理 • GNU Make 的主要工作是读进一个文本文件makefile 。这个文件里主要是有关哪些文件(‘target’目的文件)是从哪些别的文件(‘dependencies’依赖文件)中产生的,用什么命令来进行这个产生过程。有了这些信息,make 会检查磁盘上的文件,如果目的文件的时间戳(该文件生成或被改动时的时间)比至少它的一个依赖文件旧的话, make 就执行相应的命令,以便更新目的文件。 (目的文件不一定是最后的可执行档,它可以是任何一个文件。)
实验原理 • makefile 一般被叫做“makefile”或“Makefile”。当然您可以 在 make 的命令行指定别的文件名。如果您不特别指定,它会寻找“makefile”或“Makefile”,因此使用这两个名字是最简单的。
实验原理 • 一个 makefile 主要含有一系列的规则,如下: 依赖文件 : 被依赖的文件(tab)<command> (tab)<command>
makefile 文件规则 === makefile 开始 ===myprog : foo.o bar.ogcc foo.o bar.o -o myprogfoo.o : foo.c foo.h bar.hgcc -c foo.c -o foo.obar.o : bar.c bar.hgcc -c bar.c -o bar.o=== makefile 结束 === 这是一个非常基本的 makefile —— make 从最上面开始,把上面第一个目的,‘myprog’,做为它的主要目标(一个它需要保 证其总是最新的最终目标)。给出的规则说明只要文件‘myprog’ 比文件‘foo.o’或‘bar.o’中的任何一个旧,下一行的命令将会被执行。 但是,在检查文件 foo.o 和 bar.o 的时间戳之前,它会往下查找那些把 foo.o 或 bar.o 做为目标文件的规则。它找到的关于 foo.o 的规则,该文件的依赖文件是foo.c, foo.h 和bar.h 。
makefile 文件规则 === makefile 开始 ===myprog : foo.o bar.ogcc foo.o bar.o -o myprogfoo.o : foo.c foo.h bar.hgcc -c foo.c -o foo.obar.o : bar.c bar.hgcc -c bar.c -o bar.o=== makefile 结束 === 它从下面再找不到生成这些依赖文件的规则,它就开始检查磁盘上这些依靠文件的时间戳。如果这些文件中任何一个的时间戳比 foo.o 的新,命令 'gcc -c foo.c –o foo.o' 将会执行,从而更新文件 foo.o 。 接下来对文件 bar.o 做类似的检查,依赖文件在这里是文件 bar.c 和 bar.h 。现在make 回到‘myprog’的规则。如果刚才两个规则中的任何一个被执行,myprog 就需要重建(因为其中一个 .o 时间戳比‘myprog’新),因此连接命令将被执行。
四、实验步骤 1建立工作目录(在UP-tech270目录下) mkdir 01_hello cd 01_hello 2 编写程序源代码 • 在LINUX下的文本编辑器有许多,常用的是vim, Xwindow界面下的gedit等,在开发过程中推荐使用vim. • 本实验是在终端上打印出一个菱形.一个三角形(由*号构成)及打印一行字符hello,my friends。
编写源程序 主函数文件为start.c: • #include "hello.h" • #include <stdio.h> • int main() { • star1(); • star2(); • showhello(); • return 0; • }
在starfun.h中定义了两个函数star1(),star2()打印两个三角形:在starfun.h中定义了两个函数star1(),star2()打印两个三角形: • #ifndef STARFUN_H • #define STARFUN_H • #define NUM 4 • #define NUMBER 3 • int star1() { • int i,j,k; • for(k=1;k<=NUM;++k) { • for(i=1;i<=(NUM-k);++i) • printf(" "); • for(j=1;j<=(2*k-1);++j) • printf("*"); • printf("\n"); • } • return 0; • } int star2() { int i,j,k; for(k=NUMBER;k>=0;--k) { for(i=1;i<=(NUMBER-k+1);++i) printf(" "); for(j=1;j<=(2*k-1);++j) printf("*"); printf("\n"); } return 0; } #endif
在hello.h中定义了一个函数hello(),此函数中又调用了starfun()中的star1()函数用来打印一个三角形.在hello.h中定义了一个函数hello(),此函数中又调用了starfun()中的star1()函数用来打印一个三角形. • #ifndef HELLO_H • #define HELLO_H • void hello() { • star1(); • printf("hello,my friends\n"); • } • #endif
在hello.c中对hello函数进行了调用. • void showhello() { • hello(); • } 因为编译时可能出现头文件重复定义的错误,因此将所有的头文件申明都放在主函数中,此例中将子函数中的头文件都注释掉了.
3.编写makefile文件 • 由于交叉引用函数很复杂,因此编写了一个简单的makefile来组合这些头文件及主程序,将此makefile命名为:amake。因为所编写的程序要在pxa270板上运行,因此指定了交叉编译器。 • 具体的编写如下:
编写makefile文件 • #amake file • CC= arm-linux-gcc #指定编译器 • EXEC=myprog #定义目标文件名 • OBJS=star.o hello.o #为生成目标所使用的.o文件 • $(EXEC):$(OBJS) #目标与.o文件的依赖关系 • $(CC) -o $(EXEC) $(OBJS) #生成可执行文件 • star.o:starfun.h star.c #star.o依赖starfun.h,star.c • $(CC) -c star.c #生成star.o • hello.o:starfun.h hello.h hello.c #hello.o依赖starfun.h,hello.h,hello.c • $(CC) -c hello.c #生成hello.o • clean: #clean伪目标 • rm -f *.o $(EXEC) #执行make -f amake clean时删 除所有的.o文件
4.编译应用程序 • 在终端上使用make -f amake命令即可生成名为star的可执行文件. • * • *** • ***** • ******* • ***** • *** • * • * • *** • ***** • ******* • hello,my friends
注意: • 如果进行了修改,重新编译则运行: • make clean –f amake • make -f amake • 注意编译、修改程序都是在开发计算机上进行,不要在MINICOM的终端方式下进行。
5.下载调试 • 在宿主PC计算机上启动NFS服务,并设置好共享的目录,之后在开发板上运行: • mount -o nolock 192.168.0.121:/ up-techpxa270 /mnt/nfs (实际IP地址要根据实际情况修改)。挂接宿主机的根目录。成功之后在开发板上进入/mnt 目录,便相应进入宿主机的/ up-techpxa270目录,再进入开发程序目录运行刚刚编译好的hello程序,查看运行结果。 • 开发板挂接宿主计算机目录只需要挂接一次便可,只要开发板没有重起,就可以一直保持连接。这样可以反复修改、编译、调试,不需要下载到开发板的过程,当然当调试好程序后,您也可以下载到开发板运行。