嵌入式系统原理与应用--基于ARM微处理器和Linux操作系统(修订版21世纪高等学校嵌入式
出版时间 2018-08-01T00:00
Linux
86468
作者简介
内容简介
3章Linux系统编程基础
本章首先介绍GCC编译器的编译过程及常用选项的使用,通过实例讲述GDB调试器的使用方法,然后介绍Make工具的使用,最后介绍文件操作、时间获取和创建线程等任务的编程方法。
3.1GCC编译器
3.1.1GCC概述
GCC(GNU C Compiler)是GUN项目的C编译器套件,也是GNU软件家族中具有代表性的产品之一。GCC目前支持的体系结构有四十余种,如x86、ARM、PowerPC等系列处理器; 能运行在不同的操作系统上,如Linux、Solaris、Windows CE等操作系统; 可完成C、C++、Objective C等源文件向运行在特定CPU硬件上的目标代码的转换。GCC的执行效率与一般的编译器相比平均效率要高20%~30%。GCC是Linux平台下最常用的编译器之一,它也是Linux平台编译器事实上的标准。同时,在使用Linux操作系统的嵌入式开发领域,GCC也是使用最普遍的编译器之一。
GCC编译器与GUN Binutils工具包是紧密集成的,如果没有Binutils工具,GCC也不能正常工作。Binutils是一系列开发工具,包括连接器、汇编器和其他用于目标文件和档案的工具。Binutils工具集里主要包含以下一系列程序: addr2line、ar、as、c++、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings和strip,它包含的库文件有: libiberty.a、libbfd.a、libbfd.so、libopcodes.a和libopcodes.so。
在Linux操作系统中,文件的后缀名不代表文件的类型,但为了提高工作效率,通常会给每种文件定义一个后缀名。GCC支持的文件类型比较多,具体如表3.1所示。
表3.1GCC支持的文件类型
后缀说明后缀说明
.cC源程序.ii经过预处理的C++程序
.a由目标文件构成的档案文件(库文件).mObjective C源程序
.C.ccC++源程序.o编译后的目标程序
.h头文件.s汇编语言源程序
.i经过预处理的C程序.S经过预编译的汇编程序
3.1.2GCC编译过程
下面通过一个常用的例子来说明GCC的编译过程。
利用文本编辑器创建hello.c文件,程序内容如下。
#include
void main()
{
char msg[80]="Hello,world!";
printf( "%s\n",msg);
}
编写完后,执行以下编译指令。
#gcc hello.c
因为编译时没有加任何选项,所以会默认生成一个名为a.out的可执行文件。执行该文件的命令及结果如下。
#./a.out
Hello,world!
使用GCC由C语言源代码程序生成可执行文件要经历4个过程,如图3.1所示。
图3.1GCC编译过程
1. 预编译
预编译(preprocessing)的主要功能是读取源程序,并对头文件(include)、预编译语句(如define等)和一些特殊符号进行分析和处理。如把头文件复制到源文件中,并将输出的内容送到系统的标准输出。源代码中的预编译指示以“#”为前缀。通过在GCC后加上E选项完成对代码的预编译。命令如下。
# gcc E hello.c
执行命令时,控制台上会有数千行的输出,其中大多数来自stdio.h头文件,也有部分是声明。预编译主要完成以下3个具体任务。
(1) 把include中的头文件复制到要编译的源文件中。
(2) 用实际值替代define文本。
(3) 在调用宏的地方进行宏替换。
下面通过实例test.c来理解预编译完成的工作。
test.c的代码如下。
#define number (1+2*3)
int main()
{
int n;
n=number+3;
return 0;
}
对test.c文件进行预编译,输入以下命令。
#gcc E test.c
执行命令后会显示如下内容。
# 1 "test.c"
# 1 ""
# 1 ""
# 1 "test.c"
main()
{
int n;
n=(1+2*3)+3;
return 0;
}
如果要将预编译结果保存在test.i文件中,可以输入以下命令。
#gcc E test.c o test.i
"《嵌入式系统原理与应用---基于ARM微处理器和Linux操作系统(修订版)》以ARM微处理器为核心,以Linux操作系统为基础,以开发温度采集系统项目为主线,介绍嵌入式系统的开发技术。
本书的主要内容包含:嵌入式系统基础、基于ARM9处理器的硬件平台、Linux编程基础、嵌入式开发环境和系统移植、Linux驱动程序设计 、Qt/E应用程序设计、嵌入式数据库应用程序。并附Linux常用命令简介。
本书将温度采集系统项目分解成若干个子项目,分别放到各部分的实验之中,只要将这些实验综合在一起就可能形成一个系统。"