嵌入式Linux应用开发教程 第二章嵌入式linux C语言开发工具新_第1页
嵌入式Linux应用开发教程 第二章嵌入式linux C语言开发工具新_第2页
嵌入式Linux应用开发教程 第二章嵌入式linux C语言开发工具新_第3页
嵌入式Linux应用开发教程 第二章嵌入式linux C语言开发工具新_第4页
嵌入式Linux应用开发教程 第二章嵌入式linux C语言开发工具新_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式应用程序设计

第二章嵌入式LinuxC语言程序开发工具

嵌入式Linux下C语言概述2.2编辑器vim2.3编译器gcc2.4调试器GDB2.5make工程管理器2.6autotools小结2.9思考与练习本章课程:2023/1/122嵌入式Linux下C语言概述C语言最早是由贝尔实验室的DennisRitchie为了UNIX的辅助开发而编写的,它是在B语言的基础上开发出来的。尽管C语言不是专门针对UNIX操作系统或机器编写的,但它与UNIX系统的关系十分紧密。由于它的硬件无关性和可移植性,使C语言逐渐成为世界上使用最广泛计算机语言。2023/1/1232.1嵌入式Linux下C语言概述C语言有如下特点:C语言是“中级语言”。它把高级语言的基本结构和语句与低级语言的实用性结合起来。

C语言是结构化的语言。

C语言功能齐全。

C语言可移植性强。2023/1/124嵌入式Linux下C语言概述编辑器常用的编辑器有vi(vim)和Emacs编译链接器常用的编译器是GCC编译器调试器GDB项目管理器项目管理器make2023/1/1252.2编辑器vim2.2.1vi的基本模式2.2.2vi的基本操作2023/1/1262.2.1vi的基本模式标准模式(Normalmode)通常进入vim后默认处于标准模式(或者称为命令模式)。在此模式下任何键盘的输入都是作为命令来对待。命令的输入通常是不回显的,只显示执行的结果。插入模式(InsertMode)用户只有在插入模式下才可以进行字符输入,用户按[Esc]键可回到命令行模式下。命令行模式(Command-linemode)在此模式下,用户可以将文件保存或退出vim,也可以设置编辑环境,如寻找字符串、列出行号等。可视模式(Visualmode)在此模式下,通过移动光标选择文本,选中的文本将反白显示,这样提供高效、直观的编辑功能。用户按下ESC键可回到命令行模式。2023/1/1272.2.2vi的基本操作1.vim的进入、保存和退出进入vim可以直接在命令终端下键入vim<文件名>,vim可以自动载入所要编辑的文件或是开启一个新的文件。如在shell中键入vim(新建文件)则可进入vim环境。进入vi后屏幕左方会出现波浪符号,凡是具有该符号就代表此列目前是空的。此时进入的是命令行模式。要退出vim可以在命令行模式下键入“:q”(不保存并退出)或“:q!”(不保存并强制退出)或“:wq”(保存并退出)指令则是保存之后再离开(注意冒号)。2023/1/1282.2.2vi的基本操作命令类别命令说明编辑:efilename编辑文件名为filename的文件。若这个文件不存在,则会开启一个名为filename的新文件的编辑保存:w保存文件,文件应已有名字:wfilename以文件名filename保存文件退出:q退出,如果文件已修改则不能退出:q!不保存强行推出,无论文件是否被修改:wq保存后退出2023/1/1292.2.2vi的基本操作2.光标的移动除了使用标准光标键移动光标之外,vim还提供了很多复杂的光标移动方式。命令类别命令说明基本操作h,j,k,l分别等同于左方向键、下方向键、上方向键、右方向健字操作w移至下一个单词的字首e移至下一个单词的字尾b移至上一个单词的字首行操作0移至行首$移至行尾G移至文件尾部gg移至文件首部H移至当前屏幕顶部M移至当前屏幕中间行的行首L移至当前屏幕底部最后一行的行首n-向上移动n行n+向下移动n行nG移至第n行页操作Ctrl+f屏幕往“上”翻动一页,等同于PageUpCtrl+b屏幕往“下”翻动一页,等同于PageDownCtrl+u屏幕往“上”翻动半页Ctrl+d屏幕往“下”翻动半页2023/1/12102.2.2vi的基本操作3.文本编辑文本编辑包括输入、修改、复制、粘贴、删除(可以用Del键和Backspace键)和恢复等操作。命令类别命令说明修改r修改光标所在的字符,键入r后直接键入待修改字符R进入取代状态,在光标所指定的位置修改字符,该替代状态直到按下ESC键才结束复制yy复制光标所在行nyy复制光标所在行开始的n行,如3yy表示复制三行y^复制光标至行首y$复制光标至行尾yw复制一个字(单词)yG复制光标文件尾y1G复制光标文件首粘贴p粘贴至光标后P粘贴至光标前删除x删除光标所在位置的一个字符X删除光标所在位置的前一个字符s删除光标所在的字符,并进入输入模式S删除光标所在的行,并进入输入模式dd删除光标所在的行ndd从光标所在行开始向下删除n行D删除至行尾,等同于d$dG删除至文件尾部d1G删除至文件首部,等同于dgg恢复u撤销上一步的操作。可以多次撤销U在光标离开之前,恢复所有的编辑操作Ctrl+r返回至撤销操作之前的状态2023/1/12112.2.2vi的基本操作4.查找与替换vim的查找和替换功能都支持正则表达式,可以匹配非常复杂的关键字,功能非常强大。类别命令说明查找/<要查找的字符>向下查找要查找的字符?<要查找的字符>向上查找要查找的字符n继续查找N反向查找替换:[range]s/pattern/string/[c,e,g,i]range:指定查找的范围。例如1,$指替换范围从第0行到最后一行;s:指转入替换模式;pattern:指要被替换的字符串,可以用正则表达式;string:指替换的字符串;c:每次替换前询问;e:不显示错误;g:强制整行替换;i:不区分大小写2023/1/12122.3编译器gcc

2.3.1GCC的简介2.3.2GCC的编译流程2.3.3GCC的常用编译选项2023/1/12132.3.1GCC的简介GNUCC(简称为gcc)是GNU项目中符合ANSIC标准的编译系统,能够编译用C、C++和ObjectC等语言编写的程序。gcc不仅功能强大,而且可以编译如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且gcc又是一个交叉平台编译器,支持的硬件平台很多,如alpha、arm、avr、hppa、i386、m68k、mips、powerpc、sparc、vxworks、x86_64、MSWindows、OS/2等等。它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。2023/1/12142.3.1GCC的简介gcc的编译流程分为了4个步骤,分别为:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)后缀名所对应的语言编译流程.cC原始程序预处理、编译、汇编.C/.cc/.cxxC++原始程序预处理、编译、汇编.mObjective-C原始程序预处理、编译、汇编.i已经过预处理的C原始程序编译、汇编.ii已经过预处理的C++原始程序编译、汇编.s/.S汇编语言原始程序汇编.h预处理文件(头文件)(不常出现在指令行).o目标文件链接.a/.so编译后的库文件链接2023/1/12152.3.1GCC的简介GCC使用的基本语法为:

gcc[option|filename]2023/1/12162.3.2GCC的编译流程预处理阶段处理的主要作用是通过预处理的内建功能对一些可预处理资源进行等价替换,最常见的可预处理资源有:文件包含、条件编译、布局控制和宏处理等。gcc的选项“-E”可以使编译器在预处理结束时就停止编译,选项“-o”是指定GCC输出的结果,其命令格式为如下所示。gcc–E–o[目标文件][编译文件]例如:$gcc–E–o2023/1/12172.3.2GCC的编译流程编译阶段编译器在预处理结束之后,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,就开始把代码翻译成汇编语言,gcc的选项“-S”能使编译器在进行汇编之前就停止。由表可知,“.s”是汇编语言原始程序,因此,此处的目标文件就可设为“.s”类型。$gcc–S–o2023/1/12182.3.2GCC的编译流程汇编阶段汇编阶段是把编译阶段生成的“.s”文件生成目标文件,读者在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。如下所示。$gcc–c–o2023/1/12192.3.2GCC的编译流程链接阶段。完成了链接之后,gcc就可以生成可执行文件,其命令如下所示。$gcc–ohello运行该可执行文件,出现正确的结果。$./hellohello,embeddedworld2023/1/12202.3.3gcc的常用编译选项gcc有超过100个的可用选项,包括总体选项、警告和出错选项、优化选项和体系结构等相关选项。(1)常用选项选项含义-c只编译汇编不链接,生成目标文件“.o”-S只编译不汇编,生成汇编代码-E只进行预编译,不做其他处理-g在可执行程序中包含标准调试信息-ofile将file文件指定为输出文件-v打印出编译器内部编译各过程的命令行信息和编译器的版本-Idir在头文件的搜索路径列表中添加dir目录2023/1/12212.3.3gcc的常用编译选项(2)库相关选项选项含义-static进行静态编译,即链接静态库,禁止链接动态库-shared1.可以生成动态库文件2.进行动态编译,尽可能地链接动态库,只有当没有动态库时才会链接同名的静态库(默认选项,即可省略)-Ldir在库文件的搜索路径列表中添加dir目录-lname链接称为libname.a(静态库)或者libname.so(动态库)的库文件。若两个库都存在,则根据编译方式(-static还是-shared)而进行链接-fPIC(或-fpic)生成使用相对地址的位置无关的目标代码(PositionIndependentCode)。然后通常使用gcc的-static选项从该PIC目标文件生成动态库文件。2023/1/12222.3.3gcc的常用编译选项(3)警告和出错选项选项含义-ansi支持符合ANSI标准的C程序-pedantic允许发出ANSIC标准所列的全部警告信息-pedantic-error允许发出ANSIC标准所列的全部错误信息-w关闭所有警告信息-Wall允许发出gcc提供的所有有用的报警信息-werror把所有的警告信息转化为错误信息,并在警告发生时终止编译过程2023/1/12232.3.3gcc的常用编译选项(4)优化选项gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的gcc来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或32023/1/12242.3.3gcc的常用编译选项(5)体系结构相关选项选项含义-mcpu=type针对不同的CPU使用相应的CPU指令。可选择的type有i386、i486、pentium及i686等-mieee-fp使用IEEE标准进行浮点数的比较-mno-ieee-fp不使用IEEE标准进行浮点数的比较-msoft-float输出包含浮点库调用的目标代码-mshort把int类型作为16位处理,相当于shortint-mrtd强行将函数参数个数固定的函数用retNUM返回,节省调用函数的一条指令2023/1/12252.4调试器GDBGDB是GNU开源组织发布的一个强大的Linux下的程序调试工具,它是一种强大的命令行调试工具。一个合格的调试器需要有以下几项基本功能。能够运行程序,设置所有能影响程序运行的参数。能够让程序让指定的条件下停止。能够在程序停止时检查所有参数的情况。能够根据指定条件改变程序的运行。2023/1/12262.4.1gdb使用流程进入GDB——gdbtest查看文件——l设置断点——b6查看断点处情况——infob运行代码——r查看变量值——pn/pi单步运行——n恢复程序运行——c观察变量——watchn

退出GDB

——q2023/1/12272.4.2gdb基本命令1.工作环境相关命令命令格式含义setargs运行时的参数指定运行时参数,如setargs2showargs查看设置好的运行参数pathdir设定程序的运行路径showpaths查看程序的运行路径setenvironmentvar[=value]设置环境变量showenvironment[var]查看环境变量cddir进入到dir目录,相当于shell中的cd命令pwd显示当前工作目录shellcommand运行shell的command命令2023/1/12282.4.2gdb基本命令2.设置断点与恢复命令命令格式含义infob查看所设断点break[文件名:]行号或函数名<条件表达式>设置断点tbreak[文件名:]行号或函数名<条件表达式>设置临时断点,到达后被自动删除delete[断点号]删除指定断点,其断点号为“infob”中的第一栏。若缺省断点号则删除所有断点disable[断点号]停止指定断点,使用“infob”仍能查看此断点。同delete一样,若缺省断点号则停止所有断点enable[断点号]激活指定断点,即激活被disable停止的断点condition[断点号]<条件表达式>修改对应断点的条件ignore[断点号]<num>在程序执行中,忽略对应断点num次step单步恢复程序运行,且进入函数调用next单步恢复程序运行,但不进入函数调用finish运行程序,直到当前函数完成返回c继续执行函数,直到函数结束或遇到新的断点2023/1/12292.4.2gdb基本命令3.gdb中源码查看相关命令命令格式含义list<行号>|<函数名>查看指定位置代码file[文件名]加载指定文件forward-search正则表达式源代码的前向搜索reverse-search正则表达式源代码的后向搜索dirDIR将路径DIR添加到源文件搜索的路径的开头showdirectories显示源文件的当前搜索路径infoline显示加载到gdb内存中的代码2023/1/12302.4.2gdb基本命令4.gdb中查看运行数据相关命令命令格式含义print表达式|变量查看程序运行时对应表达式和变量的值x<n/f/u>查看内存变量内容。其中n为整数表示显示内存的长度,f表示显示的格式,u表示从当前地址往后请求显示的字节数display表达式设定在单步运行或其他情况中,自动显示的对应表达式的内容backtrace或bt查看当前栈侦的情况,即可以查到哪些被调用的函数尚未返回。framen打印第n个栈侦inforeg/stack查看寄存器/堆栈使用情况up调到上一层函数,即上移栈帧down与up相对,即下移栈帧2023/1/12312.4.2gdb基本命令5.gdb中修改运行参数相关命令gdb还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set变量=设定值”。2023/1/12322.4.3gdbserver远程调试在嵌入式系统开发中,我们经常通过使用交叉调试工具实现远程调试。采用远程调试的主要原因是大多数嵌入式平台不太适合进行本地调试,在很多嵌入式平台上内存等资源受限制,并且附带调试信息的可执行程序往往超过几兆字节大小。使用交叉调试,可以减轻嵌入式平台的这些负担。gdb调试器提供了两种不同的远程调试方法,即stub(插桩)方式和gdbserver方式。这两种远程调试方式是有区别的。gdbserver本身的体积很小,能够在具有很小内存的目标系统上独立运行,因而非常适合嵌入式开发。stub方式则需要通过链接器把调试代理和要调试的程序链接成一个可执行的应用程序文件,而且stub需要修改异常处理和驱动程序等。但gdbserver要求宿主机和目标系统采用同一系列的操作系统,而stub没有这种限制,甚至目标系统可以没有操作系统。gdbserver比较适合于调试嵌入式平台上的应用程序,而stub比较适合于调试bootloader和内核等系统程序。2023/1/12332.4.3gdbserver远程调试用gdb+gdbserver的方式调试嵌入式平台上的Linux应用程序安装arm-linux-gdb安装gdbserver远程调试2023/1/12342.5make工程管理器2.5.1Makefile基本结构2.5.2Makefile变量2.5.3Makefile规则2.5.4make管理器的使用2023/1/12352.5.1Makefile基本结构在一个Makefile中通常包含如下内容。需要由make工具创建的目标体(target),目标体通常是目标文件、可执行文件或是一个标签。要创建的目标体所依赖的文件(dependency_file)。创建每个目标体时需要运行的命令(command)。它的格式为:

target:dependency_filescommand2023/1/12362.5.2Makefile变量命令格式含义AR库文件维护程序的名称,默认值为arAS汇编程序的名称,默认值为asCCC编译器的名称,默认值为ccCPPC预编译器的名称,默认值为$(CC)–ECXXC++编译器的名称,默认值为g++FCFORTRAN编译器的名称,默认值为f77RM文件删除程序的名称,默认值为rm–fARFLAGS库文件维护程序的选项,无默认值ASFLAGS汇编程序的选项,无默认值CFLAGSC编译器的选项,无默认值CPPFLAGSC预编译的选项,无默认值CXXFLAGSC++编译器的选项,无默认值FFLAGSFORTRAN编译器的选项,无默认值Makefile中常见预定义变量2023/1/12372.5.2Makefile变量命令格式含义$*不包含扩展名的目标文件名称$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件$<第一个依赖文件的名称$?所有时间戳比目标文件晚的依赖文件,并以空格分开$@目标文件的完整名称$^所有不重复的依赖文件,以空格分开$%如果目标是归档成员,则该变量表示目标的归档成员名称Makefile中常见自动变量2023/1/12382.5.3Makefile规则隐式规则隐含规则能够告诉make怎样使用传统的技术完成任务,这样,当用户使用它们时就不必详细指定编译的具体细节,而只需把目标文件列出即可。make会自动搜索隐式规则目录来确定如何生成目标文件。

make的隐式规则指出:所有“.o”文件都可自动由“.c”文件使用命令“$(CC)$(CPPFLAGS)$(CFLAGS)-c–o”生成。2023/1/12392.5.3Makefile规则隐式规则对应语言后缀名规则C编译:.c变为.o$(CC)–c$(CPPFLAGS)$(CFLAGS)C++编译:.cc或.C变为.o$(CXX)-c$(CPPFLAGS)$(CXXFLAGS)Pascal编译:.p变为.o$(PC)-c$(PFLAGS)Fortran编译:.r变为-o$(FC)-c$(FFLAGS)。Makefile中常见隐式规则目录2023/1/12402.5.3Makefile规则模式规则模式规则不同于隐式规则,是用来定义相同处理规则的多个文件的,模式规则能引入用户自定义变量,为多个文件建立相同的规则,简化Makefile的编写。模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明。OBJS=CC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)

$(CC)$^-o$@%.o:%.c

$(CC)$(CFLAGS)-c$<-o$@2023/1/12412.5.4make使用命令格式含义-Cdir读入指定目录下的Makefile-ffile读入当前目录下的file文件作为Makefile-i忽略所有的命令执行错误-Idir指定被包含的Makefile所在目录-n只打印要执行的命令,但不执行这些命令-p显示make变量数据库和隐含规则-s在执行命令时不显示命令-w如果make在执行过程中改变目录,打印当前目录名2023/1/12422.6autotoolsautotools系列工具只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成makefile了这些工具还可以完成系统配置信息的收集,从而可以方便地处理各种移植性的问题。2023/1/12432.6.1autotools使用流程2023/1/12442.6.2使用autotools所生成的makefileautotools生成的makefile除具有普通的编译功能外,还具有以下主要功能:makemakeinstallmakecleanmakedist2023/1/12452.7实验内容2.7.1vim使用练习2.7.2用gdb调试程序的bug2.7.3编写包含多文件的makefile2.7.4使用autotools生成包含多文件的makefile2023/1/12462.7.1vim使用练习实验目的通过指定指令的vim操作练习,使读者能够熟练使用vim中的常见操作,并且熟悉vim的几种模式,如果读者能够熟练掌握实验内容中所要求的内容,则表明对vim的操作已经很熟练了。实验内容(11)将光标移动到最后一行的行尾。(12)粘贴复制行的内容。(13)光标移到“”。(14)删除该行。(15)存盘但不退出。(16)将光标移到首行。(17)插入模式下输入“Hello,thisisviworld!”。(18)返回命令行模式。(19)向下查找字符串“0:wait”。(20)再向上查找字符串“halt”。(21)强制退出vim,不存盘。(1)在“/root”目录下建一个名为“vim”的目录。(2)进入“vim”目录。(3)将文件“/etc/inittab”复制到“vim”目录下。(4)使用vim打开“vim”目录下的inittab。(5)设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。(6)将光标移到该行。(7)复制该行内容。(8)将光标移到最后一行行首。(9)粘贴复制行的内容。(10)撤销第9步的动作。分别指出每个命令处于何种模式下?2023/1/12472.7.2用gdb调试程序的bug实验目的通过调试一个有问题的程序,使读者进一步熟练使用vi操作,而且熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,希望读者认真调试。实验内容(1)使用vi编辑器,将以下代码输入到名为的文件中。(2)使用gcc编译这段代码,注意要加上“-g”选项以方便之后的调试。(3)运行生成的可执行文件,观察运行结果。(4)使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。(5)纠正错误,更改源程序并得到正确的结果。

2023/1/12482.7.3编写包含多文件的makefile实验目的通过对包含多文件的makefile的编写,熟悉各种形式的makefile,并且进一步加深对makefile中用户自定义变量、自动变量及预定义变量的理解。实验内容(1)用vi在同一目录下编辑两个简单的hello程序(2)仍在同一目录下用vim编辑makefile,且不使用变量替换,用一个目标体实现(即直接将和编译成hello目标体)。然后用make验证所编写的makefile是否正确。(3)将上述makefile使用变量替换实现。同样用make验证所编写的makefile是否正确。(4)编辑另一个makefile,取名为makefile1,不使用变量替换,但用两个目标体实现(也就是首先将和编译为,再将编译为hello),再用make的“-f”选项验证这个makefile1的正确性。(5)将上述makefile1使用变量替换实现。2023/1/12492.7.4使用autotools生成包含多文件的makefile实验目的通过使用autotools生成包含多文件的makefile,进一步掌握autotools的使用方法。同时,掌握Linux下安装软件的常用方法。实验过程(9)使用automake生成。(10)使用configure生成makefile。(11)使用make生成hello可执行文件,并在当前目录下运行hello查看结果。(12)使用makeinstall将hello安装到系统目录下,并运行,查看结果。(

温馨提示

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

评论

0/150

提交评论