《基于ARM9的嵌入式Linux系统开发原理与实践》课件第3章_第1页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第3章_第2页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第3章_第3页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第3章_第4页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第3章_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

第3章Linux编程环境3.1编辑器vi3.2编译器gcc3.3调试器GDB3.4make工具和Makefile规则3.5

glibc本章小结

3.1编辑器vi

3.1.1vi简介

vi编辑器最初是由SunMicrosystems公司的BillJoy在1976年开发的,一开始BillJoy开发了Ex编辑器(行编辑器),后来开发了vi作为Ex的visualinterface,也就是允许一次能看到一屏的文本而非一行,vi因此而得名。图3-1vi界面3.1.2vi用法

vi有三种模式:命令行模式;最后行模式;文本输入

模式。

1.命令行模式下使用vi

在命令行模式下都是要输入命令,但命令不是以“ : ”开始,这与最后行模式下的命令格式有所区别,它直接接受键盘输入的单字符或组合字符命令,例如直接按下u就表示取消上一次对文件的修改,相当于Windows下的Undo操作。

2.最后行模式下使用vi

在最后行模式下,所有命令都要以“ : ”开始,所键入的字符系统均作命令来处理。例如,:q代表退出,:w表示存盘。最后行模式下常用命令及其含义如表3-2所示。

3.文本输入模式下使用vi

在文本输入模式下,不能打入指令,必需先按Esc键,返回命令方式。假若用户不知身处何种模式下,也可以按Esc键,则不管处于何种模式下,都会返回命令行模式。

文本输入模式下常用命令及其含义如表3-3所示。3.1.3vi使用实例分析

1. vi使用实例内容

(1)在 /root目录下建一个名为 /vi的目录;

(2)进入 /vi目录;

(3)将文件 /etc/inittab复制到 /vi目录下;

(4)使用vi打开 /vi目录下的inittab;

(5)将光标移到该行;

(6)复制该行内容;

(7)将光标移到最后一行行首;

(8)粘贴复制行的内容;

(9)撤销第(8)步的动作;

(10)将光标移动到最后一行的行尾;

(11)粘贴复制行的内容;

(12)光标移到“si::sysinit:/etc/rc.d/rc.sysinit”;

(13)删除该行;

(14)存盘但不退出;

(15)将光标移到首行;

(16)插入模式下输入“Hello,thisisviworld!”;

(17)返回命令行模式;

(18)向下查找字符串“0:wait”;

(19)再向上查找字符串“halt”;

(20)强制退出vi,不存盘。

2. vi使用实例解析

在该实例中,每一步的使用命令如下所示。

(1)

mkdir/root/vi

(2)

cd/root/vi

(3)

cp/etc/inittab./

(4)

vi./inittab

(5)

17<enter>(命令行模式)

(6) yy

(7) G

(8) p

(9) u

(10) $

(11) p

(12) 21G

(13) dd

(14) :w(最后行模式)

(15) 1G

(16) i并输入“Hello,thisisviworld!”(文本输入模式)

(17) Esc

(18) /0:wait(命令行模式)

(19) ?halt

(20) :q!(最后行模式)

3.2编译器gcc

3.2.1gcc简介

Linux系统下的gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬件平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均要高20%~30%。gcc编译器能将C、C++ 语言源程序、汇编语言源程序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。3.2.2gcc的执行过程

虽然称gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤:预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking),如图3-2所示。图3-2gcc编译过程

1.预处理阶段

在预处理阶段,若输入的是C语言的源文件,通常为 *.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的 #ifdef、#include和 #define命令。

2.编译阶段

编译器在预处理结束之后,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,就开始把代码翻译成汇编语言,gcc的选项“-S”能使编译器在进行完汇编之前就停止。

3.汇编阶段

在汇编阶段,将输入的汇编文件 *.s转换成机器语言 *.o,这个阶段对应的gcc命令如下例所示:

gcc-c-ohello.ohello.s

4.链接阶段

在成功编译之后,就进入了链接阶段。在上面这个程序中并没有定义“printf”的函数实现,在预编译中包含进的“stdio.h”中也只有该函数的声明,而没有定义函数的实现。3.2.3gcc的基本用法和选项

在使用gcc编译器的时候,必须给出一系列必要的调用参数和文件名称。gcc编译器的调用参数大约有100个,其中多数参数很少使用,这里只介绍最基本、最常用的参数。

gcc最基本的用法是:

gcc

[options]

[filenames]3.2.4gcc编译实例

下面是一个非常简单的HelloWorld实例。使用在第一节中学习vi的用法,编辑一个文件名hello.c的源文件,文件的内容如下:

#include“stdio.h”

intmain(intargc,char*argv[])

{

char*pszStr=“Helloworld\n”;

printf(“Hello,world\n”);

exit(0);

}

3.3调试器GDB

3.3.1

GDB简介

所有的程序在写好以后,都要经过调试,在调试过程中发现并改正程序中的错误。如果没有GDB,程序员为了跟踪某些错误,就要在程序中加入大量的语句,用来产生一些特定的输出。对于某些程序来说,这样做会导致更多的错误。3.3.2GDB常用命令

GDB的命令很多,本节介绍一些最常用的命令。

在介绍之前,先介绍GDB中的一个非常有用的功能:补齐功能。

1.启动GDB

假设文件名为hello,用GDB调试它,可以输入gdbhello来启动GDB并载入程序。在命令行上键入gdbhello并按回车键就可以运行GDB了。

2.载入程序file

在GDB内,载入程序很简单,使用file命令,如filehello。当然,程序的路径名要正确。

3.退出GDBquit

在GDB的命令方式下,输入quit,就可以退出GDB。

4.运行程序run

当GDB中已将要调试的程序载入后,可以用run命令来执行。如果程序需要参数,可以在run指令后接着输入参数,就像在Shell下执行一个需要参数的命令一样。

5.查看程序信息info

info指令用来查看程序的信息,当用helpinfo查看帮助时,info指令的参数足足占了两个屏幕,它的参数非常多,但大部分不常用。

6.列出一段源程序list

列出某个函数:

listFUNCTION

以当前源文件的某行为中间显示一段源程序:

listLINENUM

接着前一次继续显示:

list显示前一次之前的源程序:

list

显示另一个文件的一段程序:

listFILENAME:FUNCTION

或listFILENAME:LINENUM

7.设置断点break

有许多种设置断点的方法。如下:

(1)在函数入口设置断点

breakFUNCTION

(2)在当前源文件的某一行上设置断点

breakLINENUM

(3)在另一个源文件的某一行上设置断点

breakFILENAME:LINENUM

(4)在某个地址上设置断点,当调试的程序没有源程序时很有用

break*ADDRESS

8.条件断点

break...ifCOND

COND是一个布尔条件表达式,语法与C语言中的一样。条件断点与一般的断点不同之处是每当程序执行到断点处,都要计算条件表达式,如果为真,程序才会中断,否则程序会一直执行下去。

9.设置监视点watch

当调试一个很大的程序,并且在跟踪一个关键的变量时,发现这个变量不知在哪儿被改动过,如何才能找到改动它的地方?这时可以使用watch命令。简单地说,监视点可以监视某个表达式或变量,当它被读或被写时让程序中断。watch命令的用法如下:

watchEXPRESSION

10.检查数据

最常用的检查数据的方法是使用print命令。

printexp

11.修改变量值

在调试程序时,可能想改变一个变量的值。用set指令可以修改变量的值:

setvarible=value

例如,想将一个变量tmp的值赋为10:

settmp=10

12.检查内存值

检查内存值的指令是x,x是examine的意思。用法如下:

x/NFUADDR

13.输出格式

缺省情况下,输出格式依赖于它的数据类型。但可以改变输出格式。当使用print命令时,可以用一个参数/F来选择输出的打印格式。F可以是以下的一些值:

‘x’十六进制整数格式;

‘d’有符号十进制整数格式;

‘u’无符号十进制整数格式;

'f'浮点数格式。

14.单步执行指令

单步执行指令有两个:step和next。step可以跟踪进入一个函数,而next指令则不会进入函数。

15.继续执行指令

当程序被断下,查看所需的信息后,输入continue,程序会继续执行下去。

16.帮助指令help

在GDB中,如果想知道一条指令的用法,最方便的方法是使用help。使用方法很简单:在help后跟上指令名。例如,想知道list指令用法,输入:

helplist3.3.3GDB使用实例

下面通过一个简单的实例来讲述GDB的使用方法,这里所介绍的指令都是GDB中最基本也是最常用的指令。

3.4make工具和Makefile规则

3.4.1

make和Makefile概述

什么是Makefile?

或许很多Windows的程序员都不知道这个东西,因为那些Windows的集成开发环境都做了这个工作,但要做一个专业的程序员,必须了解Makefile。会不会写Makefile,从一个侧面说明了一个程序员是否具备完成大型软件工程的能力。什么是make?

make是一个命令工具,用于解释Makefile中的指令。3.4.2

Makefile文件内容

Makefile主要包含了以下五个部分:

(1)显式规则。

(2)隐晦规则。

(3)变量的定义。

(4)文件指示。

(5)注释。3.4.3

Makefile规则

以下用一个示例来说明Makefile的书写规则。一个工程中有a.c、b.c两个文件。根据a.c,b.c两个文件之间的依赖关系,写出如下的makefile(在vi中编写):

#makefile

hello:a.cb.c

gcc-ohelloa.cb.c3.4.4make工作原理

Linux下GNU的Make工作流程如下:

①查找当前目录下的Makefile文件;

②初始化Makefile文件中的变量;

③分析Makefile中的所有规则;

④为所有的目标文件创建依赖关系;

⑤根据依赖关系决定哪些目标文件要重新生成;

⑥执行生成命令。3.4.5Makefile中的变量

在Makefile中可以定义自己的变量。

例如上例中的第一个Makefile可以改写如下:

#Makefile

CC=gcc

hello:a.cb.c #定义变量

$(CC)-ohelloa.cb.c #引用变量3.4.6

clean命令的应用

每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则, 这不仅便于重编译,也利于保持文件的清洁。一般清空目标文件的规则是:

clean:

rm

edit

$(objects)3.4.7

Makefile文件示例

1.实例要求

(1)用vi在同一目录下编辑两个简单的hello程序,如下

所示:

(2)仍在同一目录下用vi编辑Makefile,且不使用变量替换,用一个目标体实现(即直接将hello.c和hello.h编译成hello目标体)。然后用make验证所编写的Makefile是否正确。

(3)将上述Makefile使用变量替换实现。同样用make验证所编写的Makefile是否正确。

(4)编辑另一Makefile,取名为Makefile1,不使用变量替换,但用两个目标体实现(也就是首先将hello.c和hello.h编译为hello.o,再将hello.o编译为hello),再用make的“-f”选项验证这个Makefile1的正确性。

(5)将上述Makefile1使用变量替换实现。

2.实验步骤

(1)用vi打开上述两个代码文件“hello.c”和“hello.h”。

(2)在Shell命令行中用gcc尝试编译,使用命令:“gcchello.c-ohello”,并运行hello可执行文件查看结果。

(3)删除此次编译的可执行文件:rmhello。

(4)用vi编辑Makefile,如下所示:

hello:hello.chello.h

gcchello.c-ohello

(5)退出保存,在Shell中键入make,查看结果。

(6)再次用vi打开Makefile,用变量进行替换,如下所示:

OBJS:=hello.o

CC:=Gcc

hello:$(OBJS)

$(CC)$^-o$@

(7)退出保存,在Shell中键入make,查看结果。

(8)用vi编辑Makefile1,如下所示:

hello:hello.o

gcchello.o-ohello

hello.o:hello.chello.h

gcc-chello.c-ohello.o

(9)退出保存,在Shell中键入Make-fMakefile1,查看结果。

(10)再次用vi编辑Makefile1,如下所示:

OBJS1:=hello.o

OBJS2:=hello.chello.h

CC:=Gcc

hello:$(OBJS1)

$(CC)$^-o$@

$(OBJS1):$(OBJS2)

$(CC)-c$<-o$@

在这里请注意区别“$^”和“$<”。

(11)退出保存,在Shell中键入make-fMakefile1,查看

结果。

3.5

glibc

3.5.1

Linux编程库简介

所谓Linux编程库就是指始终可以被多个Linux软件项目重复使用的代码集。以C语言为例,它包含了几百个可以重复使用的例程和调试程序的工具代码,其中包括函数。如果每次编写新程序都要重新写这些代码会非常不方便,使用编程库有两个主要优点:

(1)可以简化编程,实现代码重复使用,进而减小应用程序的大小。

(2)可以直接使用比较稳定的代码。图3-3Linux编程库3.5.2

Linux线程库

进程和线程的概念及区别和联系如下:

进程:资源管理的最小单位。

线程:程序执行的最小单位。

一个进程至少需要一个线程作为它的指令执行体;进程管理着资源,如文件、内存、CPU等,一个进程可以拥有多个线程。多线程程序的优点:

(1)提高应用程序响应。

(2)使多CPU系统更加有效。

(3)改善程序结构。下面通过一个实例讲述多线程的原理。

/*example.c*/

#include“pthread.h”

#include“stdio.h”

#include“unistd.h”

voidthread(void)

{

inti;

for(i=0;i<3;i++)

printf(“Thisisapthread\n”);

温馨提示

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

评论

0/150

提交评论