《嵌入式Linux上的C语言编程实践》.pdf





《《嵌入式Linux上的C语言编程实践》.pdf》由会员分享,可在线阅读,更多相关《《嵌入式Linux上的C语言编程实践》.pdf(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、嵌入式 Linux上的 C语言编程实践第 13 章 韩超/魏治宇/廖文江 电子工业出版社1.1 Linux1.1 Linux 下的下的 C C 语言开发环境语言开发环境第第 1 1 章 章 LinuxLinux 环境下环境下 C C 语言的开发语言的开发本章介绍 Linux 操作系统环境下C 语言开发的基本概念和程序运行的原理。在本章的学习中,读者应重点关注以下内容:Linux 中C 语言开发的流程和工具Linux 中C 语言程序的运行机制1.11.1 Linux Linux 下的下的 C C 语言开发环境语言开发环境Linux 和 C 语言有很深的渊源,因为 Linux 本身就是用 C 语言
2、编写的。同时,在 Linux 操作系统中也提供了 C 语言的开发环境。这些开发环境一般包括程序生成工具、程序调试工具、工程管理工具等。1 1程序生成工具程序生成工具在 Linux 中,一般使用 GCC(GNU Compiler Collection)作为程序生成工具。GCC 提供了C 语言的编译器、汇编器、连接器以及一系列辅助工具。GCC 可以用于生成 Linux 中的应用程序,也可以用于编译 Linux 内核和内核模块,是Linux 中C 语言开发的核心工具。2 2程序调试工具程序调试工具GDB 是Linux 中一个强大的命令行调试工具,使用 GDB 调试C 语言的时候,可以使用设置断点、单
3、步运行、查看变量等功能。3 3工程管理工具工程管理工具在 Linux 操作系统下的程序开发中,一般使用 make 和Makefile 作为工程管理工具。在工程管理方面,有效地使用它们可以统筹工程中的各个文件,并在编译过程中根据时间戳,有选择地进行编译,减少程序生成时间。1.21.2 在在 LinuxLinux 中使用中使用 C C 语言开发语言开发在 Linux 操作系统中,C 语言程序的开发和其他环境类似,程序生成主要分成编译、汇编、连接等几个步骤。在 Linux 中使用文本编辑工具编辑程序源代码也是程序开发的重要步骤。1.2.11.2.1 开发流程和开发工具开发流程和开发工具C 语言程序的
4、开发过程是:使用编辑工具编写文本形式的 C语言源文件,然后编译生成以机器代码为主的二进制可执行程序的过程。由源文件生成可执行程序的开发过程如图 1-1所示。(点击查看大图)图1-1 Linux 中C 语言程序的开发流程编译是指把用高级语言编写的程序转换成相应处理器的汇编语言程序的过程。从本质上讲,编译是一个文本转换的过程。对嵌入式系统而言,一般要把用 C 语 言编写的程序转换成处理器的汇编代码。编译过程包含了 C语言的语法解析和汇编语言的生成两个步骤。汇编一般是逐个文件进行的,对于每一个 C 语言编写的文 件,可能还需要进行预处理。汇编是从汇编语言程序生成目标系统的二进制代码(机器代码)的过程
5、。机器代码的生成和处理器有密切的联系。相对于编译过程的语法解析,汇编的过程相 对简单。这是因为对于一款特定的处理器,其汇编语言和二进制的机器代码是一一对应的。汇编过程的输入是汇编代码,这个汇编代码可能来源于编译过程的输出,也可以是直接用汇编语言书写的程序。连接过程是指将汇编生成的多段机器代码组合成一个可执行程序。一般来说,通过编译和汇编过程,每一个源文件将生成一个目标文件。连接器的作用就是将这些目标文件组合起来,组合的过程包括了代码段、数据段等部分的合并,以及添加相应的文件头。在 Linux 的 C语言程序生成过程中,源代码经过编译-汇编-连接生成可执行程序。GCC 是Linux 下主要的程序
6、生成工具,它除了编译器、汇编器、连接器外,还包括一些辅助工具。调试是程序开发一个很重要的环节。在 Linux 的程序开发中,最主要的调试工具是GDB。GDB是一个命令行调试工具,可以实现在程序中设置断点、单步执行、查看对应源代码等功能。虽然 Linux 中基本的开发工具 GCC 和 GDB 都是命令行工具,但是它们也可以和 IDE(集成开发环境)结合使用。Linux 下程序的开发过程及相关工具的使用如图1-2所示。1.2.21.2.2 Linux Linux 中程序的运行原理中程序的运行原理在 Linux 的开发环境中,C语言程序的运行环境如图 1-3所示。作为 UNIX 操作系统的一种,Li
7、nux 的操作系统提供了一系列的接口,这些接口被称为系统调用(System Call)。在UNIX的理念中,系统调用提供的是机制,而不是策略。C语言的库函数通过调用系统调用来实现,库函数对上层提供了 C 语言库文件的接 口。在应用程序层,通过调用 C语言库函数和系统调用来实现功能。一般来说,应用程序大多使用C 语言库函数实现其功能,较少使用系统调用。图 1-3 Linux 下 C语言程序的结构在 Linux 等系统的环境中,C 语言库及其头文件都是系统的一部分,只要安装了编译工具即可以完成 C 语言程序的开发。这点与 Windows中程序的开发有所不同,Windows中一般需要安装开发包才能进
8、行程序开发。C 语言程序经过编译-汇编-连接,最终生成可执行程序格式。可执行程序中包含两个部分的内容:程序头程序主体(二进制机器代码)在程序头中包含了供操作系统加载的信息,操作系统根据这些信息加载可执行程序。而可执行程序的主体依然是二进制的机器代码。程序在运行的时候,正是靠逐条地执行这些机器代码,形成程序运行的序列。在 Linux 操作系统中,普遍使用 ELF 格式来作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)是 UNIX 系统实验室(USL)作为应用程序二进制接口(Application Binary Int
9、erface,ABI)而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的 ELF 标准作为工作在 32 位 Intel 体系上不同操作系统 之间可移植的二进制文件格式。如果开发者定义了一个二进制接口集合,ELF 标准允许用它来支持流线型的软件运行。通过它可以减少不同执行接口的数量,也可以减少重新编程和重新编译的代码。ELF 文件格式包括三种主要的类型:可执行文件、可重定向文件、共享库。1 1可执行文件(应用程序)可执行文件(应用程序)可执行文件包含了代码和数据,是可以直接运行的程序。2 2可重定向文件(可重定向文件(*.o*.o)可重定向文件又称为目标文件,它包含了代码和数据(这些
10、数据是和其他重定位文件和共享的 object文件一起连接时使用的)。3 3共享文件(共享文件(*.so*.so)也称为动态库文件,它包含了代码和数据(这些数据是在连接时候被连接器 ld 和运行时动态连接器使用的)。动态连接器可能称为 ld.so.1,libc.so.1 或者 ld-linux.so.1。object 文件参与程序的连接(创建一个程序)和程序的执行(运行一个程序)。object文件格式提供了一个方便有效的方法来用并行的视角看待 文件的内容,这些 object 文件的活动可以反映出不同的需要。一个ELF 头存在于文件的开始处,在这里保存了路线图(road map),描述了该文件的组
11、织情况。节(section)保存着 object 文件的信息,从连接角度看它包括指令、数据、符号表和重定位信息等。ELF 文件格式如图1-4所示。(点击查看大图)图 1-4 ELF 可执行程序结构一个 ELF 文件从连接器(Linker)的角度看,是一些节的集合;从程序加载器(Loader)的角度看,它是一些段(Segments)的集合。ELF 格式的程序和共享库具有相同的结构,只是段的集合和节的集合上有些不同。ELF 格式的共享库可以加载到任何地址。事实上,共享库使用 PIC(Place Independence Code,位置无关代码),使得文件的代码段(Text Page)不需要重定位,
12、并且可以被多个进程共享。ELF 格式的连接器通过GOT(Global Offset Table)来支持 PIC 代码。5.1.1 make5.1.1 make 机制概述机制概述第第 5 5 章 章 makemake 工程管理工具工程管理工具本章介绍 Linux 下面的常用工程管理机制:make 和 Makefile,也介绍使用 autoconf 和automake 生成Makefile 的机制和方法。在本章的学习中,读者应重点关注以下内容:make 的工作机制Makefile 的基本语法使用 Makefile 典型工程自动生成 Makefile 的流程5.15.1 make make 和和 M
13、akefileMakefilemake 和Makefile 提供了一种非常简单有效的工程管理方式。使用这种方式管理工程的原理很简单:Makefile 是一个决定怎样编译工程的文本文件,有一定的书写规则。在工程更新的时候,使用 GNU 的 make 工具根据当前的 Makefile 对工程进行编译。5.1.15.1.1 make make 机制概述机制概述在 Linux 的程序开发环境下,一般不具有集成开发环境(IDE)。因此,当需要大量编译工程文件的时候,就需要使用自己的方法来管理。如果仅仅手 动使用 gcc 的编译命令,将变得烦琐而单调,而且不利于工程管理。而如果使用 Makefile 进行
14、工程管理,就可以较好地处理这个问题。make 程序最初设计的目的是为了维护 C程序文件,防止不必要的重新编译。例如,在使用命令行进行编译的时候,修改了一个工程中的头文件,如何确保包含这个头文件 的所有文件都得到编译呢?这些工作可以让 make 程序来自动完成。make 工具对于维护一些具有相互依赖关系的文件特别有用,它对文件和命令的联系(在文 件改变时调用来更新其他文件的程序)提供一套编码方法。make 工具的基本概念类似于 Proglog 语言,在使用的过程中只告诉 make 需要做什么,即提 供一些规则,其他的工作由make 自动完成。make 工具的工作是自动确定工程的哪部分需要重新编译
15、,然后执行命令去编译它们。虽然这种方式多用于 C 程序,然而只要提供命令行的编译器,就可以 将其用于任何语言。实际上,make 工具不仅应用于编程,也可以用于描述一些文件改变时,需要自动更新另一些文件的任务。在程序开发的过程中,Makefile 带来的好处就是自动化编译。当编译规则制定完成后,只需要一个 make 命令,整个工程就会根据 Makefile 判断是否需要更新来完成自 动编译,极大地提高了软件开发的效率,降低了开发的复杂度。make 机制的运行环境需要一个命令行程序make 和一个文本文件 Makefile。make 是一个命令工具,具体来说是一个解释Makefile 中的指令的命
16、令工具。Makefile 的工作原理是调用系统中的 make 命令解释当前 的 Makefile,完成其中指定的功能。在很多的 IDE 中都有这个命令,如:Delphi 的 make,Visual C+的 nmake,Linux 下 GNU 的make。可见,Makefile 已经成为一种在工程方面的编译方法。Makefile 里主要包含了 5 个方面的内容:显式规则、隐式规则、变量定义、文件指示和注释。1显式规则。显式规则说明了如何生成一个或多个目标。这需要由Makefile 的书写者显式指出要生成的文件、文件的依赖文件及生成的命令。2隐式规则。由于 make 有自动推导的功能,会选择一套默
17、认的方法进行 make,所以隐式的规则可以让开发者比较、简略地书写 Makefile,这是由 make 所支持的。3变量定义。在Makefile 中需要定义一系列的变量,一般都是字符串,它类似 C语言中的宏,当 Makefile 被执行时,其中的变量都会被扩展到相应的引用位置上。4文件指示。包括三个部分,第一部分是在一个Makefile 中引用另一个 Makefile,就像C 语言中的 include 一样包含进来;第二部 分是指根据某些情况指定 Makefile 中的有效部分,就像 C语言中的预编译宏#ifdef 一样;第三部分就是定义一个多行的命令。5注释。Makefile 中只有行注释,
18、和 UNIX 的Shell 脚本一样,其注释符使用井号#字符,这个就像 C/C+中的双斜杠/一样。如果需要在Makefile 中使用井号#字符,可以用反斜杠进行转义,如:#。5.1.25.1.2 make make 和和 MakefileMakefile 的使用的使用make 是一个Linux 下的二进制程序,用来处理Makefile 这种文本文件。在Linux 的Shell命令行键入 make 的时候,将自动寻找 名称为Makefile的文件作为编译文件,如果没有名称为Makefile的文件,将继续查找名称为makefile的文件。找到编译文件 后,make工具将根据 Makefile 中的
19、第一个目标自动寻找依赖关系,找出这个目标所需要的其他目标。如果所需要的目标也需要依赖其他的目标,make 工具将一层层寻找直到找到最后一个目标为止。make 工具的使用格式为:make options target.options 为make 工具的选项,target为Makefile 中指定的目标。表5-1 给出了make 工具的参数选项。表 5-1 make 工具的参数选项选 项含 义-f filename显式地指定文件作为 Makefile-C dirname制定 make 在开始运行后的工作目录为dirname-e不允许在 Makefile 中替换环境变量的赋值-k 执行命令出错时,放
20、弃当前目标,继续维护其他目标-n按实际运行时的执行顺序模拟执行命令(包括用开头的命令),没有实际执行效果,仅仅用于显示执行过程-p显示 Makefile 中所有的变量和内部规则-r忽略内部规则-s执行但不显示命令,常用来检查 Makefile 的正确性-S如果执行命令出错就退出-t修改每个目标文件的创建日期-I忽略运行 make 中执行命令的错误-V显示 make 的版本号在 Makefile 中,经常使用的变量如表5-2 所示。表 5-2 Makefile中常用变量变量描 述$目标文件名$file.oecho File path:$(D)File name:$(F).PHONY:clean
21、rule0 rule1 rule2 rule3clean:echo-clean-rm-f file.o在这个 Makefile 的路径下,执行make 命令:$make执行后显示的结果为:+rule3+rule2+rule1+rule0+The deps:rule1The target:rule0File path:.File name:file.o由于 make 没有指定选项和目标,将默认使用 Makefile 文件,并执行其中的 all 目标。在执行的过程中,首先发现 all 目标依赖于 rule0 和 file.o 两个目标,因此需要完成这两个目标的处理。对于 rule0 目标,依次寻找
22、它的依赖关系,直到找到 rule3 目标,然后再从 rule3 目标执 行,依次执行 rule3,rule2,rule1,rule0。对于 file.o 目标,将生成file.o 文件,它由 file.o 目标生成,内容为 1234567890,变量D 表示目标的所在目录的路径,F 表示目标的文件名。在规则 rule0:rule1 中,使用了变量$和$,前者表示依赖的所有文件,后者表示目标的名称。事实上,Makefile 的执行顺序不是按照每条规则书写的先后顺序,而是由规则之间的依赖关系确定的。在 Makefile 中,将目标 clean rule0 rule1 rule2 rule3 定义为
23、伪目标(.PHONY),这是由于它们不是需要生成的内容的名称;file.o 是实际生成的结果,因此它是真实的目标,而不是伪目标。在执行过一次 make 之后,再次执行make 命令,得到的结果如下所示:+rule3+rule2+rule1+rule0+The deps:rule1The target:rule0从执行结果中可见,这次只执行了 rule0及其依赖的目标,没有执行目标 file.o。这是由于目标 file.o 依赖的内容没有变化,所以这条目标不需要被执行,这说明了 Makefile 条件编译的特性。执行 make clean 的结果如下所示:$make clean-clean-rm
24、-f file.o这次执行删除了 file.o文件,状态已经退回到 make 执行之前。因此再次执行make 的时候,将和首次执行是一致的。在 make 命令的使用中,可以使用-n选项显示执行的序列:$make-n本次执行的结果为:echo+rule3+echo+rule2+echo+rule1+echo+rule0+echo The deps:rule1echo The target:rule0echo 1234567890 file.oecho File path:.File name:file.o由此可见,在本次的执行中,只显示了需要执行的命令,而不是真正地执行这些命令。在这个过程中,寻
25、找依赖关系的过程和直接的 make 过程是一致的,但是只显示要执行命令而不执行命令。在使用 make 的过程中,也可以指定一条单独的目标来执行,例如:$make rule2+rule3+rule2+这时,将指定目标 rule2 来执行,执行的过程发现它依赖于目标 rule3,因此先执行rule3 的内容,再执行目标 rule2的内容。对于其他的目标则不需要执行。5.2.35.2.3 Makefile Makefile 中使用隐含规则来编译程序中使用隐含规则来编译程序本示例演示一个程序的生成过程,使用的程序文件为第 4 章中的文件。Makefile 文件和程序文件在一个文件夹中。Makefile
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式Linux上的C语言编程实践 嵌入式 Linux 语言 编程 实践

限制150内