嵌入式系统开发实验指导书

上传人:痛*** 文档编号:147986612 上传时间:2022-09-03 格式:DOC 页数:53 大小:3.71MB
收藏 版权申诉 举报 下载
嵌入式系统开发实验指导书_第1页
第1页 / 共53页
嵌入式系统开发实验指导书_第2页
第2页 / 共53页
嵌入式系统开发实验指导书_第3页
第3页 / 共53页
资源描述:

《嵌入式系统开发实验指导书》由会员分享,可在线阅读,更多相关《嵌入式系统开发实验指导书(53页珍藏版)》请在装配图网上搜索。

1、嵌入式系统开发编撰闽江学院计算机实验教学中心印制51目 录实验一 Linux 常用工具实验 1实验二 Makefile 实验 9实验三 Cross-gdb实验 18实验四 嵌入式GUI 应用程序实验 22实验五 驱动程序结构实验 31实验六 QT/E 移植实验 37实验七 串口通讯实验 42实验八 Webserver 的移植与网络通讯实验 48实验一 实验目的1、了解minicom 配置串口通信参数的过程,掌握利用minicom 进行传输文件方法2、了解网络文件系统nfs 的配置,掌握利用nfs 进行文件的传输和异地运行目标板程序3、掌握ftp 的使用方法实验环境1、装有Linux 操作系统的

2、PC 机一台;2、XSBase270 或XSBase255 ARM 实验开发平台一套实验内容阅读相关知识,完成以下实验:一、minicom 的使用实验内容1、将目标机与PC 机相连,利用minicom s 正确设置串口的参数,启动目标机,记录PC机显示的内容2、关闭目标板,利用minicom s 重新设置串口参数,启动目标机,记录PC 机显示的现象3、利用串口通信向目标机下载光盘中example 目录下的hello 应用程序,同时运行该应用程序。记录文件下载在目标板目录和下载文件的基本步骤。二、网络文件系统nfs 的配置及应用实验内容1、通过网络文件系统的配置将主机的其他目录(如/root/E

3、mdoor 目录),并挂载到目标机上,记录设置的步骤。2、将主机example 目录下的ARM 程序hello 复制到主机的网络文件系统目录上,在目标机的挂载目录运行该程序,记录运行结果并写出你的结论3、将目标机其他目录上的文件复制到网络文件系统挂载的目录上,然后到主机上查看文件是否完成传输。4、将主机上其他目录上的文件复制到网络文件系统挂载的目录上,然后到目标机挂载网络文件系统的目录中将该文件复制到目标机其他目录上,重新启动目标机系统查看文件是否复制成功。最后写出你的结论。三、ftp 实验内容1、将example 目录下的文件cxcore.lib 文件通过ftp 直接传输到目标板的/usr/

4、lib 目录下,记录通过ftp 传输文件的基本步骤,并与通过串口传输文件进行比较,写下你的结论。2、将目标板中/usr/lib 目录下的一个文件传输到主机上,记录传输的基本步骤和文件传输所在的目录。相关练习1、一目标平台通过串口与PC 机连接后,用户启动目标平台时发现串口终端出现乱码,请分析串口终端产生乱码的原因。2、某同学想利用ftp 进行文件传输,他已经设定主机平台的IP 地址为192.168.0.100,可在串口终端输入ftp 192.168.0.100 时,出现ftp:connect:Connection refused 错误,请分析产生错误的原因。3、参考ftp 适应文档,分析在ft

5、p 方式下如何使用linux 下如mkdir 等常用命令。相关知识一、minicom 的使用1、串口通信参数的设置首先运行minicom,由于minicom 是通过串口来工作的,所以要通过minicom 程序来对串口通信参数进行设置。启动minicom 的设置窗口:在linux 的终端中输入“minicom s”,然后,按下回车键。rootlocalhost root# minicom s“-s”选项调出配置信息。下面显示的就是配置的菜单。有关串口通信选项的含义:Filenames and paths:选择需要传输的文件和路径File transfer protocols:选择传输文件的通信协

6、议Serial port setup:设置串口通信参数Save setup as dfl:将设置好的各项参数保存为dflSave setup as:将设置好的各项参数保存为自定义的文件名Exit:退出返回到minicom 设置好后的终端Exit from Minicom:从minicom 命令中退出返回Linux 终端将光标移到Serial port setup,按回车键会弹出串口通信参数的配置菜单。(1)、串口通信口的选择:(A - Serial Device)接A键把光标移动到Serial Device。如果串口线连在PC 机的串口1 上,则把Serialdevice 设置为/dev/tt

7、yS0。如果连在串口2 上,则把Serial device 设置为/dev/ttyS1,然后按下回车键。(2)、串口参数的设置(E - Bps/Par/Bits)按E键来设置通信波特率、数据位、奇偶校验位和停止位。可以通过按下不同的键来设置通信参数。例如XSBase270 平台需要把波特率设为115200,数据位设为8,奇偶校验位设为无,停止位设为1。可以分别通过按I、V、L、W键设置波特率、数据位、奇偶校验位和停止位。设置完后按Esc返回。(3)、数据流的控制选择(F - Hardware Flow Control、G - Software Flow Control)按F键可以完成硬件流控制

8、切换,即完成Yes与No之间的切换。按G键完成软件流控制切换,即完成Yes与No之间的切换。下图显示的是串口配置好的后完整信息。(4)、设置参数的保存与退出配置完成后,按下“Esc”键,将会出现下图的配置菜单。选择“Save setup as dfl”按ENTER 键来保存,当配置保存后,按下“Esc”键完成设置。当minicom 窗口出现后,重起XSBase270 将会看到启动信息。如果没有出现启动信息,请检查mincom 的设置和线缆连接是否有错。2、利用串口通信文件传输在与目标板连接后,可以通过串口下传一些文件到目标板,具体操作步骤如下:(1)、在与目标正确连接后,进入root51boa

9、rd,按下CTRLA 键后,再按Z 键,系统调出minicom 的命令选项菜单;其中Send files 和Receive files 两项负责文件数据的传输,所用命令使用热键进行激活。如上传文件只需按S 键。(2)、当向目标板上传文件时,按S 键,系统弹出串口通信协议选项,利用方向键选中zmodem传输协议,按回车键,进入文件选择菜单。(3)、文件传输文件选择菜单弹出后,利用空格键选中需要上传的文件,一次可以选择多个文件,选好需要传输的文件后按回车键,便可以进行文件数据传输。当数据传输完毕,系统会弹出传输完毕提示菜单(如下图所示)。二、网络文件系统nfs 的配置网络文件系统nfs 可以将PC

10、 机上的一部分文件系统作为目标机的资源,这样可以弥补目标机存储空间的不足。在使用网络文件之时,应对网络文件配置进行一定的设置。1、主机(host)的设置:在主机/mnt 目录下创建nfs 目录,并利用文本编辑器编辑修改/etc/exports 文件,增加如下内容:/mnt/nfs (rw,no_root_squash)将主机的/mnt/nfs 目录设置为能够通过网络文件系统访问可读写的目标,2、重新启动nfsrootlocal$ /etc/rc.d/init.d/nfs stoprootlocal$ /etc/rc.d/init.d/nfs start3、目标机设置(假设主机的IP 地址为19

11、2.168.1.12)root51Board$ portmaproot51Board$ mount t nfs 192.168.1.12:/mnt/nfs /mnt上述设置实现将主机上的/mnt/nfs 目录挂载到目标机的/mnt 目录下,并作为目标机文件系统的一部分。这时,可以将需要传输的文件或需要运行的程序保存在主机的/mnt/nfs 目录下,然后在目标机对主机/mnt/nfs 上的文件进行运行或复制等相应的处理。三、ftp 文件传输文件传输协议ftp(File Transimit Protocol)利用以太网实现文件的传输。ftp 相对于串口传输文件来说,传输速度快,所以上传比较大的文件

12、一般采用ftp 来实现,需要上传的文件应保存到主机的/var/ftp/pub 目录下。下面具体介绍ftp 文件传输过程(假设主机的IP 地址为192.168.0.100)。(ftp 的具体其他用法可以在linux 终端提示符输入man ftp 查看)1、在目标板的调试终端输入ftp 命令root51Board$ ftp 192.168.0.1002、输入用户名和密码:用户采用匿名登陆网络(anonymous),无需输入密码。如果用户需要采用其他的用户名登陆,必须修改(脚本)3、当用户名和密码都正确后,在调试终端显示登陆成功信息和ftp 提示符,如图所示。4、文件传输:ftp 提示符下利用cd

13、命令转到主机的pub 目录下,利用get 命令上传需要传输的文件。假设需要上传的文件为facedect(确保文件保存在主机的/var/ftp/pub 目录下)ftpget facedect文件传输完毕后,ftp 输出成功信息和被传输文件的字节数。(如图所示)实验二 Makefile 实验 实验目的1、了解Makefile 的基本概念和基本结构2、初步掌握编写简单Makefile 的方法3、了解递归Make 的编译过程4、初步掌握利用GNU Make 编译应用程序的方法实验环境1、装有Linux 操作系统的PC 机一台;2、XSBase270 或XSBase255 ARM 实验开发平台一套实验内

14、容阅读相关知识,完成以下实验:一、使用命令行的方式手动编译程序方法1、利用文本编辑器创建hello.c 文件/hello.c/written by Emdoor#include int main()printf(Welcome Emdoor!n);return 1;2、手动编译hello 应用程序在hello.c 的目录的终端下输入:rootlocal$ arm-linux-gcc c hello.crootlocal$ arm-linux-gcc hello.o o hello通过ls 命令查看当前目录下是否生成源代码hello.c 的object 文件hello.o 和可执行文件hello

15、,运行可执行文件hello。查看一下运行结果。root51Board $./hello3、修改hello.c 文件,重新手动编译应用程序。4、删除hello.o 和hello 文件rootlocal$rm f hello.orootlocal$rm f hello二、利用GNU make 自动编译应用程序方法1、利用文本编辑器创建一个makefile 文件,并将其保存到与hello.c 相同的目录下。# makefile test for hello program#written by EmdoorCC= arm-linux-gccCFLAGS=all: hellohello: hello.

16、o$(CC) $(CFLAGS) hello.o o hellohello.o: hello.c$(CC) $(CFLAGS) c hello.c o hello.oclean:rm rf hello *.o2、先后执行如下命令rootlocal$makerootlocal$lsroot51Board $./hello查看并记录所生成的文件和运行的结果。3、执行make clean 命令:rootlocal$make clean4、修改hello.c 文件,重复第2、3 步操作,查看并记录所生成的文件和运行结果,并与手动编译进行比较,写出你的结论。5、重新编辑makefile 文件(斜黑体表示

17、修改部分)# makefile test for hello program#written by EmdoorCC= arm-linux-gccCFLAGS=OBJS=hello.oall: hellohello: $(OBJS)$(CC) $(CFLAGS) $ -o $hello.o: hello.c$(CC) $(CFLAGS) c $ -o $clean:rm rf hello *.o6、重复第2,3 步操作,查看并记录所生成的文件和运行的结果。比较这两种操作,写出你的结论。同时指出$ 、$、$在上述Makefile 中的含义。三、多个.c 文件的编译1、创建文件hello1.c、h

18、ello2.c、hello.h 和makefile/hello1.c/written by Emdoor#include int main()printf(Welcome Emdoor!n);test2();return 1;/hello2.c/written by Emdoorinclude hello2.h#include void test2(void)printf(Welcome Emdoor! hello2n);/hello2.h/written by Emdoorvoid test2(void);# makefile test for multi files program#wri

19、tten by EmdoorCC= arm-linux-gccCFLAGS=OBJS=hello1.o hello2.oall: hellohello: $(OBJS)$(CC) $(CFLAGS) $ -o $hello1.o: hello1.c$(CC) $(CFLAGS) c $ -o $hello2.o: hello2.c$(CC) $(CFLAGS) c $ -o $clean:rm rf hello *.o2、先后执行如下命令 rootlocal$makerootlocal$lsroot51Board $./hello查看并记录所生成的文件和运行的结果, 写出你的结论。3、修改ma

20、kefile 文件(斜黑体表示修改部分)# makefile test for multi files program#written by EmdoorCC= arm-linux-gccCFLAGS=CFILES=$(wildcard *.c)OBJS=$(CFILES:%.c=%.o)all: hellohello: $(OBJS)$(CC) $(CFLAGS) o hello $(OBJS).c.o:$(CC) c $clean:rm rf hello *.o4、重复第2 步操作,查看并记录所生成的文件和运行的结果, 写出你的结论。并指出wildcard、.c.o 的含义和变量CFILE

21、S 代表的内容。*四、利用autoconf和automake工具包,将作业2的程序代码交叉编译后下载或用NFS在开发系统中运行。相关练习1、根据提供的Linux 操作系统源码中得Makefile 结构,分析在工程中多级目录中存在着多个makefile 时,编译的顺序如何?2、根据Makefile 中变量定义规则,如果实验中的hello.c 文件编译到目标平台中运行,应该怎样修改Makefile 中变量参数?相关知识在Linux 或Unix 环境下,对于只含有几个源代码文件的小程序(如hello.c)的编译,可以手工键入gcc 命令对源代码文件逐个进行编译;然而在大型的项目开发中,可能涉及几十到

22、几百个源文件,采用手工键入的方式进行编译,则非常不方便,而且一旦修改了源代码,尤其头文件发生了的修改,采用手工方式进行编译和维护的工作量相当大,而且容易出错。所以在Linux 或Unix 环境下,人们通常利用GNU make 工具来自动完成应用程序的维护和编译工作。实际上,GNU make 工具通过一个称为Makefile 的文件来完成对应用程序的自动维护和编译工作。Makefile 是按照某种脚本语法编写的文本文件,而GNU make 能够对Makefile 中指令进行解释并执行编译操作。Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编

23、译,甚至于进行更复杂的功能操作。GNU make 工作时的执行步骤如下:1、读入所有的Makefile。2、读入被include 的其它Makefile。3、初始化文件中的变量。4、推导隐晦规则,并分析所有规则。5、为所有的目标文件创建依赖关系链。6、根据依赖关系,决定哪些目标要重新生成。7、执行生成命令。1-5 步为第一个阶段,6-7 为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make 会把其展开在使用的位置。但make 并不会完全马上展开,make 使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。下面对makefile

24、 的相关问题进行简单介绍:1、Makefile 的基本结构Makefile 的一般结构:target :dependency command 结构中各部分的含义:(1)、target(目标):一个目标文件,可以是Object 文件,也可以是执行文件。还可以是一个标签(Label)。(2)、dependency(依赖):要生成目标文件(target)所依赖哪些文件(3)、command(命令):创建项目时需要运行的shell 命令(注:命令(command)部分的每行的缩进必须要使用Tab 而不能使用多个空格)。Makefile 实际上是一个文件的依赖关系,也就是说, target 这一个或多个

25、的目标文件依赖于dependency 中的文件,其生成规则定义在命令command 中。如果依赖文件(dependency)中有一个以上的文件比目标(target)文件要新的话,shell 命令(command)所定义的命令就会被执行。这就是Makefile 的规则。也就是Makefile 中最核心的内容。例如,假设有一个C 源文件test.c,该源文件包含有自定义的头文件test.h,则目标文件test.o 明确依赖于两个源文件:test.c 和test.h。如果只希望利用gcc 命令来生成test.o 目标文件,这时,就可以利用如下的makefile 来定义test.o 的创建规则:#Th

26、is makefile just is a example.test.o: test.c test.hgcc c test.c从上面的例子注意到,第一个字符为#的行表示注释行。第一个非注释行指定test.o 为目标,并且依赖于test.c 和test.h 文件。随后的行指定了如何从目标所依赖的文件建立目标。当test.c 或test.h 文件在编译之后又被修改,则make 工具可自动重新编译test.o,如果在前后两次编译之间,test.c 和test.h 均没有被修改,而且test.o 还存在的话,就没有必要重新编译。这种依赖关系在多源文件的程序编译中尤其重要。通过这种依赖关系的定义,mak

27、e工具可避免许多不必要的编译工作。一个makefile 文件中可定义多个目标,利用make target 命令可指定要编译的目标,如果不指定目标,则使用第一个目标。通常,makefile 中定义有clean 目标,可用来清除编译过程中的中间文件# This makefile just is a example.test.o: test.c test.hgcc -c test.cclean:rm -f *.o运行make clean 时,执行rm f *.o 命令,删除编译过程中生成的所有中间文件。2、Makefile 的基本内容Makefile 一般包括包含:显式规则、隐晦规则、变量定义、文件

28、指示和注释等五个内容。(1)、显式规则:显式规则说明如何生成一个或多个的目标文件。这是由Makefile 的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。(2)、变量定义。在Makefile 中可以定义一系列的变量,变量一般都是字符串,当Makefile被执行时,变量的值会被扩展到相应的引用位置上。(3)、隐含规则:由于GNU make 具有自动推导功能,所以隐晦规则可以比较粗糙地简略地书写Makefile,然后由GNU make 的自动推导功能完成隐晦规则的内容。(4)、文件指示。其包括了三个部分,一个是在一个Makefile 中引用另一个Makefile,就像C 语言中的inc

29、lude 一样;另一个是指根据某些情况指定Makefile 中的有效部分,就像C 语言中的预编译#if 一样;还有就是定义一个多行的命令。(5)、注释。Makefile 中只有行注释,和UNIX 的Shell 脚本一样,其注释是用“#”字符,如果你要在你的Makefile 中使用“#”字符,可以用反斜框进行转义,如:“#”。2.1 Makefile 中的变量(1)、Makefile 中定义的变量,与C/C+语言中的宏一样,代表一个文本字串,在Makefile被执行时候变量会自动地展开在所使用的地方。Makefile 中的变量可以使用在“目标”,“依赖目标”,“命令”或Makefile 的其它部

30、分中。(2)、Makefile 中变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)。(3)、Makefile 中变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的变量名。传统的Makefile 的变量名是全大写的命名方式(4)、变量在声明时需要给予初值,而在使用时,需要在变量名前加上“$”符号# makefile test for hello program#written by EmdoorCC=gccCFLAGS=OBJS=hello.oall: hellohello: $(OBJS)$(CC) $(CF

31、LAGS) $(OBJS) o hellohello.o: hello.c$(CC) $(CFLAGS) c hello.c o $(OBJS)clean:rm rf hello *.o上面自定义变量OBJS 表示hello.o,当makefile 被执行时,变量会在使用它的地方精确地展开,就像C/C+中的宏一样。上述makfile 变量展开后的形式为:# makefile test for hello program#written by EmdoorCC=gccCFLAGS=OBJS=hello.oall: hellohello: hello.ogcc hello.o o hellohel

32、lo.o: hello.cgcc c hello.c o hello.oclean:rm rf hello *.oGNU make 的主要预定义变量GNU make 有许多预定义的变量,这些变量具有特殊的含义,可在规则中使用。以下给出了一些主要的预定义变量,除这些变量外,GNU make 还将所有的环境变量作为自己的预定义变量。$ 表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,$就是匹配于目标中模式定义的集合。$% 仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是foo.a(bar.o),那么,$%就是bar.o,$就是foo.a。如果目标不是函数库文件(Un

33、ix下是.a,Windows 下是.lib),那么,其值为空。$ 依赖目标中的第一个目标名字。如果依赖目标是以模式(即%)定义的,那么$将是符合模式的一系列的文件集。注意,其是一个一个取出来的。$? 所有比目标新的依赖目标的集合。以空格分隔。$ 所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。$+ 这个变量很像$,也是所有依赖目标的集合。只是它不去除重复的依赖目标。命令的变量。AR 函数库打包程序。默认命令是“ar”。AS 汇编语言编译程序。默认命令是“as”。CC C 语言编译程序。默认命令是“cc”。CXX C+语言编译程序。默

34、认命令是“g+”。CO 从RCS 文件中扩展文件程序。默认命令是“co”。CPP C 程序的预处理器(输出是标准输出设备)。默认命令是“$(CC) E”。FC Fortran 和Ratfor 的编译器和预处理程序。默认命令是“f77”。GET 从SCCS 文件中扩展文件的程序。默认命令是“get”。LEX Lex 方法分析器程序(针对于C 或Ratfor)。默认命令是“lex”。PC Pascal 语言编译程序。默认命令是“pc”。YACC Yacc 文法分析器(针对于C 程序)。默认命令是“yacc”。YACCR Yacc 文法分析器(针对于Ratfor 程序)。默认命令是“yacc r”。

35、MAKEINFO 转换Texinfo 源文件(.texi)到Info 文件程序。默认命令是“makeinfo”。TEX 从TeX 源文件创建TeX DVI 文件的程序。默认命令是“tex”。TEXI2DVI 从Texinfo 源文件创建军TeX DVI 文件的程序。默认命令是“texi2dvi”。WEAVE 转换Web 到TeX 的程序。默认命令是“weave”。CWEAVE 转换CWeb 到TeX 的程序。默认命令是“cweave”。TANGLE 转换Web 到Pascal 语言的程序。默认命令是“tangle”。CTANGLE 转换CWeb 到C。默认命令是“ctangle”。RM 删除文

36、件命令。默认命令是“rm f”。命令参数变量:下面的这些变量都是相关上面的命令的参数。如果没有指明其默认值,那么其默认值都是空。ARFLAGS 函数库打包程序AR 命令的参数。默认值是“rv”。ASFLAGS 汇编语言编译器参数。(当明显地调用“.s”或“.S”文件时)。CFLAGS C 语言编译器参数。CXXFLAGS C+语言编译器参数。COFLAGS RCS 命令参数。CPPFLAGS C 预处理器参数。( C 和Fortran 编译器也会用到)。FFLAGS Fortran 语言编译器参数。GFLAGS SCCS “get”程序参数。LDFLAGS 链接器参数。(如:“ld”)LFLA

37、GS Lex 文法分析器参数。PFLAGS Pascal 语言编译器参数。RFLAGS Ratfor 程序的Fortran 编译器参数。YFLAGS Yacc 文法分析器参数。2.2 隐含规则GNU make 包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标。GNU make 支持两种类型的隐含规则:(1)、后缀规则(Suffix Rule)。后缀规则是定义隐含规则的老风格方法。后缀规则定义了将一个具有某个后缀的文件(例如,.c 文件)转换为具有另外一种后缀的文件(例如,.o 文件)的方法。每个后缀规则以两个成对出现的后缀名定义,例如,将.c 文件转换为.o

38、文件的后缀规则可定义为:.c.o:$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $ $(2)、模式规则(pattern rules)。这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规则。模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个% 号,同时可用来定义目标和依赖文件之间的关系,例如下面的模式规则定义了如何将任意一个X.c 文件转换为X.o 文件:%.c:%.o$(CC) $(CCFLAGS) $(CPPFLAGS) -c -o $ $2.3 文件引用在Makefile 使用include 关键字可以把别的Makefile 包含进来,这很像C

39、语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。例如:有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk 和f.mk,那么,下面的语句:include foo.make *.mk $(bar)等价于:include foo.make a.mk b.mk c.mk e.mk f.mkmake 命令开始时,会把找寻include 所指出的其它Makefile,并把其内容安置在当前的位置。如果文件都没有指定绝对路径或是相对路径的话,make 首先会在当前目录下寻找,如果当前目录下没有找到,那么,

40、make 还会在下面的几个目录下找:(1)如果make 执行时,有“-I”或“-include-dir”参数,那么make 就会在这个参数所指定的目录下去寻找。(2)、如果目录/include(一般是:/usr/local/bin 或/usr/include)存在的话,make 也会去找。如果有文件没有找到的话,make 会生成一条警告信息,但不会马上出现致命错误。它会继续载入其它的文件,一旦完成makefile 的读取,make 会再重试这些没有找到,或是不能读取的文件,如果还是不行,make 才会出现一条致命信息。2.4 Makefile 中的函数在Makefile 中可以使用函数来处理变

41、量,从而让命令或规则更为的灵活和具有智能,函数调用,很像变量的使用,也是以“$”来标识的,函数调用后,函数的返回值可以当做变量来使用。例如:wildcard 的函数,可以展开成一列所有符合由其参数描述的文件名。文件间以空格间隔。语法如下:$(wildcard PATTERN.)用wildcard 函数找出目录中所有的.c文件:SOURCES = $(wildcard *.c)。实际上,GNU make 还是许多如字符串处理函数、文件名操作函数等其他函数3、运行make3.1 Make 的执行一般来说,最简单的就是直接在命令行下输入make 命令,GNU make 找寻默认的Makefile 的

42、规则是在当前目录下依次找三个文件 “GNUmakefile”、“makefile”和“Makefile”。其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行,也可以给make命令指定一个特殊名字的Makefile。要达到这个功能,要求使用make 的“-f”或是“-file”参数,例如:make f Hello.makefile3.2 嵌套执行make在一些大的工程中,不同模块或是不同功能的源文件放在不同的目录中,可以在每个目录中都书写一个该目录的Makefile,这有利于Makefile 变得更加地简洁,而不至于把所有的东西全部写在一个Makefile 中,这个技术对于进行模块编译和分

43、段编译有着非常大的好处。例如,有一个子目录叫subdir,这个目录下有个Makefile 文件指明了这个目录下文件的编译规则。那么总控的Makefile 可以书写:subsystem:cd subdir & $(MAKE)如果要传递变量到下级Makefile 中,那么可以使用export 来声明。3.3 GNU make 命令选项GNU make 命令还有一些其他选项,下面给出了这些选项。命令行选项含义-C DIR 在读取makefile 之前改变到指定的目录DIR。-f FILE 以指定的FILE 文件作为makefile。-h 显示所有的make 选项。-i 忽略所有的命令执行错误。-I

44、DIR 当包含其他makefile 文件时,可利用该选项指定搜索目录。-n 只打印要执行的命令,但不执行这些命令。-p 显示make 变量数据库和隐含规则。-s 在执行命令时不显示命令。-w 在处理makefile 之前和之后,显示工作目录。-W FILE 假定文件FILE 已经被修改。实验三 Cross-gdb实验 实验目的1、充分了解在嵌入式系统的开发过程中,为什么需要交叉调试,及交叉调试所扮演的角色。2、掌握利用Cross-gdb,构建交叉调试环境的方法;3、掌握通过串行口与TCP/IP,使用Cross-gdb,实现嵌入式Linux应用程序的远程调试。实验环境1、装有Linux 操作系统

45、的PC 机一台;2、XSBase270 或XSBase255 ARM 实验开发平台一套3、redhat9.0实验内容阅读相关知识,完成以下实验:使用Cross-gdb调试程序的第一步是编译安装Cross-gdb和Gdbserver,按以下步骤完成。一、编译GDB客户端:从http:/ftp.gnu.org/gnu/gdb/下载源代码,然后GDB编译成支持ARM结构的版本。当编译客户端(Cross-gdb)时,configure的target参数为arm-linux,host参数为arm-linux,这样客户端才能和ARM的服务端进行通信,调试应用程序。root $ xmu home # tar

46、 xvfj gdb-6.1.tar.bz2root $ xmu home # cd gdb-6.1root $ xmu gdb-6.1# ./configure -target=arm-linux -prefix=/usr/local/arm-gdb vroot $ xmu gdb-6.1# makeroot $ xmu gdb-6.1# make install如果编译过程没有错误,arm-linux-gdb会在/usr/local/arm-gdb/bin目录中生成。为了在任何目录下都能使用Cross-gdb,必须对路径进行设置。打开/root/.bash_profile文件设置路径。roo

47、t $ xmu gdb-6.1# vi /root/.bash_profile 在文件中添加以下一行:PATH=$PATH:/usr/local/arm-gdb/bin保存并退出该文件,使用source命令使路径生效。二、编译Gdbserver1、先在主机上编译生成Gdbserver程序进入GDB源码目录编译Gdbserver:root $ xmu home # cd gdb-6.1root $ xmu gdb-6.1# ./configure -target=arm-linux -host= arm-linux进入生成的Gdbserver目录,将该目录下的configure属性该为可执行,并

48、运行该配置文件:root $ xmu gdb-6.1# cd gdb/gdbserverroot $ xmu gdbserver# chmod 755 configureroot $ xmu gdbserver# ./configure -target=arm-linux -host= arm-linux修改gdb/gdbserver/config.hroot $ xmu gdbserver# vi config.h将文件中的 #define HAVE_SYS_REG_H 1 改为 / #define HAVE_SYS_REG_H 1编译Gdbserver:root $ xmu gdbserv

49、er# make CC=arm-linux-gcc2、将编译好的Gdbserver用以下三种方法之一下载到开发板上的/usr/bin目录中(1)通过nfs挂载后复制nfs的具体配置参见实验1。设主机的IP为192.168.0.100,Gdbserver已拷贝到主机的/mnt/nfs目录下,将挂载到目标机的/mnt/nfs51下,再下载到开发板上的/usr/bin目录中。在minicom中对目标机进行操作如下:root51Board$ mount t nfs 192.168.0.100:/mnt/nfs /mnt/nfs51root51Board$ cp a /mnt/nfs51/gdbserv

50、er /usr/bin(2)通过串口下载在目标板的minicom终端中切换到/usr/bin目录后下载。(3)通过ftp下载将编译好的gdbserver复制到宿主机的/var/pub目录下,在目标板的minicom终端中用ftp命令连接到宿主机下载。三、使用Cross-gdb远程调试程序1、在主机上编写测试代码,并交叉编译。测试代码hello.c如下: 这个程序模拟使用空指针产生的错误。交叉编译这段代码:root$xmu temp# arm-linux-gcc g hello.c o hello2、将交叉编译好的hello文件下载到目标板上的root目录下。可用minicom的文件发送功能,或

51、nfs文件传输,具体步骤参见实验1。3、进入/root目录,启动开发板上的gdbserver来调试hello:(设主机的IP为192.168.0.100,开发板的IP为192.168.0.50)这个命令使gdbserver在1234端口监听。4、然后在PC机上运行arm-linux-gdb,并通过TCP/IP链接到gdbserver运行arm-linux-gdb,结果如下:此时,处在gdb的命令行调试状态下。通过TCP/IP链接到开发板的gdbserver。如果链接成功,开发板的串口终端(minicom)上会显示以下信息:5、接下来开始在主机上调试程序此处的hello为PC机上hello所在的

52、路径,如果不对,可在gdb命令行状态下用cd命令切换。为了调试空指针引起的错误,在第6行设置断点:执行代码并单步跟踪:可以看到程序的第6行执行时出现了一个段错误,段错误通常是由内存的非法访问引起的。在此程序中,指针str未初始化为有效存储空间,因而出现段错误。从调试过程可以看出,通过联合使用gdb/gdbserver可以快速定位嵌入式程序中的错误,提高了编程效率。6、退出gdb调试可用quit命令在目标板的串口终端(minicom)上会显示四、用Cross-gdb调试作业31、将程序设计作业用交叉编译器编译后下载到目标板的/root目录下。2、按本次实验中第三部分的介绍调试它。3、注意由于被调

53、试程序是由gdbserver启动的,所以应该在启动时添加命令行参数。相关练习1、 Cross-gdb与gdb在用法上有何不同?2、 如何修改实验程序hello.c中空指针的错误?相关知识1、Cross-gdb 简介嵌入式应用软件的开发,除了基本cross compiler(交叉编译)与cross assembler/linker之外,程序开发过程中的测试与除错是另一个重要的部分,提供使用者方便、易使用的source-level debugger,将可缩短程序开发的进程,同时进一步提升软件的品质。GNU debugger(GDB)提供了一个开源、高质量的调试器,让使用者可以由命令行模式、文字视窗

54、模式或图形模式等方式进行应用程序的除错工作。GDB目前所支持的程序语言包含了C、C+、Fortran等。与gcc相似,GDB后端也支持许多不同的处理器系统平台,可运行于主机上进行跨平台的交叉调试。除此之外,GDB也支持发展嵌入式系统最需要的remote debug(远程调试),需要remote debug的原因是嵌入式系统通常很小,有时并不适合执行整个debugger,因此,在主机上对远端的嵌入式系统作remote debug是最适当的方式。GDB采用gdbstub或gdbserver,通过serial port或TCP/IP來实现remote debug。2、实验原理GDB 是支持远程调试的

55、,可以通过 serial port, tcp, udp 和 pipe 与目标机进行交流,使用的语言叫做 RSP(Remote Serial Protocol),同样这需要目标机使用同样的语言和它交流,这样就需要一个翻译。这个目标机上的翻译程序就是 stub (裸机和简单操作系统) 或者 gdbserver (可以运行gdb的操作系统)。除此之外,还必须在主机上创建交叉调试的环境,因为 GDB 必须知道目标机的结构(寄存器,字长等等),二进制文件的格式(elf,pe,寄存器代号),操作指令才可以实现远程调试,不然它怎么知道寄存器名对应的是哪个?怎么加载函数的符号表来设置断点?怎么反汇编地址内容?

56、因此,使用Cross-gdb调试程序,涉及Cross-gdb和Gdbserver两个程序。其中Cross-gdb与Cross-gcc类似,运行于主机上进行跨平台的交叉调试。Gdbserver则运行在开发板上,用于代替硬件调试器和主机上的Cross-gdb通信,进行嵌入式Linux应用程序调试。实验四 嵌入式GUI 应用程序实验 实验目的1、了解嵌入式GUI 的类型2、了解Qt 的基本特征3、掌握Qt 集成开发平台的使用方法4、掌握Qt 应用程序编译方法实验环境1、装有Linux 操作系统的PC 机一台;2、XSBase270 或XSBase255 ARM 实验开发平台一套实验内容阅读相关知识,

57、完成以下实验:1、在PC 平台编写一个Qt 应用程序,写出编译过程2、将PC 平台上编写的Qt 应用程序编译成目标板上能运行的格式,写出编译过程3、将ARM 格式的Qt 应用程序下载到目标板上,编写desktop 文件,并运行程序,写出具体操作过程。4、通过NFS 方式运行ARM 格式程序,写出具体操作过程相关练习1、根据Qt 帮助文档中的uic 使用方法,写出从ui 文件中创建一个C+继承类的具体步骤。2、某同学将在PC 平台上编写的Qt 应用程序编译成ARM 格式时,出现如下错误,请分析产生错误的原因,应怎样修改才能编译?3、某同学在通过NFS 方式运行编译好的应用程序时,出现如下错误,请

58、分析产生错误的原因,应作修改才能运行?./snake:error while loading libraries:libqpe.so.1:cannot open shared object file:No such file ordirectory相关知识Qt 是一种跨平台的C+图形界面(GUI)工具包,它是Troll Tech 化公司的标志产品,Qt 工具包括用于商业性质的商业版和用于开发自由软件的两种不同的版本,用自由版开发软件必须作为自由软件公布。1、Qt 特征l 面向对象:Qt 具有模块设计和注重软件构件或元素的可重用性的特点。一个组件不需要知道它的内容,而通过signal 和slot 与外界通信、交流,所有的Qt 的组件都可通过继承而序列化。l 构件支持:Qt 提供signal 和slot 概念,它是一种安全可靠的方法,它允许回调,并支持对象之间在彼此不知道对方信息的情况下进行合作,这使得Qt 非常适合于真正的构件编程。l 方便性:由于Qt 是一种跨平台性GUI 工具包,所以,它对编程者隐藏了在处理不同窗口系统时潜在问题。为使基于Qt 程序更

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!