文库网
ImageVerifierCode 换一换
首页 文库网 > 资源分类 > PPT文档下载
分享到微信 分享到微博 分享到QQ空间

嵌入式系统设计与应用课件(第3版)第4章 嵌入式Linux程序开发基础.ppt

  • 资源ID:20014237       资源大小:420.50KB        全文页数:85页
  • 资源格式: PPT        下载积分:10文币
微信登录下载
快捷下载 游客一键下载
账号登录下载
三方登录下载: QQ登录 微博登录
二维码
扫码关注公众号登录
下载资源需要10文币
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

嵌入式系统设计与应用课件(第3版)第4章 嵌入式Linux程序开发基础.ppt

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汇编格式中,绝对转移和调用指令

23、汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上)的操作数前要加上*作为前缀,而作为前缀,而在在Intel格式中则不需要。格式中则不需要。2、嵌入式、嵌入式Linux汇编语言的语法格式汇编语言的语法格式(6)在)在AT&T汇编格式中,内存操作数的寻址方汇编格式中,内存操作数的寻址方式是式是section:disp(base,index,scale)而在而在Intel汇编格式中,内存操作数的寻址方汇编格式中,内存操作数的寻址方式为:式为:section:base+index*scale+disp4.4.2嵌入式嵌入式Linux汇编程序示例汇编程序示例【例例4-3】编写一个最简

24、单的编写一个最简单的AT&T格式的格式的汇编程序。汇编程序。用编辑工具编写如下汇编源程序,并用编辑工具编写如下汇编源程序,并将其保存为将其保存为hello.s。#hello.s.data#数据段声明数据段声明msg:.stringHello,world!n#要输出的字符串要输出的字符串len=.-msg#字串长度字串长度.text#代码段声明代码段声明.global_start#指定入口函数指定入口函数_start:#在屏幕上显示一个字符串在屏幕上显示一个字符串movl$len,%edx#参数三:字符串长度参数三:字符串长度movl$msg,%ecx#参数二:要显示的字符串参数二:要显示的字符

25、串movl$1,%ebx#参数一:文件描述符参数一:文件描述符(stdout)movl$4,%eax#系统调用号系统调用号(sys_write)int$0 x80#调用内核功能调用内核功能#退出程序退出程序movl$0,%ebx#参数一:退出代码参数一:退出代码movl$1,%eax#系统调用号系统调用号(sys_exit)int$0 x80#调用内核功能调用内核功能【例例4-4】用用Intel格式编写一个与例格式编写一个与例1相同的相同的简单汇编程序。简单汇编程序。;hello.asmsection.data;数据段声明数据段声明msgdb“Hello,world!”,0 xA;要输出的字符

26、串要输出的字符串lenequ$-msg;字串长度字串长度section.text;代码段声明代码段声明global_start;指定入口函数指定入口函数_start:;在屏幕上显示一个字符串在屏幕上显示一个字符串movedx,len;参数三:字符串长度参数三:字符串长度movecx,msg;参数二:要显示的字符串参数二:要显示的字符串movebx,1;参数一:文件描述符参数一:文件描述符(stdout)moveax,4;系统调用号系统调用号(sys_write)int0 x80;调用内核功能调用内核功能;退出程序退出程序movebx,0;参数一:退出代码参数一:退出代码moveax,1;系统调

27、用号系统调用号(sys_exit)int0 x80;调用内核功能调用内核功能4.4.3编译嵌入式编译嵌入式Linux汇编程序汇编程序1、汇编命令、汇编命令rootlocalhostasm#as-ohello.ohello.s2、链接命令、链接命令rootlocalhostasm#ld-s-ohellohello.o3、运行程序、运行程序rootlocalhostasm#./hello4.5嵌入式嵌入式Linuxshell编程编程shell是用户与是用户与Linux系统间的接口程序,它系统间的接口程序,它允许用户向操作系统输入需要执行的命令。允许用户向操作系统输入需要执行的命令。当用户在终端窗口

28、输入命令,系统会利用当用户在终端窗口输入命令,系统会利用解释器解释这些命令从而执行相应的操作。解释器解释这些命令从而执行相应的操作。完成这一解释功能的机制就是完成这一解释功能的机制就是shell。shell编程就是把编程就是把shell命令编写成可执行的命令编写成可执行的脚本文件。脚本文件。4.5.1shell语法基础语法基础1、shell脚本文件脚本文件(1)shell脚本文件结构脚本文件结构shell脚本文件结构格式是固定的,看一脚本文件结构格式是固定的,看一个示例:个示例:#!/bin/bashecho“HelloWorld!”将文件保存为将文件保存为hello.sh。shell脚本文件

29、的第脚本文件的第1行必须以符号行必须以符号“#!”开头。开头。使用使用/bin/bash解解释器来解器来解释并并执行行程序。程序。(2)编译)编译shell脚本文件脚本文件编译编译shell脚本文件的命令为:脚本文件的命令为:chmod+x文件名文件名例如:例如:chmod+xhello.sh(3)执行已经编译过了的)执行已经编译过了的shell脚本文件脚本文件rootlocalhostshell#./hello.sh4)shell脚本文件的注释语句脚本文件的注释语句以以#开头的语句表示注释。但脚本第一行开头的语句表示注释。但脚本第一行用用“#!”开头的语句不是注释,而是说明开头的语句不是注释

30、,而是说明shell脚本文件的解释器。脚本文件的解释器。2、shell的变量及配置文件的变量及配置文件shell脚本文件的变量共有脚本文件的变量共有3种:用户变量、环境种:用户变量、环境变量、系统变量。变量、系统变量。(1)用户变量)用户变量变量赋值变量赋值a=helloworld(赋值号的两侧不允许有(赋值号的两侧不允许有空格)空格)获取变量的值获取变量的值获取变量的值时,要在变量前面添加获取变量的值时,要在变量前面添加“$”符号。符号。例如:例如:echo$a(2)环境变量)环境变量由关键字由关键字export说明的变量叫做环境变量。说明的变量叫做环境变量。(3)系统变量)系统变量常用系统

31、变量:常用系统变量:$0当前程序的名称当前程序的名称$n当前程序的第当前程序的第n个参数个参数,n=1,2,9$*当前程序的所有参数当前程序的所有参数(不包括程序本身不包括程序本身)$#当前程序的参数个数当前程序的参数个数(不包括程序本身不包括程序本身)$当前程序的当前程序的PID$!执行上一个指令的执行上一个指令的PID(好像不行好像不行?)$?执行上一个指令的返回值执行上一个指令的返回值4.5.2shell的流程控制语句的流程控制语句1、条件语句、条件语句条件条件if语句的格式为:语句的格式为:if(条件表达式)(条件表达式)then#语句块语句块fi2、循环语句、循环语句for(循环变量

32、初值;(循环变量初值;循环条件表达式;循环条件表达式;循环变量增量)循环变量增量)do#循环体语句块循环体语句块done4.5.3shell编程示例编程示例【例例4-5】编写显示编写显示20以内能被以内能被3整除整除的数的的数的shell脚本程脚本程序。序。#!/bin/bashfor(i=1;i/dev/nulldd if=/dev/tty bs=1 count=1 2/dev/null stty -raw stty -rawstty echostty echo echo echo “Press any key to continue.Press any key to continue.”g

33、et_charget_char/dev/null表表示空设备示空设备块大小块大小bs为为1,数目也为数目也为1将其保存为将其保存为test2.sh。然后再编译并执行程序。然后再编译并执行程序。rootlocalhostshell#chmod+xtest2.shrootlocalhostshell#./test2.shPressanykeytocontinue.4.6位运算位运算4.6.1位运算符位运算符C语言提供了六种位运算符:语言提供了六种位运算符:&(按位与)、(按位与)、|(按位或)、(按位或)、(按位(按位异或)、(取反)、异或)、(取反)、(右移)。(右移)。1、按位与运算、按位与运

34、算按位与运算:只有对应的两个二进位均为按位与运算:只有对应的两个二进位均为1时,结果位才为时,结果位才为1,否则为,否则为0。参与运算的。参与运算的数以补码方式出现。数以补码方式出现。例如:例如:9&5可写成算式如下:可写成算式如下:可见可见9&5=1。按位与运算通常用来对某些位清按位与运算通常用来对某些位清0或保或保留某些位。留某些位。例如把例如把a的高八位清的高八位清0,保留低八位,可作,保留低八位,可作a&0 x00ff运算(运算(0 x00ff的二进制数为的二进制数为0000000011111111)。)。main()inta=9,b=5,c;c=a&b;printf(a=%d/nb=

35、%d/nc=%d/n,a,b,c);2、按位或运算按位或运算只要对应的二个二进位有一个为只要对应的二个二进位有一个为1时,结果时,结果位就为位就为1。例如:例如:9|5可写算式如下:可写算式如下:可见可见9|5=13。main()inta=9,b=5,c;c=a|b;printf(a=%d/nb=%d/nc=%d/n,a,b,c);3、按位异或运算、按位异或运算当两对应的二进位相异时,结果为当两对应的二进位相异时,结果为1。例如例如95:main()inta=9;a=a5;printf(a=%d/n,a);4、求反运算、求反运算其功能是对参与运算的数的各二进位按位其功能是对参与运算的数的各二进

36、位按位求反。求反。例如,例如,9的运算为:的运算为:(0000000000001001)结果为:结果为:1111111111110110。5、左移运算左移运算把把“”左边的运算数的各二进位全部左移左边的运算数的各二进位全部左移若干位,由若干位,由“”右边的数指定移动的位右边的数指定移动的位数,高位丢弃,低位补数,高位丢弃,低位补0。例如:例如:a”左边的运算数的各二进位全部右移左边的运算数的各二进位全部右移若干位,若干位,“”右边的数指定移动的位数。右边的数指定移动的位数。例如:设例如:设a=15,a2表示把表示把000001111右右移为移为00000011(十进制十进制3)。4.6.2位表

37、达式位表达式将位运算符连接起来所构成的表达式称为将位运算符连接起来所构成的表达式称为位表达式。在这些位运算符中,其优先级位表达式。在这些位运算符中,其优先级依次为:依次为:(取反运算符)、(取反运算符)、(左移或右移)、(左移或右移)、&(按位与)或(按位与)或|(按位或)或(按位或)或(按位异或)(按位异或)。a=5;就等价于:就等价于:a=a5;再比如:再比如:GPDR&=0 xff;我们将其展开:我们将其展开:GPDR=GPDR&(0 xff);GPDR=GPDR&0 x00;完成了对完成了对GPDR的清的清0。一个常用的操作是用一个常用的操作是用&来获取某个或者某来获取某个或者某些位。

38、些位。例如获取整数例如获取整数x中的低中的低4位可以写成位可以写成x&=0 x0F;x=x&0 x0F;也可以用也可以用|、&、等配合来设置和清除某位或等配合来设置和清除某位或者某些位。者某些位。例如例如:x&=0 x1;即:即:x=x&0 x1;/*清除清除x的最后一位的最后一位,即第即第0位位*/x&=(0 x15);即:即:x=x&(0 x15);/*清除清除x的低的低5位位*/x|=0 x1;即:即:x=x|0 x1;/*将最后一位将最后一位(即第即第0位位)设置为设置为1*/x|=(0 x16);即:即:x=x|(0 x16);/*将将x的第的第6位设置为位设置为1*/4.6.3寄存

39、器设置中的位运算寄存器设置中的位运算应用示例应用示例1.对寄存器的某位进行赋值的方法对寄存器的某位进行赋值的方法(1)仅对寄存器)仅对寄存器GPIOx的第的第n位赋位赋1值,其余值不变值,其余值不变GPIOx|=(1n);即:即:GPIOx=GPIOx|(1n);/*将将GPIOx的第的第n位设置为位设置为1*/(2)仅对寄存器)仅对寄存器GPIOx的第的第n位赋位赋0值,其余值不变值,其余值不变GPIOx&=(1n);即:即:GPIOx=GPIOx&(1n);/*GPIOx与第与第n位为位为0的数进的数进行行&运算,结果为运算,结果为0*/2.寄存器设置的应用示例寄存器设置的应用示例【例例4

40、-7】设在设在CortexA8微处理器微处理器GPIO端口端口的的GPC03、GPC04引脚各连接一个引脚各连接一个LED发光二极管,如图发光二极管,如图4.3所示。编写程序,通过所示。编写程序,通过对控制寄存器对控制寄存器GPC0CON和数据寄存器和数据寄存器GPC0DAT进行赋值操作,使进行赋值操作,使LED发光二极管发光二极管点亮或熄灭。点亮或熄灭。(1)将寄存器)将寄存器GPC0CON的地址定义为指针的地址定义为指针并赋值并赋值第一步:把第一步:把GPC0CON寄存器的地址定义为寄存器的地址定义为unsignedint类型的指针类型的指针unsignedint*GPC0CON=(uns

41、ignedint*)0 xE0200060;第二步:添加第二步:添加volatile,防止编译优化,防止编译优化为了防止在程序的编译过程中,编译器对数据进行优化而使为了防止在程序的编译过程中,编译器对数据进行优化而使数据发生更改,对指针变量添加数据发生更改,对指针变量添加volatile进行修饰。这样处进行修饰。这样处理后,编译器不再对该变量进行优化处理。理后,编译器不再对该变量进行优化处理。unsignedint*GPC0CON=*(volatileunsignedint*)0 xE0200060(2)设置寄存器)设置寄存器GPC0CON为输出模式为输出模式首先清除首先清除GPC0CON4、

42、GPC0CON3寄存器的内容。寄存器的内容。由于由于0 xff000的二进制数为:的二进制数为:00000000111111111111,因此,因此,不论不论GPC0CON4和和GPC0CON3中的值为多少(中的值为多少(GPC0CON4、GPC0CON3为二进制数中的第为二进制数中的第13第第20位数值),经位运算:位数值),经位运算:*GPC0CON&=0 xff000;之后,第之后,第13第第20位数位数(GPC0CON4、GPC0CON3)的值一定是的值一定是0。从而实现了清除从而实现了清除GPC0CON4、GPC0CON3寄存器中数据的目的。寄存器中数据的目的。再设置再设置GPC0C

43、ON4、GPC0CON3寄存器为输出模式。寄存器为输出模式。由于由于0 x11000的二进制数为:的二进制数为:00010001000000000000,经位运算:,经位运算:*GPC0CON|=0 x11000;之后,第之后,第13位及第位及第17位数位数(GPC0CON4和和GPC0CON3的个位的个位)的值的值一定是一定是1。从而将。从而将GPC0CON4、GPC0CON3寄存器设置为输出模寄存器设置为输出模式。式。(3)定义)定义GPC0DAT数据寄存器的地址为指针数据寄存器的地址为指针通过查看寄存器地址表(表通过查看寄存器地址表(表2.3)可知)可知,GPC0DAT的的地址为地址为0

44、 xE0200064,则定义则定义GPC0数据寄存器指针:数据寄存器指针:volatileunsignedint*GPC0DAT=(volatileunsignedint*)0 xE0200064;(4)设置)设置GPC0DAT数据寄存器的值,控制数据寄存器的值,控制LED发光二极管点亮或熄灭发光二极管点亮或熄灭GPC0DAT寄存器每一位对应一个寄存器每一位对应一个GPIO端口引脚,当该寄存器的某位设端口引脚,当该寄存器的某位设置为置为1时,则对应引脚输出高电平,该寄存器的某位设置为时,则对应引脚输出高电平,该寄存器的某位设置为0时,对应引时,对应引脚输出低电平。脚输出低电平。GPC0DAT寄

45、存器的初始值为寄存器的初始值为0 x00。通过位运算来设置寄存器的值,控。通过位运算来设置寄存器的值,控制制LED发光二极管的点亮及熄灭。发光二极管的点亮及熄灭。while(1)GPC0DAT&=(33);GPC0DAT|=i3;i+;if(i=4)i=0;/控制循环控制循环4次,再重复次,再重复控制控制LED的点亮及熄灭的循环过程如图所示。的点亮及熄灭的循环过程如图所示。本章小结本章小结本章是在嵌入式本章是在嵌入式Linux中进行程序设计的基中进行程序设计的基础,介绍了础,介绍了Gcc编译器的使用,虽然它的选编译器的使用,虽然它的选项较多,但掌握常用的一些选项即可。介项较多,但掌握常用的一些选项即可。介绍了绍了Make工程管理器的使用,这里包括工程管理器的使用,这里包括Makefile的基本结构、的基本结构、Makefile的变量定义的变量定义及其规则和及其规则和make命令的使用。还介绍了命令的使用。还介绍了autotools的使用,这在项目设计中是非常的使用,这在项目设计中是非常有用的工具。最后简单介绍了位运算。有用的工具。最后简单介绍了位运算。


注意事项

本文(嵌入式系统设计与应用课件(第3版)第4章 嵌入式Linux程序开发基础.ppt)为本站会员(bubibi)主动上传,文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文库网(点击联系客服),我们立即给予删除!




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

文库网用户QQ群:731843829  微博官方号:文库网官方   知乎号:文库网

Copyright© 2025 文库网 wenkunet.com 网站版权所有世界地图

经营许可证编号:粤ICP备2021046453号   营业执照商标

1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png