《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第3章_第1頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第3章_第2頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第3章_第3頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第3章_第4頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第3章_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第3章Linux編程環(huán)境3.1編輯器vi3.2編譯器gcc3.3調(diào)試器GDB3.4make工具和Makefile規(guī)則3.5

glibc本章小結(jié)

3.1編輯器vi

3.1.1vi簡介

vi編輯器最初是由SunMicrosystems公司的BillJoy在1976年開發(fā)的,一開始BillJoy開發(fā)了Ex編輯器(行編輯器),后來開發(fā)了vi作為Ex的visualinterface,也就是允許一次能看到一屏的文本而非一行,vi因此而得名。圖3-1vi界面3.1.2vi用法

vi有三種模式:命令行模式;最后行模式;文本輸入

模式。

1.命令行模式下使用vi

在命令行模式下都是要輸入命令,但命令不是以“?:?”開始,這與最后行模式下的命令格式有所區(qū)別,它直接接受鍵盤輸入的單字符或組合字符命令,例如直接按下u就表示取消上一次對文件的修改,相當(dāng)于Windows下的Undo操作。

2.最后行模式下使用vi

在最后行模式下,所有命令都要以“?:?”開始,所鍵入的字符系統(tǒng)均作命令來處理。例如,:q代表退出,:w表示存盤。最后行模式下常用命令及其含義如表3-2所示。

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

在文本輸入模式下,不能打入指令,必需先按Esc鍵,返回命令方式。假若用戶不知身處何種模式下,也可以按Esc鍵,則不管處于何種模式下,都會返回命令行模式。

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

1.?vi使用實例內(nèi)容

(1)在?/root目錄下建一個名為?/vi的目錄;

(2)進入?/vi目錄;

(3)將文件?/etc/inittab復(fù)制到?/vi目錄下;

(4)使用vi打開?/vi目錄下的inittab;

(5)將光標(biāo)移到該行;

(6)復(fù)制該行內(nèi)容;

(7)將光標(biāo)移到最后一行行首;

(8)粘貼復(fù)制行的內(nèi)容;

(9)撤銷第(8)步的動作;

(10)將光標(biāo)移動到最后一行的行尾;

(11)粘貼復(fù)制行的內(nèi)容;

(12)光標(biāo)移到“si::sysinit:/etc/rc.d/rc.sysinit”;

(13)刪除該行;

(14)存盤但不退出;

(15)將光標(biāo)移到首行;

(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系統(tǒng)下的gcc(GNUCCompiler)是GNU推出的功能強大、性能優(yōu)越的多平臺編譯器,是GNU的代表作品之一。gcc是可以在多種硬件平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比平均要高20%~30%。gcc編譯器能將C、C++?語言源程序、匯編語言源程序和目標(biāo)程序編譯、連接成可執(zhí)行文件,如果沒有給出可執(zhí)行文件的名字,gcc將生成一個名為a.out的文件。3.2.2gcc的執(zhí)行過程

雖然稱gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執(zhí)行文件的過程不僅僅是編譯的過程,而是要經(jīng)歷四個相互關(guān)聯(lián)的步驟:預(yù)處理(也稱預(yù)編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和鏈接(Linking),如圖3-2所示。圖3-2gcc編譯過程

1.預(yù)處理階段

在預(yù)處理階段,若輸入的是C語言的源文件,通常為?*.c。它們通常帶有.h之類頭文件的包含文件。這個階段主要處理源文件中的?#ifdef、#include和?#define命令。

2.編譯階段

編譯器在預(yù)處理結(jié)束之后,gcc首先要檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼實際要做的工作,在檢查無誤后,就開始把代碼翻譯成匯編語言,gcc的選項“-S”能使編譯器在進行完匯編之前就停止。

3.匯編階段

在匯編階段,將輸入的匯編文件?*.s轉(zhuǎn)換成機器語言?*.o,這個階段對應(yīng)的gcc命令如下例所示:

gcc-c-ohello.ohello.s

4.鏈接階段

在成功編譯之后,就進入了鏈接階段。在上面這個程序中并沒有定義“printf”的函數(shù)實現(xiàn),在預(yù)編譯中包含進的“stdio.h”中也只有該函數(shù)的聲明,而沒有定義函數(shù)的實現(xiàn)。3.2.3gcc的基本用法和選項

在使用gcc編譯器的時候,必須給出一系列必要的調(diào)用參數(shù)和文件名稱。gcc編譯器的調(diào)用參數(shù)大約有100個,其中多數(shù)參數(shù)很少使用,這里只介紹最基本、最常用的參數(shù)。

gcc最基本的用法是:

gcc

[options]

[filenames]3.2.4gcc編譯實例

下面是一個非常簡單的HelloWorld實例。使用在第一節(jié)中學(xué)習(xí)vi的用法,編輯一個文件名hello.c的源文件,文件的內(nèi)容如下:

#include“stdio.h”

intmain(intargc,char*argv[])

{

char*pszStr=“Helloworld\n”;

printf(“Hello,world\n”);

exit(0);

}

3.3調(diào)試器GDB

3.3.1

GDB簡介

所有的程序在寫好以后,都要經(jīng)過調(diào)試,在調(diào)試過程中發(fā)現(xiàn)并改正程序中的錯誤。如果沒有GDB,程序員為了跟蹤某些錯誤,就要在程序中加入大量的語句,用來產(chǎn)生一些特定的輸出。對于某些程序來說,這樣做會導(dǎo)致更多的錯誤。3.3.2GDB常用命令

GDB的命令很多,本節(jié)介紹一些最常用的命令。

在介紹之前,先介紹GDB中的一個非常有用的功能:補齊功能。

1.啟動GDB

假設(shè)文件名為hello,用GDB調(diào)試它,可以輸入gdbhello來啟動GDB并載入程序。在命令行上鍵入gdbhello并按回車鍵就可以運行GDB了。

2.載入程序file

在GDB內(nèi),載入程序很簡單,使用file命令,如filehello。當(dāng)然,程序的路徑名要正確。

3.退出GDBquit

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

4.運行程序run

當(dāng)GDB中已將要調(diào)試的程序載入后,可以用run命令來執(zhí)行。如果程序需要參數(shù),可以在run指令后接著輸入?yún)?shù),就像在Shell下執(zhí)行一個需要參數(shù)的命令一樣。

5.查看程序信息info

info指令用來查看程序的信息,當(dāng)用helpinfo查看幫助時,info指令的參數(shù)足足占了兩個屏幕,它的參數(shù)非常多,但大部分不常用。

6.列出一段源程序list

列出某個函數(shù):

listFUNCTION

以當(dāng)前源文件的某行為中間顯示一段源程序:

listLINENUM

接著前一次繼續(xù)顯示:

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

list

顯示另一個文件的一段程序:

listFILENAME:FUNCTION

或listFILENAME:LINENUM

7.設(shè)置斷點break

有許多種設(shè)置斷點的方法。如下:

(1)在函數(shù)入口設(shè)置斷點

breakFUNCTION

(2)在當(dāng)前源文件的某一行上設(shè)置斷點

breakLINENUM

(3)在另一個源文件的某一行上設(shè)置斷點

breakFILENAME:LINENUM

(4)在某個地址上設(shè)置斷點,當(dāng)調(diào)試的程序沒有源程序時很有用

break*ADDRESS

8.條件斷點

break...ifCOND

COND是一個布爾條件表達(dá)式,語法與C語言中的一樣。條件斷點與一般的斷點不同之處是每當(dāng)程序執(zhí)行到斷點處,都要計算條件表達(dá)式,如果為真,程序才會中斷,否則程序會一直執(zhí)行下去。

9.設(shè)置監(jiān)視點watch

當(dāng)調(diào)試一個很大的程序,并且在跟蹤一個關(guān)鍵的變量時,發(fā)現(xiàn)這個變量不知在哪兒被改動過,如何才能找到改動它的地方?這時可以使用watch命令。簡單地說,監(jiān)視點可以監(jiān)視某個表達(dá)式或變量,當(dāng)它被讀或被寫時讓程序中斷。watch命令的用法如下:

watchEXPRESSION

10.檢查數(shù)據(jù)

最常用的檢查數(shù)據(jù)的方法是使用print命令。

printexp

11.修改變量值

在調(diào)試程序時,可能想改變一個變量的值。用set指令可以修改變量的值:

setvarible=value

例如,想將一個變量tmp的值賦為10:

settmp=10

12.檢查內(nèi)存值

檢查內(nèi)存值的指令是x,x是examine的意思。用法如下:

x/NFUADDR

13.輸出格式

缺省情況下,輸出格式依賴于它的數(shù)據(jù)類型。但可以改變輸出格式。當(dāng)使用print命令時,可以用一個參數(shù)/F來選擇輸出的打印格式。F可以是以下的一些值:

‘x’十六進制整數(shù)格式;

‘d’有符號十進制整數(shù)格式;

‘u’無符號十進制整數(shù)格式;

'f'浮點數(shù)格式。

14.單步執(zhí)行指令

單步執(zhí)行指令有兩個:step和next。step可以跟蹤進入一個函數(shù),而next指令則不會進入函數(shù)。

15.繼續(xù)執(zhí)行指令

當(dāng)程序被斷下,查看所需的信息后,輸入continue,程序會繼續(xù)執(zhí)行下去。

16.幫助指令help

在GDB中,如果想知道一條指令的用法,最方便的方法是使用help。使用方法很簡單:在help后跟上指令名。例如,想知道list指令用法,輸入:

helplist3.3.3GDB使用實例

下面通過一個簡單的實例來講述GDB的使用方法,這里所介紹的指令都是GDB中最基本也是最常用的指令。

3.4make工具和Makefile規(guī)則

3.4.1

make和Makefile概述

什么是Makefile?

或許很多Windows的程序員都不知道這個東西,因為那些Windows的集成開發(fā)環(huán)境都做了這個工作,但要做一個專業(yè)的程序員,必須了解Makefile。會不會寫Makefile,從一個側(cè)面說明了一個程序員是否具備完成大型軟件工程的能力。什么是make?

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

Makefile文件內(nèi)容

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

(1)顯式規(guī)則。

(2)隱晦規(guī)則。

(3)變量的定義。

(4)文件指示。

(5)注釋。3.4.3

Makefile規(guī)則

以下用一個示例來說明Makefile的書寫規(guī)則。一個工程中有a.c、b.c兩個文件。根據(jù)a.c,b.c兩個文件之間的依賴關(guān)系,寫出如下的makefile(在vi中編寫):

#makefile

hello:a.cb.c

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

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

①查找當(dāng)前目錄下的Makefile文件;

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

③分析Makefile中的所有規(guī)則;

④為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系;

⑤根據(jù)依賴關(guān)系決定哪些目標(biāo)文件要重新生成;

⑥執(zhí)行生成命令。3.4.5Makefile中的變量

在Makefile中可以定義自己的變量。

例如上例中的第一個Makefile可以改寫如下:

#Makefile

CC=gcc

hello:a.cb.c #定義變量

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

clean命令的應(yīng)用

每個Makefile中都應(yīng)該寫一個清空目標(biāo)文件(.o和執(zhí)行文件)的規(guī)則,?這不僅便于重編譯,也利于保持文件的清潔。一般清空目標(biāo)文件的規(guī)則是:

clean:

rm

edit

$(objects)3.4.7

Makefile文件示例

1.實例要求

(1)用vi在同一目錄下編輯兩個簡單的hello程序,如下

所示:

(2)仍在同一目錄下用vi編輯Makefile,且不使用變量替換,用一個目標(biāo)體實現(xiàn)(即直接將hello.c和hello.h編譯成hello目標(biāo)體)。然后用make驗證所編寫的Makefile是否正確。

(3)將上述Makefile使用變量替換實現(xiàn)。同樣用make驗證所編寫的Makefile是否正確。

(4)編輯另一Makefile,取名為Makefile1,不使用變量替換,但用兩個目標(biāo)體實現(xiàn)(也就是首先將hello.c和hello.h編譯為hello.o,再將hello.o編譯為hello),再用make的“-f”選項驗證這個Makefile1的正確性。

(5)將上述Makefile1使用變量替換實現(xiàn)。

2.實驗步驟

(1)用vi打開上述兩個代碼文件“hello.c”和“hello.h”。

(2)在Shell命令行中用gcc嘗試編譯,使用命令:“gcchello.c-ohello”,并運行hello可執(zhí)行文件查看結(jié)果。

(3)刪除此次編譯的可執(zhí)行文件:rmhello。

(4)用vi編輯Makefile,如下所示:

hello:hello.chello.h

gcchello.c-ohello

(5)退出保存,在Shell中鍵入make,查看結(jié)果。

(6)再次用vi打開Makefile,用變量進行替換,如下所示:

OBJS:=hello.o

CC:=Gcc

hello:$(OBJS)

$(CC)$^-o$@

(7)退出保存,在Shell中鍵入make,查看結(jié)果。

(8)用vi編輯Makefile1,如下所示:

hello:hello.o

gcchello.o-ohello

hello.o:hello.chello.h

gcc-chello.c-ohello.o

(9)退出保存,在Shell中鍵入Make-fMakefile1,查看結(jié)果。

(10)再次用vi編輯Makefile1,如下所示:

OBJS1:=hello.o

OBJS2:=hello.chello.h

CC:=Gcc

hello:$(OBJS1)

$(CC)$^-o$@

$(OBJS1):$(OBJS2)

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

在這里請注意區(qū)別“$^”和“$<”。

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

結(jié)果。

3.5

glibc

3.5.1

Linux編程庫簡介

所謂Linux編程庫就是指始終可以被多個Linux軟件項目重復(fù)使用的代碼集。以C語言為例,它包含了幾百個可以重復(fù)使用的例程和調(diào)試程序的工具代碼,其中包括函數(shù)。如果每次編寫新程序都要重新寫這些代碼會非常不方便,使用編程庫有兩個主要優(yōu)點:

(1)可以簡化編程,實現(xiàn)代碼重復(fù)使用,進而減小應(yīng)用程序的大小。

(2)可以直接使用比較穩(wěn)定的代碼。圖3-3Linux編程庫3.5.2

Linux線程庫

進程和線程的概念及區(qū)別和聯(lián)系如下:

進程:資源管理的最小單位。

線程:程序執(zhí)行的最小單位。

一個進程至少需要一個線程作為它的指令執(zhí)行體;進程管理著資源,如文件、內(nèi)存、CPU等,一個進程可以擁有多個線程。多線程程序的優(yōu)點:

(1)提高應(yīng)用程序響應(yīng)。

(2)使多CPU系統(tǒng)更加有效。

(3)改善程序結(jié)構(gòu)。下面通過一個實例講述多線程的原理。

/*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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論