嵌入式系统设计与应用课件(第3版)第4章 嵌入式Linux程序开发基础.ppt
《嵌入式系统设计与应用课件(第3版)第4章 嵌入式Linux程序开发基础.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统设计与应用课件(第3版)第4章 嵌入式Linux程序开发基础.ppt(85页珍藏版)》请在文库网上搜索。
1、第第4章章嵌入式嵌入式Linux程序开发基础程序开发基础本章要点本章要点1、嵌入式、嵌入式Linux编译器编译器GCC的使用的使用2、“文件包含文件包含”处理处理3、Make命令和命令和Makefile文件文件4、嵌入式、嵌入式Linux汇编语言程序设计汇编语言程序设计基础知识基础知识5、LinuxShell编程方法编程方法6、位运算、位运算4.1嵌入式嵌入式Linux编译器编译器4.1.1Linux下下C语言编译过程语言编译过程1、编辑器、编辑器2、编译链接器、编译链接器3、调试器、调试器4、项目管理器、项目管理器4.1.2GCC编译器编译器1、GCC编译器编译器GCC编译器能将编译器能将C
2、、C+语言源程序、汇编语言源程序、汇编语言源程序和目标程序编译、连接成可执语言源程序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,行文件,如果没有给出可执行文件的名字,GCC将自动生成一个名为将自动生成一个名为a.out的文件。的文件。2、GCC的执行过程的执行过程预处理预处理(也称预编译,也称预编译,Preprocessing)、编译、编译(Compilation)、汇编、汇编(Assembly)和连接和连接(Linking)。3、GCC的基本用法和选项的基本用法和选项GCC最基本的用法最基本的用法 gccoptionsfilenames-c:只编译,不连接成为可执行文件。
3、:只编译,不连接成为可执行文件。-ooutput_filename:确定输出文件的名称为:确定输出文件的名称为output_filename,同时这个名称不能和源文件,同时这个名称不能和源文件同名。同名。-g:产生符号调试工具:产生符号调试工具(GNU的的gdb)所必要的符号所必要的符号资讯,要想对源代码进行调试,我们就必须加入资讯,要想对源代码进行调试,我们就必须加入这个选项。这个选项。-O:对程序进行优化编译、链接,采用这个选项,:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,整个源代码会在编译、链接过程中进行优化处理,产生的可执行文件的执行效率较高。
4、产生的可执行文件的执行效率较高。4.2“文件包含文件包含”处理处理1、头文件、头文件在在C语言中,需要利用头文件来定义结构、语言中,需要利用头文件来定义结构、常量以及声明函数的原型。大多数常量以及声明函数的原型。大多数C的头文的头文件都存放在件都存放在/usr/include及其子目录下。及其子目录下。引用以上目录中的头文件在编译的时候无引用以上目录中的头文件在编译的时候无需加上路径,但如果程序中引用了其他路需加上路径,但如果程序中引用了其他路径的头文件,需要在编译的时候用径的头文件,需要在编译的时候用I参数。参数。2、“文件包含文件包含”处理处理“文件包含文件包含”处理,意思是把另外一个源文
5、处理,意思是把另外一个源文件的内容包含到本程序中来。其作用是减件的内容包含到本程序中来。其作用是减少编写程序的重复劳动,即把一些要重复少编写程序的重复劳动,即把一些要重复使用的东西,编写到一个使用的东西,编写到一个“头文件头文件”(*.h)中,然后在程序中用)中,然后在程序中用include命令来实现命令来实现“文件包含文件包含”的操作。的操作。例如:例如:n=1+2+3+100求和求和运算。运算。1#include2intmain()3intx=100,s=0,i=1;5while(i=x)6s=s+i;7i+;89printf(sum=%dn,s);10return0;11为了让加法部分能
6、重复使用,将加法部分写为了让加法部分能重复使用,将加法部分写成一个函数成一个函数intsum(intn)。intmysum(intn)inti=1,ss=0;while(i=n)ss=ss+i;i+;return(ss);再在主函数中调用它再在主函数中调用它1#include2intmysum(intn);3intmain()45intx=100;6ints=0;7s=mysum(x);8printf(sum=%dn,s);9return0;10注意:上述程序中的第注意:上述程序中的第2行语句行语句intmysum(intn);是必不可少的。由于是必不可少的。由于mysum(intn)函数的函
7、数的定义是从第定义是从第11行语句开始,而调用行语句开始,而调用mysum(intn)函数的语句在第函数的语句在第7行。因此,行。因此,要在调用之前声明这个函数。要在调用之前声明这个函数。下面进一步将程序中具有独立功下面进一步将程序中具有独立功能的能的mysum()函数分割出来。函数分割出来。该程序可分割为下列该程序可分割为下列3个程序:个程序:mysum.h、mysum.c和和ex_sum.c。(1)程序)程序mysum.h:1/*mysum.h*/2intmysum(intn);(2)程序)程序mysum.c:1./*mysum.c*/2.intmysum(intn)3.4.inti=1,
8、ss=0;5.while(i=n)6.ss=ss+i;7.i+;8.9.return(ss);10.(3)主程序)主程序ex_sum.c:1./*ex_sum.c*/2.#include3.#includemysum.h4.intmain()5.6.intx=100;7.ints=0;8.s=mysum(x);9.printf(sum=%dn,s);10.return0;11.在在Linux环境下,执行编译程序命令:环境下,执行编译程序命令:gccex_sum.cmysum.c-osum此命令将此命令将ex_sum.c和和mysum.c编译成一个编译成一个在在Linux环境下的可执行文件环境下
9、的可执行文件sum。在在Linux环境下运行可执行文件环境下运行可执行文件sum,./sum结果如下:结果如下:sum=50504.3Make命令和命令和Makefile工程工程管理管理4.3.1认识认识Make编写一个编写一个Makefile文件如下:文件如下:sum:ex_sum.omysum.ogccex_sum.omysum.o-osumex_sum.o:ex_sum.cgcc-cex_sum.cmysum.o:mysum.cmysum.hgcc-cmysum.c注意,注意,“gccex_sum.cmysum.c-osum”前面前面不是空格,而是按下不是空格,而是按下“tab”键的符号
10、位。键的符号位。将其保存为:将其保存为:makefile,文件名没有后缀。然后,文件名没有后缀。然后,在在Linux环境下执行环境下执行make,其运行结果如下:,其运行结果如下:#makegcc-cex_sum.cgcc-cmysum.cgccex_sum.omysum.o-osum将将ex_sum.c和和mysum.c编译成在编译成在Linux环境下环境下的可执行文件的可执行文件sum。Makefile是是一个配置文件。一个配置文件。Makefile中通常包含如下内容:中通常包含如下内容:需要由需要由make工具创建的目标体,工具创建的目标体,通常通常是目标文件或可执行文件;是目标文件或可
11、执行文件;要创建的目标体所依赖的文件;要创建的目标体所依赖的文件;创建每个目标体时需要运行的命令。创建每个目标体时需要运行的命令。Makefile的格式为:的格式为:target:dependency_filescommand示例示例main:main.omytool1.omytool2.ogcc-omainmain.omytool1.omytool2.omain.o:main.cgcc-cmain.cmytool1.o:mytool1.cmytool1.hgcc-cmytool1.cmytool2.o:mytool2.cmytool2.hgcc-cmytool2.c该程序有该程序有mytoo
12、l1.h、mytool2.h、mytool1.c、mytool2.c等文件需要编译。等文件需要编译。编写编写Makefile文件:文件:再次运行再次运行make,这时,这时,make会自动检会自动检查相关文件的时间戳。查相关文件的时间戳。首先,在检查首先,在检查“main”、“main.o”、“mytool1.o”和和“mytool2.o”这这3个文件的个文件的时间戳之前,它会向下查找那些把时间戳之前,它会向下查找那些把“main.o”、“mytool1.o”或或“mytool2.o”作为目标文件的时间戳。如作为目标文件的时间戳。如果这些文件中任何一个的时间戳比它们新,果这些文件中任何一个的时
13、间戳比它们新,则用则用gcc命令将此文件重新编译。这样,命令将此文件重新编译。这样,make就完成了自动检查时间戳的工作,开就完成了自动检查时间戳的工作,开始执行编译工作。这也就是始执行编译工作。这也就是Make工作的工作的基本流程。基本流程。4.3.2Makefile变量变量为了进一步简化编辑和维护为了进一步简化编辑和维护Makefile,make允许在允许在Makefile中创建和使用变量。中创建和使用变量。变量是在变量是在Makefile中定义的名字,用来代中定义的名字,用来代替一个文本字符串,该文本字符串称为该替一个文本字符串,该文本字符串称为该变量的值。变量的值。在在Makefile
14、中的变量定义有两种方式:一中的变量定义有两种方式:一种是递归展开方式,另一种是简单方式。种是递归展开方式,另一种是简单方式。递归展开方式的定义格式为:递归展开方式的定义格式为:VAR=var。简单扩展方式的定义格式为:简单扩展方式的定义格式为:VAR:=var。Make中的变量无论采用哪种方式定义使用中的变量无论采用哪种方式定义使用时格式均为:时格式均为:$(VAR)。例如例如OBJS=main.omytool1.omytool2.oCC=gccmain:$(OBJS)$(CC)$(OBJS)-omainmain.o:main.c$(CC)-cmain.cmytool1.o:mytool1.c
15、mytool1.h$(CC)-cmytool1.cmytool2.o:mytool2.cmytool2.h$(CC)-cmytool2.c进一步简化进一步简化OBJS=main.omytool1.omytool2.oCC=gccmain:$(OBJS)$(CC)$-o$main.o:main.c$(CC)-c$-o$mytool1.o:mytool1.cmytool1.h$(CC)-c$-o$mytool2.o:mytool2.cmytool2.h$(CC)-c$-o$4.3.3Makefile规则规则Makefile的规则是的规则是Make进行处理的依据,进行处理的依据,它包括了目标体、依赖
16、文件及其之间的命它包括了目标体、依赖文件及其之间的命令语句。一般的,令语句。一般的,Makefile中的一条语句中的一条语句就是一个规则。就是一个规则。1隐式规则隐式规则在使用在使用Makefile时,有一些语句经常使用,时,有一些语句经常使用,而且使用频率非常高的东西,隐式规则能而且使用频率非常高的东西,隐式规则能够告诉够告诉make使用默认的方式来完成编译任使用默认的方式来完成编译任务,这样,当用户使用它们时就不必详细务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件指定编译的具体细节,而只需把目标文件列出即可。列出即可。Make会自动按隐式规则来确定会自动按隐式规则
17、来确定如何生成目标文件。如何生成目标文件。例如例如OBJS=main.omytool1.omytool2.oCC=gccmain:$(OBJS)$(CC)$-o$2.模式规则模式规则模式规则规定,在目标文件的定义时需要模式规则规定,在目标文件的定义时需要用用“%”字符。字符。“%”的意思是表示一个或的意思是表示一个或多个任意字符,与文件名匹配。多个任意字符,与文件名匹配。例如:例如:“%.c”表示以表示以“.c”结尾的文件名结尾的文件名(文件名的长度至少为(文件名的长度至少为3),而),而“s.%.c”则表示以则表示以“s.”开头,开头,“.c”结尾的文件结尾的文件名(文件名的长度至少为名(文
18、件名的长度至少为5个字符)。个字符)。例如例如OBJS=main.omytool1.omytool2.oCC=gccmain:$(OBJS)$(CC)$-o$%.o:%.c$(CC)-c$-o$4.3.4make命令的使用命令的使用4.4嵌入式嵌入式Linux汇编语汇编语言程序设计言程序设计汇编语言的优点是执行速度快,可以直接汇编语言的优点是执行速度快,可以直接对硬件进行操作。对硬件进行操作。嵌入式嵌入式Linux系统下用汇编语言编写程序有系统下用汇编语言编写程序有两种不同的形式:两种不同的形式:1、完全汇编代码、完全汇编代码2、内嵌汇编代码、内嵌汇编代码4.4.1嵌入式嵌入式Linux汇编语
19、言格式汇编语言格式1、嵌入式、嵌入式Linux汇编语言程序结构汇编语言程序结构在嵌入式在嵌入式Linux汇编语言程序中,程序是以汇编语言程序中,程序是以程序段(程序段(Section)的形式呈现的。程序段)的形式呈现的。程序段是具有特定名称的相对独立的指令或数据是具有特定名称的相对独立的指令或数据序列。序列。程序段分为代码段(程序段分为代码段(CodeSection)和数)和数据段(据段(DataSection)两种类型。代码段)两种类型。代码段的主要内容为执行代码,而数据段则存放的主要内容为执行代码,而数据段则存放代码段运行时需要用到的数据。代码段运行时需要用到的数据。一个汇编语言程序至少要
20、有一个代码段。一个汇编语言程序至少要有一个代码段。2、嵌入式、嵌入式Linux汇编语言的语法格式汇编语言的语法格式嵌入式嵌入式Linux汇编语言的语法格式和汇编语言的语法格式和DOS/Windows下的汇编语言语法格式有较大的下的汇编语言语法格式有较大的差异。差异。DOS/Windows下的汇编语言代码都是下的汇编语言代码都是Intel格式,而嵌入式格式,而嵌入式Linux的汇编语言代码采用的汇编语言代码采用的是的是AT&T格式,两者在语法格式上有着很大的格式,两者在语法格式上有着很大的不同不同(1)在)在AT&T汇编格式中,寄存器名要加汇编格式中,寄存器名要加上上%作为前缀;而在作为前缀;而
21、在Intel汇编格式中,汇编格式中,寄存器名不需要加前缀。寄存器名不需要加前缀。2、嵌入式、嵌入式Linux汇编语言的语法格式汇编语言的语法格式(2)在)在AT&T汇编格式中,用汇编格式中,用$前缀表示前缀表示一个立即操作数;而在一个立即操作数;而在Intel汇编格式中,立即数汇编格式中,立即数的表示不用带任何前缀。的表示不用带任何前缀。(3)AT&T和和Intel格式中的源操作数和目标操格式中的源操作数和目标操作数的位置正好相反。在作数的位置正好相反。在Intel汇编格式中,目标汇编格式中,目标操作数在源操作数的左边;而在操作数在源操作数的左边;而在AT&T汇编格式汇编格式中,目标操作数在源
22、操作数的右边。中,目标操作数在源操作数的右边。2、嵌入式、嵌入式Linux汇编语言的语法格式汇编语言的语法格式(4)在)在AT&T汇编格式中,操作数的字长由操作汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀符的最后一个字母决定,后缀b、w、l分别表示操作数为字节(分别表示操作数为字节(byte,8比特)、比特)、字(字(word,16比特)和长字(比特)和长字(long,32比特);比特);而在而在Intel汇编格式中,操作数的字长是用汇编格式中,操作数的字长是用“byteptr”和和“wordptr”等前缀来表示的。等前缀来表示的。(5)在)在AT&T汇编格式中,绝对转移和调用指令
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式系统设计与应用课件第3版第4章 嵌入式Linux程序开发基础 嵌入式 系统 设计 应用 课件 Linux 程序 开发 基础