嵌入式系统基础-第九讲-嵌入式交叉编译解读.ppt_第1页
嵌入式系统基础-第九讲-嵌入式交叉编译解读.ppt_第2页
嵌入式系统基础-第九讲-嵌入式交叉编译解读.ppt_第3页
嵌入式系统基础-第九讲-嵌入式交叉编译解读.ppt_第4页
嵌入式系统基础-第九讲-嵌入式交叉编译解读.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统基础,第九讲 嵌入式交叉编译基础,,2019/6/22,1,嵌入式交叉编译基础,交叉开发环境:宿主机调试通道目标机“在谁的上面编写运行在谁上的程序的问题”,1 嵌入式交叉编译环境简介,交叉编译就是在一个平台上生成另一个平台上的可执行代码。 平台分别指的是主机平台Host和目标平台Target。 就我们在ARM平台上移植Linux来说,Host是一台一般的PC机,它通过串口或网络接口与Target通信; Target是arm-linux平台(这里说的arm指的是平台所使用的CPU是ARM9处理器,linux指的是运行的操作系统是Linux)。 我们在Host上开发程序,并在这个平台上运行交叉编译器Cross Complier,编译我们的程序,而由Cross Complier生成的程序将在Target上运行。,1 嵌入式交叉编译环境简介,需要交叉编译的原因: 首先,在项目的起始阶段,目标平台尚未建立,因此需要做交叉编译,以生成我们所需要的Boot loader以及kernel(因为Bootloader和kernel的源码需要经过交叉编译后才可以在目标平台上运行); 其次,当目标平台能启动之后,由于目标平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。,1 嵌入式交叉编译环境简介,NFS服务可以使网络上的同为Linux或Unix系统主机共享文件系统(Net FileSystem)。 NFS可以将远程文件系统载入在本地文件系统下。远程的硬盘、目录和光驱都可以变成本地主机目录树中的一个子目录。 载入后与处理自己的文件系统一样使用即可。不只方便,也节省了重复保存文件的空间、传输文件的时间及网络带宽。,2 NFS服务,如何进行程序调试?编译后如何,共享等等,NFS特点 NFS系统也使用C/S体系结构,就是有服务器端与客户端 服务器端提供共享的文件系统,必须把文件系统输出(export)出去 客户端则要把文件系统载入到自己的系统下 使用NFS,需要在服务器端设置输出,在客户端设置载入,2 NFS服务,NFS服务器端配置 (1)关闭防火墙 (2)配置共享目录 -客户端主机IP范围 (3)主机IP (4)启动NFS服务,NFS客户端 (1)设置客户端IP地址 (2)挂载共享目录,mount -t nfs 主机ip:共享目录 挂载点,注意事项:关闭防火墙,主机与客户端在同一ip段,mount -t nfs o nolock 主机ip:/arm2410s /host,2 NFS服务,混合开发模式的必要: 由于初学者对Linux系统不是很熟悉,通常会采用Windows下强大的编辑工具,通过共享再在Linux系统下进行编译、调试等工作。 (1)VMware虚拟机设置共享 (2)SSH客户端软件 (3)Windows下的文本编辑工具,3 Windows和Linux混合开发模式,(1)VMware虚拟机设置共享-1,3 Windows和Linux混合开发模式,(2)SSH客户端软件,SSH的英文全称:Secure Shell SSH把所有传输的数据进行加密,并且SSH客户端软件可将传输的数据进行压缩后再传输。 (1)PuTTY (2)Secure Shell Client,3 Windows和Linux混合开发模式,(3)Windows下的文本编辑工具, UltraEdit-32 Source Insight,3 Windows和Linux混合开发模式,gcc(GNU C Compiler) 能将C、C+语言源程序、汇编语言程序和目标程序编译、连接成可执行文件。 是GNU推出的功能强大、性能优越的多平台编译器,可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%30%。,4 GCC编译器,gcc的执行过程 使用gcc由C语言源代码文件生成可执行文件的过程要经历四个相互关联的步骤 1、预处理(也称预编译,Preprocessing) 对头文件(include)、预编译语句(如define等)进行分析预处理器cpp 2、编译(Compilation) 将预处理后的文件转换成汇编语言,生成文件.s编译器ccl 3、汇编(Assembly) 由汇编变为目标代码(机器代码),生成.o的文件汇编器as 4、连接(Linking) 连接目标代码,生成可执行程序链接器ld,4 GCC编译器,四个相互关联的步骤源文件.c 1、.c源文件 2、生成.i文件 3、生成文件.s 4、生成.o的文件 5、生成可执行程序,4 GCC编译器,GNU C 的使用 基本语法 gcc options filenames 说明: 在gcc后面可以有多个编译选项,同时进行多个编译操作。 当你不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。,4 GCC编译器,gcc选项 -o选项 你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out。 例:gcc o count count.c -c选项:告诉GCC仅把源代码编译为目标代码, 而取消连接的步骤。缺省时GCC建立的目标代码文件有一个.o的扩展名。 例:gcc c test2.c -E 只运行 C 预编译器。 -S 编译选项告诉 gcc 在为 C 代码产生了汇编语言文件后停止编译。,4 GCC编译器,-include file 功能相当于在代码中使用#include 例子用法: gcc -o example example.c -include /usr/include /stdio.h -I 用来指定头文件目录. /usr/include目录一般是不用指定的,但是如果头文件不在/usr/include里我们就要用-I参数指定了; 比如头文件放在/myinclude目录,那编译命令行就要加上 - Imyinclude参数了,如果不加你会得到一个“xxxx.h: No such file or directory”的错误。,4 GCC编译器,Gdb(GNU debugger)是GNU开发组织发布的一个强大的Unix/Linux下的程序调试工具。 是一个命令行的调试器,但gdb具有比很多图形化调试器更强大的功能。 可以调试各种程序,包括C,C+,JAVA,PASCAL等具有远程调试功能对嵌入式非常有用,5 Gdb调试器,Gdb主要可以完成下面任务: (1)启动程序,并可以指定某些参数控制程序的运行 (2)可让被调试的程序在用户所指定的断点处停住 (3)当程序停止时,检查程序的状态 (4)动态地改变程序的参数,可以避过bug,继续查找其他的问题,5 Gdb调试器,gdb program也就是你的执行文件,一般在当前目录下,5 Gdb调试器,Gdb的命令可以使用help命令来查看,help命令只是列出gdb的命令种类。 使用help命令,显示class种类中的所有命令。 使用help命令,查看command命令的帮助。 Gdb中输入命令时,可以不用输入命令的全称,只用输入命令的前几个字符就可以。 在linux下,可以按两次TAB键来补齐命令的全称。 Gdb中运行Linux的shell程序,如shell 。,5 Gdb调试器,5 Gdb调试器,加载要调试的执行文件 file 加载要调试的执行程序exec。,5 Gdb调试器,查看源代码 list 显示程序第linenum行的周围的源程序 list 显示函数名为function的函数周围的源程序 list 显示当前行后面的源程序 list - 显示当前行前面的源程序 set listsize n 设置一次显示源代码的行数 show listsize 查看当前listsize的设置,5 Gdb调试器,设置断点(BreakPoint) break-进入指定函数时停住。 break-在指定行号停住,5 Gdb调试器,清除断点 delete breakpoints range 删除指定的断点,breakpoints为断点号,range表示断点号的范围(如:2-4)。如果不指定断点号,则表示删除所有的断点。其简写命令为d。 比删除更好的一种方法是disable断点,disable了断点,gdb不会删除,当还需要时,enable即可,就好像回收站一样。,5 Gdb调试器,设置观察点 观察点一般用来观察某个表达式的值是否变化了。 watch 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住。 info watchpoints 列出当前设置的所有观察点,5 Gdb调试器,run (r) 从程序开始运行程序 continue (c) 恢复程序运行,直到程序结束,或是下一个断点到来。 step (s) 单步执行,进入调用的函数的内部 next (n) 单步执行,不会进入调用的函数内部 finish (f) 如果已进入了某函数,而想退出该函数返回到它的调用函数中,5 Gdb调试器,练习1(1) 键入vi,编辑一个新文件exam.c。其内容如下: #include main() int a,i=0; a=0; while(i10) a=a+2; printf(“the value of a=%d n“,a); sleep(1); i=i+1; ,5 Gdb调试器,练习1(2) 保存退出exam.c 编译exam.c 。 使用 gcc -o examo exam.c 使用 gcc - g -o gexam exam.c 比较gexam 与 examo的大小,因为 gexam含有调试信息,所以gexam比 examo大。 执行gexam与examo 执行examo 键入 ./examo 。这里./表示当前目录 执行gexam 键入 ./gexam。,练习1(3) 使用gdb调试程序 (1)启动gdb程序 (gdb)gdb (2)读入调试程序 (gdb)file gexam (3)列出相应于正在执行的程序的原文件内容 (gdb)list (4)在程序a=0;处设置一个断点 (gdb)break 4(注:这里4 为程序a=0;所在程序的行号) (5)在程序printf(“the value of a=%d n”,a);处设置一个断点 (6)执行该程序 (gdb)run (7)查看变量a的值 (gdb)print a (8)查看变量a的类型(gdb)whatis a (9)执行下一个源程序行(gdb)next (10)从断点开始继续执行到下一个断点 (gdb)continue (11)查看变量a的值(gdb) print a ,看看a是否有变化 (12)不停地执行(gdb)continue,直到程序结束。 (13)退出gdb quit,练习2:程序功能为先显示一个字符串,再反序显示,使用GDB找出其中的错误并改正 #include void my_print(char *string) printf (“The string is %sn“, string); void my_print2 (char *string) char *string2; int size, i; size = strlen (string); string2 = (char *) malloc (size + 1); for (i = 0; i size; i+) string2size - i = stringi; string2size+1 = 0; printf (“The string printed backward is %sn“, string2); ,练习2:程序功能为先显示一个字符串,再反序显示,使用GDB找出其中的错误并改正 int main() char my_string = “hello there“; my_print (my_string); my_print2 (my_string); return; ,Make工具及makefile文件概述 Makefile基本知识 Makefile应用 1)为单个文件编写makefile 2)为多个文件编写makefile 3)使用不同目录的文件的makefile的写法,6 Makefile工具,Make工具及makefile文件概述,GNU Make是程序自动维护工具 在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入 gcc 命令进行编译的话,则会 非常不方便。因此,人们通常利用 make 工具来自动完成编译工作。 这些工作包括: 1)如果仅修改了某几个源文件,则只重新编译这几个源文件; 2)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。,Makefile基本知识,基本makefile结构 Makefile由一系列规则组成,规则格式如下: 其中: target需要由 make 工具创建的项目,通常是目的文件和可执行文件。 通常使用“目标(target)”一词来表示要创建的项目。 prerequisites 要创建的项目依赖于哪些文件。 command 创建每个项目时需要运行的命令。 注:命令前面需要敲入tab键,而不是空格!,target : prerequisites 依赖关系 command 命令,Make工具及makefile文件概述,Make及makefile原理 GNU make的主要工作是读进文本文件makefile。这些文件主要是有关那些文件(目的文件)是从哪些别的文件(依靠文件)中产生的,用什么命令来进行这个产生的过程。 有了这些信息,make会检查磁盘上的文件,如果目的文件的时间比至少它的一个依靠文件旧,Make将执行相应的命令,以便更新目的文件。目的文件不一定是最后的可执行文件,它可以是任何一个文件。,Makefile基本知识,Makefile实例: makefile开始 myprog : foo.o bar.o gcc foo.o bar.o -o myprog foo.o : foo.c foo.h bar.h gcc -c foo.c -o foo.o bar.o : bar.c bar.h gcc -c bar.c -o bar.o clean: -rm *.o myprog makefile结束,实例说明 从上面的例子注意到,第一个字符为 # 的行为注释行。 第一个非注释行指定 myprog为目标,并且依赖于 foo.o 和bar.o 文件。 foo.o 和bar.o文件又各自有自己的依赖规则 makefile中一般都有clean规则,在重新编译之前删除以前生成的各个文件,此条规则没有依赖文件 使用make工具的执行makefile的命令为: make或make makefile 缺省文件名为当前目录下的makefile或Makefile或 GNUmakefile ,也可以使用命令行参数f指定文件名: 例如 make f filename,Makefile基本知识,实例说明 如果没有“-f”参数,在Linux中, GNU make 工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索 makefile文件。 通过命令行参数中的target ,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。 如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。 如 make make clean,Makefile基本知识,Makefile变量 环境变量: (1)存储文件名列表。 (2)存储可执行文件名。 (3)存储编译器标识。 (4)存储参数列表。 比如我们利用makefile变量把上面的makefile文件重写一遍。,Makefile基本知识,Makefile变量 使用环境变量后的makefile实例 =makefile开始= OBJS=foo.o bar.o CC=gcc CFLAGS=-Wall O g EXEC=myprog $(EXEC):$(OBJS) $(CC) $(OBJS) o $(EXEC) foo.o:foo.c foo.h bar.h $(CC) $(CFLAGS) c foo.c o foo.o bar.o:bar.c bar.h $(CC) $(CFLAGS)bar.c o bar.o =makefile结束=,Makefile变量 内部变量: $-扩展成当前规则的目的文件名 $ -扩展成依靠列表中的第一个依靠文件 $ -扩展成整个依靠的列表 利用这些变量,可以把上面的makefile写成:,Makefile基本知识,Makefile变量 =makefile开始= OBJS = foo.o bar.o CC = gcc CFLAG =-Wall O g myprog:$(OBJS) $(CC) $ -o $ foo.o:foo.c foo.h bar.h $(CC) $(CFLAG) c $ -o $ bar.o:bar.c bar.h $(CC) $(CFLAG) c $ -o $ =makefile结束=,Makefile变量 内部变量: $-扩展成当前规则的目的文件名 $ -扩展成依靠列表中的第一个依靠文件 $ -扩展成整个依靠的列表 利用这些变量,可以把上面的makefile写成:,为单个文件编写makefile 编写hello.c程序 #include int main(void) printf(“Hello world!n“); return 0; ,执行: $ vi Makefile =makefile开始= # This is a sample CC = gcc all:hello.o $(CC) o hello hello.o hello.o:hello.c $(CC) c o hello.o hello.c clean: rm *.o hello =makefile结束=,为多个文件编写makefile 有四个文件menu.c,music.c,picture.c,menu.h /*menu.c*/,#include #include“menu.h” int main(void) int choice; printf(“-welcome you ! -n“); printf(“ * 1 music! *n“); printf(“ * 2 picture! *n“); printf(“-have a choice!-n“); scanf(“d“,switch(choice) case 1: music(); break; case 2: picture(); break; printf(“Good Bye!n“); return 0; ,Makefile应用,为多个文件编写makefile /*music.c*/ #include #include void music(void) printf(“Listen to music!n“); ,Makefile应用,为多个文件编写makefile /*picture.c*/ #include void picture(void) printf(“Have a look at picture!n“); ,Makefile应用,为多个文件编写makefile /* menu.h */ void music(void); void picture(void);,Makefile应用,为多个文件编写makefile 几个文件间的依赖关系,Makefile应用,上面程序的makefile: =makefile开始= CC=gcc all:menu.o music.o picture.o $(CC) menu.o music.o picture.o -o menu menu.o:menu.c menu.h $(CC) -c menu.c -o menu.o music.o:music.c $(CC) -c music.c -o music.o picture.o:picture.c $(CC) -c picture.c -o picture.o clean: rm *.o menu =makefile结束=,Makefile应用,上面程序的makefile:实际上,可以用$代表目标文件,$代表源文件,于是可以将makefile写成这样: =makefile开始= CC=gcc all:menu.o music.o picture.o $(CC) $ -o menu menu.o:menu.c menu.h $(CC) -c $ -o $ music.o:music.c $(CC) -c $ -o $ picture.o:picture.c $(CC) -c $ -o $ clean: rm *.o menu =makefile结束=,Makefile应用,上面程序的makefile:由于各个文件的编译命令几乎没有什么差别,可以使用通配符%或*进一步简化 : =makefile开始= CC=gcc all:menu.o music.o picture.o $(CC) $ -o menu %.o:%.c $(CC) -c -o $ $ clean: rm *.o menu =makefile结束=,Makefile应用,使用不同目录的文件的makefile的写法 假设程序的目录结构如下: bin 存放生成的可执行文件(menu) obj 存放.o文件(menu.o,music.o,picture.o) include 存放.h文件(menu.h) src 存放源程序文件和makefile(menu.c,picture.c,music.c),Makefile应用,=makefile开始= CC=gcc all:/obj/menu.o /obj/music.o /obj/picture.o $(CC) -o /bin/menu $ /obj/menu.o:./menu.c /include/menu.h $(CC) -o $ -c $ -I /include /obj/music.o:./music.c $(CC) -o $ -c $ /obj/picture.o:./picture.c $(CC) o $ -c $ clean: rm /bin/menu =makefile结束=,=makefile开始= CC=gcc SRC_DIR = ./ OBJ_DIR = /obj/ BIN_DIR = /bin/ INC_DIR = /include all:$(OBJ_DIR)menu.o $(OBJ_DIR)music.o $(OBJ_

温馨提示

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

最新文档

评论

0/150

提交评论