第3章嵌入式Linux编程基础ppt课件_第1页
第3章嵌入式Linux编程基础ppt课件_第2页
第3章嵌入式Linux编程基础ppt课件_第3页
第3章嵌入式Linux编程基础ppt课件_第4页
第3章嵌入式Linux编程基础ppt课件_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

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

文档简介

2020/4/28,.,1,第三章嵌入式Linux的开发环境及工具软件,3.1linux下的C语言编程3.2VI编辑器3.3GCC编译器3.4GDB调试器3.5Make工程管理器3.6linux下的集成开发环境,2020/4/28,.,2,3.1linux下的C语言编程,2.1.1inux下的C语言编程概述2.1.2linux下C语言开发流程,2020/4/28,.,3,3.1.1inux下的C语言编程概述,1.C语言概述(1)C是中级语言(2)C是结构化语言(3)C语言功能齐全(4)C语言可移植性好,2.Linux下C语言编程环境编辑器编译链接器调试器项目管理,2020/4/28,.,4,3.1.2linux下C语言开发流程,1.编写源代码2.编译源程序3.运行程序4.调试程序5.交叉编译6.编写Makefile,2020/4/28,.,5,1.编写源代码,启动linux后新建一个终端,在终端窗口中使用VI编辑器来编辑源程序,在命令行中输入命令:vihello.c,即可启动VI编辑器,rootJLUZHroot#vihello.c,2020/4/28,.,6,2.编译源程序,编译源程序的工具是GCC,在命令行输入“GCCohellohello.c”即可对hello.c源代码进行编译,2020/4/28,.,7,3.运行源程序,在命令行中输入“./hello”即可运行该程序,命令中的“.”表示当前目录,起指示路径的作用,表示运行当前目录下的hello程序。,2020/4/28,.,8,4.调试程序,调试是所有程序员都会面临的问题。当然,这不是必备的步骤,如果程序进一步复杂,就需要对程序进行调试,调试所用到的工具是GDB,GDB调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。,2020/4/28,.,9,5.交叉编译,嵌入式软件开发中往往是基于交叉编译环境的,开发是在宿主机中完成(本书中指x86架构的PC机),运行是在目标机(本书中指ARM架构的嵌入式产品)中。因此还需要交叉编译,通过基于ARM架构的GCC编译器将源程序编译成嵌入式产品中的可执行程序。,2020/4/28,.,10,2020/4/28,.,11,6.编写Makefile,Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。,2020/4/28,.,12,3.2VI编辑器,2.2.1VI的模式2.2.2VI常用操作,2020/4/28,.,13,3.2.1Vi的模式,1.命令模式2.编辑模式3.底行模式4.三种模式之间的切换,2020/4/28,.,14,1.命令模式,通常进入VI后默认处于命令模式,在此模式下各种键盘的输入都是作为命令来执行,命令模式下主要的操作包括:移动光标、复制文本、删除文本、找出行数等命令,rootJLUZHroot#vim,2020/4/28,.,15,2.编辑模式,进入vi时,默认的模式是命令行模式,而要进入编辑模式输入数据时,可以用下列按键:按“a”键从目前光标所在位置的下一个字符开始输入。按“i”键从光标所在位置开始插入新输入的字符。按“o”键新增加一行,并将光标移到下一行的开头。,2020/4/28,.,16,3.底行模式,vi的底行模式是指可以在界面最底部的一行显示输入命令,一般用来执行查找特定的字符串、保存及退出等任务。按“shift”+“:”则进入底行模式。在命令行模式下输入冒号“:”,就可以进入底行模式,2020/4/28,.,17,4.三种模式之间的切换,进入vi时,默认的模式是命令行模式,按“i”进入编辑模式,编辑模式下按“ESC”则退到命令行模式,按“shift”+“:”则进入底行模式。,2020/4/28,.,18,3.2.2VI常用操作,1.启动与退出vi2.命令行模式的操作3.底行模式的操作4.常见问题及解决办法,2020/4/28,.,19,1.启动与退出vi,(1)在Linux提示符下键入vi(或使用“vi文件名”来编辑已经存在的文件)即可启动它。(2)要退出vi,先按下Esc键回到命令行模式,然后键入“:”,此时光标会停留在最下面一行,再键入“q”,最后按下Enter键即可。,2020/4/28,.,20,2.命令行模式的操作,(1)移动光标(2)复制文本(3)删除文本(4)找出行数及其他按键,2020/4/28,.,21,(1)移动光标,2020/4/28,.,22,(2)复制文本,2020/4/28,.,23,(3)删除文本,2020/4/28,.,24,(4)找出行数及其他按键,2020/4/28,.,25,3.底行模式的操作,在命令行模式下输入冒号“:”,就可以进入底行模式了,还可以使用“?”和“/”键进入最后行模式。比起命令行模式的诸多操作命令,底行模式的操作命令就少多了,2020/4/28,.,26,2020/4/28,.,27,4.常见问题及解决办法,(1)插入编辑方式和命令方式切换时出现混乱这种情况产生的原因通常是:还未输入插入命令便开始进行文本输入,从而无法在正确位置输入文本;另外,当插入信息后,还未按Esc键结束插入方式,就又输入其他的命令信息,从而使命令无法执行。当出现这种情况时,首先要确定自己所处的操作方式,然后再确定下一步做什么工作。若不易搞清楚当前所处的状态,还可以使用Esc键退回到命令方式重新进行输入。,2020/4/28,.,28,(2)在进行文档编辑时,vi编辑器会产生混乱这种状态的产生往往是由于屏幕刷新有误,此时可以使用Ctrll键对屏幕进行刷新,如果是在终端,可以用Ctrlr进行屏幕刷新。,2020/4/28,.,29,(3)对屏幕中显示的信息进行操作时,系统没有反应。出现这种情况可能是由于屏幕的多个进程被挂起(如不慎用了Ctrls键等),此时可用Ctrlq进行解脱,然后重新进行输入。,2020/4/28,.,30,(4)当编辑完成后,不能正确退出vi出现这种情况的原因可能是系统出现了意外情况。如:文件属性为只读、用户对编辑的文件没有写的权限。如果强行执行退出命令“:w!”仍无法退出,可以用“:wnewfile”命令将文件重新存盘后再退出,以减少工作中的损失,这个新文件newfile应是用户有写权限的文件。如果暂时没有可以使用的文件,可以借用/tmp目录建一个新的文件。因为Linux系统中的/tmp是一个临时目录,系统启动时总要刷新该目录,因此操作系统一般情况下不对此目录下进行保护。但当处理完成后,切记应将新文件进行转储,否则依然会造成信息损失。,2020/4/28,.,31,(5)在使用vi时,万一发生了系统掉电或者突然当机的情况怎么办?工作时发生了掉电和关机,对正做的工作无疑是一种损失,但是Vi程序可使损失降到最小。因为,对Vi的操作实际上是对编辑缓冲区的数据操作,而系统经常会将缓冲区的内容自动进行保存。因此,关机后用户可以在下次登陆系统后使用-r选项进入vi,将系统中最后保存的内容恢复出来。例如,在编辑cd文件的时候突然断电或者系统崩溃后的恢复命令为:rootJLUZHroot#vicd-r,2020/4/28,.,32,3.3GCC编译器,2.3.1GCC编译器简介2.3.2GCC编译流程2.3.3GCC常用编译选项2.3.4库依赖,2020/4/28,.,33,2.3.1GCC编译器简介,Linux下最常用的C语言编译器是gcc(GNUCompilerCollection),它是GNU项目中符合ANSIC标准的编译系统,能够编译用C、C+和ObjectC等语言。gcc不仅功能十分强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等。Gcc是一个交叉平台编译器,可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比,平均效率要高20%30%。,2020/4/28,.,34,Gcc所支持后缀名,2020/4/28,.,35,3.3.2GCC编译流程,gcc编译程序时,编译过程可以细分为个阶段:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking),2020/4/28,.,36,Gcc指令的一般格式为:,Gcc选项要编译的文件选项目标文件gcchello.c-ohello其中,目标文件可缺省,Gcc默认生成可执行的文件,命名为:编译文件.out。命令行中gcc表示用gcc来编译源程序,-o选项表示要求编译器输出的可执行文件名为hello,而hello.c是源程序文件。,2020/4/28,.,37,编译过程:结合例子说明,#includeintmain()printf(HelloLinuxn);return0;,rootJLUZHroot#gcchello.c-ohellorootJLUZHroot#./helloHelloLinux,可以使用如下命令一步到位:,2020/4/28,.,38,1.预处理阶段,在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc在预处理结束后停止编译过程。,rootJLUZHroot#Gcc-Ehello.c-ohello.i,hello.i文件的部分内容:,2020/4/28,.,39,#1hello.c#1#1hello.c#790/usr/include/stdio.h34#829/usr/include/stdio.h234externintftrylockfile(FILE*_stream)_attribute_(_nothrow_);externvoidfunlockfile(FILE*_stream)_attribute_(_nothrow_);#918/usr/include/stdio.h34#2hello.c2intmain()printf(HelloLinuxn);return0;,2020/4/28,.,40,2.编译阶段,编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。,rootJLUZHroot#Gcc-Shello.i-ohello.s,2020/4/28,.,41,hello.s的内容,1.filhello.c2.section.rodata3.LC0:4.stringHelloLinux5.text6.globlmain7.typemain,function8.main:9.pushl%ebp10.movl%esp,%ebp11.andl$-16,%esp,2020/4/28,.,42,12.subl$16,%esp13.movl$.LC0,(%esp)14.callputs15.movl$0,%eax16.leave17.ret18.sizemain,.-main19.identGCC:(GNU)4.4.020090506(RedHat4.4.0-4)20.section.note.GNU-stack,progbits,2020/4/28,.,43,3.汇编阶段,使用选项“-c”,将汇编代码已转化为“.o”的二进制目标代码,rootJLUZHroot#Gcc-chello.s-ohello.o,2020/4/28,.,44,4.链接阶段,在成功编译之后,就进入了链接阶段。完成了链接之后,Gcc就可以生成可执行文件,rootJLUZHroot#Gcchello.oohello,rootJLUZHroot#./helloHelloLinux,2020/4/28,.,45,3.3.3GCC常用编译选项,Gcc有超过100个的可用选项,主要包括:总体选项告警和出错选项优化选项体系结构相关选项,2020/4/28,.,46,1.总体选项,2020/4/28,.,47,2.告警和出错选项:,2020/4/28,.,48,3.体系结构相关选项,2020/4/28,.,49,常用选项的例子,实例3-3-1#includevoidmain()longlongtmp=1;printf(Thisisabadcode!n);return0;,2020/4/28,.,50,该段程序有何问题?,main函数的返回值被声明为void,但实际上应该是int;使用了GNU语法扩展,即使用longlong来声明64位整数,仍不符合ANSI/ISOC语言标准;main函数在无返回值的函数中调用return语句返回值。,2020/4/28,.,51,编译运行,rootJLUZHGcc#Gcc-pedanticwarning.c-owarningwarning.c:在函数“main”中;warning.c:5警告:ISOC90不支持“longlong”warning.c:7警告:在无返回值的函数中,“return”带返回值warning.c:4警告:“main”的返回类型不是“int”,2020/4/28,.,52,-pedantic选项能够帮助程序员发现一些不符合ANSI/ISOC标准的代码,但不是全部。事实上只有ANSI/ISOC语言标准中要求进行编译器诊断的那些问题才有可能被gcc发现并提出警告。除了-pedantic之外,gcc还有一些其他编译选项也能够产生有用的警告信息。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使gcc产生尽可能多的警告信息。该选项的运行结果如下所示:,2020/4/28,.,53,rootJLUZHGcc#Gcc-Wallwarning.c-owarningwarning.c:4警告:“main”的返回类型不是“int”warning.c:在函数“main”中;warning.c:7警告:在无返回值的函数中,“return”带返回值warning.c:5警告:未使用的变量“tmp”,2020/4/28,.,54,3.3.4库依赖,在Linux下使用C语言开发应用程序时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so或者.a)的集合。虽然Linux下大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并不是所有的情况都是这样。,2020/4/28,.,55,gcc采用搜索目录的办法来查找所需要的文件,-I选项可以向gcc的头文件搜索路径中添加新的目录。例如,如果在/home/david/include/目录下有编译时所需要的头文件,为了让gcc能够顺利地找到它们,就可以使用-I选项:,rootJLUZHroot#gccdavid.c-I/home/david/include-odavid,rootJLUZHroot#gccdavid.c-L/home/david/libldavid-odavid,2020/4/28,.,56,-l选项,它指示gcc去连接库文件david.so。Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头。由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库文件名时可以省去lib三个字母。也就是说gcc在对-ldavid进行处理时,会自动去链接名为libdavid.so的文件。,2020/4/28,.,57,3.4GDB调试器,3.4.1GDB概述3.4.2GDB使用流程3.4.3GDB基本命令3.4.4Gdbserver远程调试,2020/4/28,.,58,3.4.1GDB概述,gdb是GNU开发组织发布的一个强大的UNIX/Linux下的程序调试工具。一般来说,gdb主要帮助用户完成下面4个方面的功能:启动程序,可以按照用户自定义的要求随心所欲的运行程序。可让被调试的程序在用户所指定的调试的断点处停住(断点可以是条件表达式)。当程序停住时,可以检查此时程序中所发生的事。动态地改变程序的执行环境。,2020/4/28,.,59,3.4.2G

温馨提示

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

评论

0/150

提交评论