嵌入式系统设计与开发第3章 Linux编程基础_第1页
嵌入式系统设计与开发第3章 Linux编程基础_第2页
嵌入式系统设计与开发第3章 Linux编程基础_第3页
嵌入式系统设计与开发第3章 Linux编程基础_第4页
嵌入式系统设计与开发第3章 Linux编程基础_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

主讲:油海东院系:信息学院通信教研室302专业:通信07,信工07,电信07,计本07,嵌入式系统设计与开发,第3章LINUX下的C编程基础,1.Linux下C语言编程概述,2.LINUX下C语言编辑器的使用,3.GCC编译器的使用,4.Gdb调试器的使用,C语言回顾,BELL实验室、DennisRitchie在B语言的基础上发展起来的。87年,ANSI美国国家标准协会,制定了ANSIC标准,规范了与硬件的无关性C语言是中级语言C语言是结构化的语言C语言是功能强大的语言C语言是可移植性很强的语言,LINUX下C语言编程环境,源代码*.c,预处理器,编译器,汇编处理,目标代码*.o,链接,可执行文件,引导代码,头文件,库函数,编辑器,类似于WINDOWS下的记事本,完成程序文本的录入工作,LINUX下常用的编辑器有Vi,Emacs,编译链接器,源代码生成可执行代码的过程编译链接过程非常复杂词法、语法、语义分析中间代码的生成和优化符号表的管理出错处理Linux下常用的编译器是GCC编译器,调试器,方便程序员调试程序的工具LINUX下常用的调试器Gdb,项目管理器,类似与VC中的“工程”,对源代码进行合理有效的组织LINUX下的项目管理器是Make,第5章LINUX下的C编程基础,1.Linux下C语言编程概述,2.LINUX下C语言编辑器的使用,3.GCC编译器的使用,4.Gdb调试器的使用,启动vi,建立一个名字为test.txt文件,使用命令行启动viroottestroot#vitest.txt,Vi启动画面,Vi的模式,Vi的模式有三种:一般模式、编辑模式、命令模式一般模式:以vi处理一个文件的时候,一进入该档案就是一般模式了。在这个模式中,可以使用“上下左右”按键来移动光标,您可以使用“删除字符”或“删除整行”来处理档案内容,也可以使用“复制、粘贴”来处理文件数据。,Vi的模式,编辑模式:在一般模式中可以处理删除、复制、贴上等动作,但是却无法编辑。按下“i,I,o,O,a,A,r,R”字母之后才会进入编辑模式。注意:在Linux中,按下上述的字母时,在画面的左下方会出现“INSERT或REPLACE”的字样,才可以输入文本按下“Esc”键即可退出编辑模式,回到一般模式。,Vi的模式,命令模式:在一般模式当中,输入“:或/“就可以将光标移动到最底下那一行。在这个模式当中,可以提供您”搜寻资料“的动作,而读取、存盘、大量取代字符、离开vi、显示行号等等的动作则是在此模式中实现的。,模式转换图,例子,1.Vitest.txt。启动vi,进入一般模式,例子,2.按下i,进入编辑模式,开始输入文字,例子,3.按下ESC按钮回到一般模式;编辑完毕后,按下Esc键,回到一般模式画面左下角的INSERT消失。,例子,4.在一般模式中按下“:wq”储存后离开vi!,命令内容说明,命令内容说明,命令内容说明,命令内容说明,命令内容说明,命令内容说明,第5章LINUX下的C编程基础,1.Linux下C语言编程概述,2.LINUX下C语言编辑器的使用,3.GCC编译器的使用,4.Gdb调试器的使用,什么是GCC,早期:GCC-GNUCComplier现在:GCC-GNUComplierCollectionGNU推出的功能强大、优秀的跨平台编译器支持主流的CPU平台,完成从源程序向特定CPU硬件平台上目标代码的转换。,GCC所支持的源程序,GCC工具链,GCC是一组编译工具的总称,包括C编译器:cc,ccl,cclplus,gccgcc+编译器:c+,cclplus,g+源码预处理器:cpp,cpp0库文件:libgcc.a,libgcc_eh.a,libgcc_s.so,libiberty.a,libstdc+.a,so,libsupc+.a,GCC工作过程,GCC将C源程序、C+源程序、汇编程序等编译、链接成可执行程序,分为4步:预处理(Pre-processing):调用cpp命令,分析源代码中的各种伪指令,如#include,#define编译(Compiling):预处理结束,调用ccl命令进行编译,将预处理后的源代码解释为汇编语言汇编(Assembling):调用as命令,把汇编程序会变成目标代码链接(Linking):调用ld命令,把目标代码按照链接规则(链接脚本)链接起来,形成可执行文件,链接过程中,可使用系统中的标准函数、函数库,链接是个什么过程?,可执行文件,GCC经过上述4步,最终形成可执行程序,可执行文件没有统一的后缀名。根据文件属性来区分该文件是否能被执行。默认可执行文件为.elf(executivelinkedfile)格式,elf格式由若干段(section)组成,如果没有特别指明,由标准c源代码生成的目标文件中包含以下段:.text(正文段)包含程序的指令代码,.data(数据段)包含固定的数据,如常量,字符串等,.bss(未初始化数据段)包含未初始化的变量和数组等。如果GCC编译时没有明确给出输出文件名,则系统自动生成一个a.out的可执行文件。,GCC的用法,GCC是linux/UNIX下基于命令行的编译器。语法:gcc选项要编译的文件选项目标文件,目标文件可以缺省,默认生成的可执行文件命名为:编译文件.outoptions:编译时需要的选项(100个可用),总体选项告警选项优化选项体系结构相关选项选项由-和字母组成,如-c、-o等。,GCC总体选项列表,告警和出错选项列表,体系结构相关选项,GCC常用编译选项-1,-c:对源程序进行预处理、编译、汇编,生成目标文件(.o),并不链接生成可执行程序。常用于编译子程序。gccctest1.c,生成test1.o-ooutput_filename:指明输出的可执行文件的名称。在没有指明编译选项时,生成a.out可执行文件。gccotesttest.c,生成可执行文件testgcctest.c,生成可执行文件a.out,GCC常用编译选项-2,-g:如果需要对源代码进行调试,必须使用该参数,这时gcc为gdb调试工具加入必要的调试信息-O:在编译、链接过程中对源代码进行优化,付出的代价是编译、链接过程较慢。-O2:比-O更好的优化编译、链接。-S:生成一个后缀为.s的汇编文件-E:对源代码只进行预处理,预处理结果送到标准输出。-v:输出GCC的版本信息,GCC常用编译选项-3,-I:将指定的目录加入到程序头文件目录列表中。预编译过程中使用。默认头文件路径:/usr/include/头文件不在上述目录下,使用该选项gccI/home/includeotesttest1.c-L:将指定的目录加入到程序函数档案库文件目录列表中。链接过程中使用。默认库文件路径:/usr/lib/gccL/home/zxq/liblappotesttest1.c,链接使用liblap库。Linux下库文件均以lib开头,GCC常用编译选项-4,-lname:连接时,装载名字为libname.a的函数库。gccfile1.cfile2.clmofile,整个程序由file1和file2构成,连接时使用到了libm.a函数库,使用-o选项生成可执行文件file作为交叉开发工具使用时,需要根据具体使用的cpu类型,使用具体的GCC编译器,如使用ARM,在gcc编译时,使用如下指令:arm-elf-gccgofilefile.c,错误及告警选项,-w:禁止输出告警信息-Werror:将所有告警转换为错误-Wall:显示所有告警信息,GCC的错误类型及对策,C语法错误,错误信息:syntexerror头文件错误,错误信息:cannotfindincludefile,头文件名错、指定头文件所在目录错,和”用法错档案库错,错误信息:NosuchfileorDirectory,函数库名错,指定函数库所在目录错。未定义符号,错误信息:Undefinedsymbol,举例,1.使用vi编辑器编写C源程序如下#includeintmain()printf(hello!thisisourembededworld!n);return0;,举例,2.预处理阶段gccEhello.cohello.i,得到预处理后的C源程序,以下为hello.i文件的部分内容。把stdio.h中内容插入到了hello.i,举例,3.编译阶段:检查代码有无语法错误,检查无误后,把代码翻译成汇编语言,使用-S选项查看,该选项只编译,不汇编。gccShello.iohello.s以下为hello.s的部分内容,举例,4.汇编阶段:把编译阶段生成的汇编程序.s转成目标文件,使用-c选项,可以把汇编程序转换成2进制代码.ogccchello.sohello.o,以下为hello.o的部分内容,举例,5.链接阶段:有个重要概念:函数库。程序中没有定义printf函数,stdio.h中也只是printf的声明,printf在哪里呢?事实上,该函数的实现在名字为libc.so.6的库文件当中,该库文件在/usr/lib目录下,没有特别指定,gcc会自动到该目录下搜索库文件。该库是动态库。gcchello.oohello运行生成的可执行文件./hello,注意,执行该文件时,应指明该文件的目录“./”,为什么?得到结果hello!,thisisourembededworld!,观看视频GCC的使用,直接生成可执行程序,在使用GCC时,不必一定要按照以上几步一一来做,有了源程序之后,如果源程序没有错误,使用GCC,一步就可以生成可执行程序gcchello.cohello,出错信息选项,如下程序#includevoidmain()longlongtmp=1;printf(“thisisabadcode!n”);return0;该程序有哪些错误?,使用-ansi选项编译有问题程序,该选项强制GCC生成标准语法所要求的告警信息gccansiwarning.cowarning警告信息如下:warning.c:在函数main中:warning.c:7警告:在无返回值的函数中,“return”带返回值warning.c:4警告:“main”的返回类型不是int没有发现longlong这个无效的数据类型。,使用-pedantic选项,gccpedanticwarning.cowarning告警信息如下:warning.c:在函数main中:warning.c:5警告:ISOC90不支持”longlong”warning.c:7警告:在无返回值的函数中,”return”带返回值warning.c:4警告:“main”的返回类型不是”int”,使用-Wall选项,允许发出gcc能够提供的所有有用的报警信息。gccWallwarning.cowarning警告信息如下:warning.c:4警告:“main”的返回类型不是”int”warning.c:在函数main中:warning.c:5警告:未使用变量tmp。warning.c:7警告:在无返回值的函数中,”return”带返回值,第5章LINUX下的C编程基础,1.Linux下C语言编程概述,2.LINUX下C语言编辑器的使用,3.GCC编译器的使用,4.Gdb调试器的使用,调试时想得到的信息,程序是运行到哪个语句或者表达式就发生了错误?如果错误是在执行一个函数的时候出现的,那么是程序的哪一行包含了这个函数的调用语句,在调用该函数的时候传递的实参是什么?在程序执行到某处时,所关心的某一个变量值为多少?某个表达式最终运行的结果为何值?,什么是调试器,调试器能够完成上述目标。它是一个能够运行其他程序的应用程序。调试器能够进入到程序源码中允许开发者进行逐行单步运行了解程序代码执行顺序,和每条语句执行的结果,可以在程序运行的同时,查看甚至是改变任一变量值。在程序运行出错时,为程序开发者提供程序运行时的详细细节,找到出错的原因。,GDB调试器,GDB(GNUDebugger)是GNU开发的一款调试器,在Linux/UNIX编程调试中应用广泛要想使用GDB对程序进行调试,必须在对源码进行编译的时候,使用-g编译选项开关用了-g选项后,程序在编译的时候就会包含调试信息描述了每个函数或变量的数据类型源码行号和可执行代码地址间对应关系在shell提示符下,gdbfilename,即可进入对filename文件(可执行)的调试,这时,shell提示符号变成(gdb),gdb使用流程-编辑源程序,/*gdbtest.c*/#includeintsum(intm);intmain()inti,n=0;sum(50);for(i=1;i=50;i+)n+=i;printf(thesumof1-50is%dn,n);intsum(intm)inti,n=0;for(i=1;i=m;i+)n+=i;printf(thesumof1-mis%dn,n);,使用-g选项编译源程序,gdb调试的不是.c的源代码文件,而是可执行文件,因此要调试一个文件,应该先使用gcc工具编译成可执行文件。如果想使用gdb对程序进行调试,那么在使用gcc对程序进行编译时,一定要使用-g选项gccggdbtest.cogdbtest提示符下键入“gdbfilename”命令,进入gdb调试环境gdbgdbtest在gdb的启动画面中出现gdb的版本号、使用的库文件等信息,然后进入到由”(gdb)”开头的命令行界面。,常用命令,1.查看文件,键入”l”(list),在列出的源代码中,给出了行号2.设置断点,键入“b行号”,注意:利用行号设置的断点,代码运行到该行之前停止。3.查看断点情况,infob4.运行代码,输入“r”(run)5.查看变量值,输入”p变量名”。在GDB显示变量值时会在相应值之前加上”$N”标记,它是当前变量值的引用标记。6.单步运行,使用n(next)或s(step),遇到函数调用时,s会进入到函数内部,n不会进入。7.恢复程序运行,使用c(continue)8.退出,q(quit),GDB中程序的3种状态

温馨提示

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

评论

0/150

提交评论