2023年ARM實(shí)驗(yàn)報(bào)告新編_第1頁
2023年ARM實(shí)驗(yàn)報(bào)告新編_第2頁
2023年ARM實(shí)驗(yàn)報(bào)告新編_第3頁
2023年ARM實(shí)驗(yàn)報(bào)告新編_第4頁
2023年ARM實(shí)驗(yàn)報(bào)告新編_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

南京郵電大學(xué)通達(dá)學(xué)院

嵌入式系統(tǒng)B

實(shí)驗(yàn)報(bào)告

班級100023

專業(yè)通信工程(嵌入式系統(tǒng)開

發(fā)1

學(xué)號10002304

姓名陸海霞

實(shí)驗(yàn)項(xiàng)目:

1、ADS下簡樸ARM匯編程序

2、熟悉LINUX開發(fā)環(huán)境

3、多線程應(yīng)用程序設(shè)計(jì)

指導(dǎo)教師范山崗

實(shí)驗(yàn)一ADS下簡樸ARM匯編程序

實(shí)驗(yàn)?zāi)康模?/p>

1、熟悉ADSL2下進(jìn)行匯編語言程序設(shè)計(jì)的基本流程;

2、熟悉在ADS中創(chuàng)建工程及編寫、編譯和運(yùn)營匯編語言程序的方法;

3、熟悉AXD中各種調(diào)試功能。

實(shí)驗(yàn)環(huán)境:

1、硬件:PC機(jī)。

2、軟件ADS1.2。

實(shí)驗(yàn)內(nèi)容:

1、在ADS中新建工程,并設(shè)立開發(fā)環(huán)境。

2、在CodeWarrior環(huán)境中編輯、編譯和鏈接匯編語言程序,并生成可執(zhí)行文獻(xiàn)。

3、在AXD中調(diào)試匯編程序;

4、使用命令行界面編輯、編譯和鏈接匯編程序。

實(shí)驗(yàn)環(huán)節(jié):

本實(shí)驗(yàn)規(guī)定在ADS環(huán)境下,編寫一個(gè)匯編程序,計(jì)算S=1+2+3……+n的累加值。

把累加結(jié)果S存入到存儲(chǔ)器的指定位置;在AXD中調(diào)試該程序,使用ARMulator模擬目的

機(jī)。

1、新建工程。

打開CodeWarrior,選擇File->New(project)選項(xiàng),使用ARMExecutableImage模

版新建一個(gè)工程。

2、設(shè)立編譯和鏈接選項(xiàng)。

由于我們使用的是模擬機(jī),設(shè)立匯編語言編譯器的模擬解決器架構(gòu)為Xscale;在ARMLink

er中,選擇output選項(xiàng)卡并選擇Linktype為Simple類型,確認(rèn)ROBase為0x8000,

修改RWBase為0x9000,

3、為當(dāng)前工程添加源程序文獻(xiàn)。

ARM匯編程序源文獻(xiàn)后綴名為S大小寫均可。

保證添加入當(dāng)前工程復(fù)選框選上。

4、編輯源程序代碼。

參考程序add.s:

armadd源程序

NEQU7。。;累加次數(shù)

;定義名為Adding的代碼段

oAREAAdding,CODE,READONLY

。ENTRY

ooMOVR0,#0

。MOVRl,#l

REPEATADDRO,RO,RI

6DDR1,R1,#1

CMPR1,#N

oBLEREPEAT

ooLDRR2,=RESULT

。STRRO,[R2]

HEREoBHERE

。定義名為Dataspace的數(shù)據(jù)段

AREADataspace,DATA,READWRITE

RESULTDCD0

-END

實(shí)驗(yàn)中程序編寫如下圖所示:

■10002304.S

,{.},M?,國,nP,Path:D:\mywork\armadd\Ihx.i

NEQU7;

AREAAciding,CODE,READONLY

ENTRY

MOVR0,40

MOVRlz#l|

REPEATADDRO,RO,RI

ADD

CMPR1,#N

BLEREPEAT

LDRR2,=RESULT

STRR0z[R2]

HEREBHERE

AREADataspace,DATA,READURITE

RESULTDCD0

END

5、編譯匯編源代碼文獻(xiàn)。

右擊add.S文獻(xiàn),選擇Compile,假如沒有成功會(huì)彈犯錯(cuò)誤和警告窗口。

生成Q目的代碼文獻(xiàn)。

實(shí)驗(yàn)中生成的WMM.O文獻(xiàn)如下圖所示:

搜索文件夾團(tuán),

irk\armadd\armaddData\DebugRel\ObjectCode

10002304.O

務(wù)會(huì)。文件

2KB

:件夾

6、編譯整個(gè)工程。

選擇Project-Make進(jìn)行整個(gè)工程的編譯??梢栽谀夸浛臻g查看是否生成了映像文獻(xiàn)

add.axfo

7、確認(rèn)調(diào)試目的設(shè)立。

設(shè)立目的解決器型號。

8、運(yùn)營映像文獻(xiàn)。

9、調(diào)試準(zhǔn)備

在AXD中,打開各個(gè)觀測窗口,做調(diào)試準(zhǔn)備。選擇ProcessorViewsfRegisters選

項(xiàng),打開ARM寄存器顯示窗口。調(diào)整窗口大小,使得Corrent節(jié)點(diǎn)的R0?R2寄存器可見。

選擇ProcessorViewsTMemory選項(xiàng),打開ARM存儲(chǔ)器顯示窗口。在StartAddre

ss輸入框中輸入準(zhǔn)備查看的內(nèi)存區(qū)域首地址0x9000。

10、調(diào)試映像文獻(xiàn)。

打開調(diào)試窗口。

為了便于調(diào)試,觀測各個(gè)寄存器和存儲(chǔ)器的變化情況。

11、單步運(yùn)營程序,觀測并記錄結(jié)果。

在AXD中,選擇Execute今Step選項(xiàng),或者F10鍵,單步運(yùn)營程序,查看相關(guān)寄存器和存儲(chǔ)

器相應(yīng)地址上的變化,請把每一步的結(jié)果填入下表中。

運(yùn)營結(jié)果如圖所示:

喪SearchProcessorViewsSistefnViewsExecuteOptionsWindowHelp

劇明閩潮型II喻陶

?‘XScale-D:\mywork\armadd\10001304s_□Xl

L

iMOVRl,#l

7REPEATADDR0.R0.R1

ADDR1,R1Z#1

CMP

ICBLEREPEAT

LDRR2Z=RESULT

12STRRO.FRZl

EHERE

[Scale-Registers

RegisterValue15

16AREADataspace,DATAREADWRITE

3-Current{???}z

17RESULTDCD0

FrOOxOOOOOOlC

i;

l-rl0x00000008

|-r20x00009000

pr30x00000000

|-r40x00000000

分析源程序可以看出,我們的程序僅對少數(shù)幾個(gè)寄存器進(jìn)行了讀寫操作。

序號執(zhí)行指執(zhí)行后的變化情況

令寄存器(十六進(jìn)制)存儲(chǔ)器(十六進(jìn)制)

R0R1R2PC0x9000

1MOV0x00000000Ox0000000Ox00000000X0000800x9000

R0,0004

#0

2MOVOx00000x00000X00000000x000080080x9010

RI,#000000010

1

3ADD0x000000010x00000x0000x0000800c0X9020

RO,R000100000

0,R1

4ADD0x000000X000000020x0000Ox00008010Ox9030

RI,R0010000

1,#1

5CMP0X0x000x00X000080140x9040

R1,00000(X)10000020000000

#N

6BLE0x00000x000000020x00000x000080Ox9050

REPE0001000008

AT

7ADD0X0000000x000000Ox00000xOOOO800x9060

RO,R030200000c

O,R1

注意:假如錯(cuò)過記錄的時(shí)機(jī)可以選擇Fi1e-Rc]oadCurrentImage重新加載映像文

獻(xiàn)。

實(shí)驗(yàn)思考:

1、有沒有辦法讓AXD中寄存器和存儲(chǔ)器單元的值直接顯示為十進(jìn)制?

答:暫停ads,修改相關(guān)參數(shù),即可顯示

同組同學(xué):

10002201孫郡遙

10002304陸海霞

10002302祁蕾

10002308梁玉

實(shí)驗(yàn)二熟悉LINUX開發(fā)環(huán)境

實(shí)驗(yàn)?zāi)康?

熟悉Linux開發(fā)環(huán)境,學(xué)會(huì)基于S3c2410的Linux開發(fā)環(huán)境的配置和使用。使用L

inux的

armv41-unknown-1inux-gcc編譯,使用基于NFS方式的下載調(diào)試,了解嵌入式開發(fā)的

基本

過程。

實(shí)驗(yàn)環(huán)境:

硬件:UP-NETARM2410-S嵌入式實(shí)驗(yàn)平臺(tái)、PC機(jī)Pentium500以上,硬盤10G以上。

軟件:PC機(jī)操作系統(tǒng)REDHATLINUX9.0+MINIC0M+ARM-LINUX開發(fā)環(huán)境

實(shí)驗(yàn)內(nèi)容:

1、本次實(shí)驗(yàn)使用RedhatLinux9.0操作系統(tǒng)環(huán)境,安裝ARM-Linux的開發(fā)庫及編譯

器。

2、創(chuàng)建一個(gè)新目錄,并在其中編寫hello,c和Makefi1e文獻(xiàn)。學(xué)習(xí)在Linux下的

編程和編譯過程.

3、ARM開發(fā)板的使用和開發(fā)環(huán)境的設(shè)立。

4、下載已經(jīng)編譯好的文獻(xiàn)到目的開發(fā)板上運(yùn)營。

實(shí)驗(yàn)環(huán)節(jié):

1、嵌入式交叉開發(fā)環(huán)境的建立

1)宿主機(jī)的環(huán)境搭建

選擇一種方式在宿主機(jī)上直接安裝Linux操作系統(tǒng),如安裝Redllat.

下載VMWare,解壓后根據(jù)提醒對的安裝VMWare到硬盤中;

運(yùn)營VMWare,根據(jù)向?qū)?chuàng)建一臺(tái)虛擬機(jī)并選擇Linux作為客戶操作系統(tǒng);

根據(jù)向?qū)О惭bRedHatLinux9.0

2)虛擬機(jī)中啟動(dòng)Linux操作系統(tǒng)

用戶名:root密碼:12345678

將Windows下的e盤設(shè)為共享目錄,則在Linux的/mnt/hgfs/目錄下就可以訪問到W

indows下的e盤了。

3)開發(fā)工具軟件的安裝

1、安裝gcc

在Linux主窗口中單擊鼠標(biāo)右鍵,選擇“新建終端”命令,打開Linux命令行窗口。在目錄

/mnt/hgfs/e/Linuxv7.2/arm41—too1s/下找到gcc的安裝文獻(xiàn)insta11.sh并

執(zhí)行它。操作命令如下:

[]#1s

[]#./insta11.sh

2、配置PATH途徑

/root/下有一個(gè)".bashProfile”文獻(xiàn)(由于該文獻(xiàn)是隱藏文獻(xiàn),所以需要用“Is-a”

命令才干顯示);

用vi編輯器編輯該文獻(xiàn):

[]#vi.bash_Profile

將文獻(xiàn)中PATH變量改為PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;

存盤后執(zhí)行

口#source.bash_profi1e

以后armv41-unknown-1inux-gcc將會(huì)被自動(dòng)搜索到。

4)宿主機(jī)上的開發(fā)環(huán)境配置

1、配置IP地址

實(shí)驗(yàn)箱的IP地址是192.168.0.115,所以可以把主機(jī)的IP配置成192.168.0.121,

具體配置時(shí)間方法如下:

[]#ifconfigethO192.168.0.121

在Linux中選擇“Red”菜單一>“系統(tǒng)設(shè)立”一〉“網(wǎng)絡(luò)”,打開“網(wǎng)絡(luò)配置”窗口,雙擊

設(shè)備ethO的藍(lán)色區(qū)域,進(jìn)入以太網(wǎng)設(shè)立界面。

2、關(guān)閉防火墻

單擊“Red”菜單一〉“系統(tǒng)設(shè)立”一>安全級別,打開“安全級別配置”窗口,選擇“無防火

墻”選項(xiàng)。

3、配置NFS

單擊“Red”菜單->系統(tǒng)設(shè)立-〉服務(wù)器設(shè)立->服務(wù),在“服務(wù)配置”窗口中勾選nfs,

單擊“開始”

4、NFS設(shè)立

單擊“Red”菜單->系統(tǒng)設(shè)立->服務(wù)器設(shè)立->NFS服務(wù)器,打開“NFS服務(wù)器配置”窗口,

設(shè)立NFS共享。單擊增長,在“目錄”文本框中填入需要共享的途徑,在主機(jī)文本框中填入

允許進(jìn)行連接的主機(jī)IP地址。選擇允許客戶對共享目錄的操作為只讀或讀寫。最后退出時(shí)

則完畢NFS配置。配置好后,界面應(yīng)顯示如下圖所示:

NFS服務(wù)器。

文件(E)幫助

I…?…I,尊谷

,添加?;,巴."D幫助(H)

目錄|主機(jī)|權(quán)限

/arm2410s192.168.0.*Read/Write

至此,交叉開發(fā)環(huán)境的主機(jī)部分派置完畢。

5)目的機(jī)的信息輸出

使用超級終端介紹宿主機(jī)與實(shí)驗(yàn)箱的通信。

一方面連接串口線:一端連接PC的串口(C0M1),另一端連接到UP-NETARM2410-S實(shí)驗(yàn)箱

的串口。接下來建立超級終端:運(yùn)營Windows系統(tǒng)下的“開始”-“所有程序”-“附件

“通訊”一“超級終端”,新建一個(gè)通信終端。

文件(E)編輯(日杳看(V)終端CD標(biāo)簽幫助(t±>

W?lco

MnicomConrrandSunrniry

OPTIO

root的主IConpiConrrandscanbecalledbyCTRL-A<key>

MinFunclionsOiherFunclions

DialingdirectoryDrunscript(Go)....GClearScreen......

回收卻/$ASendf-i1us.......ReceivefilesRc5figureMnicom.O

/bin/conmParanvters..PAddIinefeed.Suspendminicom...

/$/Captureon/off...Ll^ngup........eXitandreset....X

asendbreak.......FinitializeM)dem...MQjiIwithnoresetQ

TerminalsellingsTrunKermitCursorkeynude...1

1ineW-apon/off..W1oca1Echoon/off..EHe1pscreen........Z

scro11Back........B

SelectfunctionorpressEnIerfornone.

WittenbyMque1vanSnoorenburgr1991-1995

SontadditionsbyJukkaLahlinen1997-2000

i18nbyArnaIdoCarva1hodeM?Io1998

6)程序的運(yùn)營

打開超級終端,打開實(shí)驗(yàn)箱電源開關(guān),系統(tǒng)會(huì)由vivi開始引導(dǎo)。正常顯示時(shí)會(huì)顯示啟動(dòng)信息

到“PressReturntostarttheLINUXnow,anyotherkeyforvivi",假如不

進(jìn)行任何操作等待30s或按回車鍵則啟動(dòng)進(jìn)入Linux系統(tǒng);假如按回車鍵以外的其他鍵則

進(jìn)入vivi控制臺(tái)。在這里輸入boot,會(huì)引導(dǎo)Kernel啟動(dòng)Linux系統(tǒng)。Linux系統(tǒng)啟動(dòng)

完畢后,屏幕顯示:[/mnt/yaffs]

root(3>localhost:-

文件編輯查看終端CD標(biāo)簽《國柄助(旦)

W?1com?tominicom2.4)0.0

OPT!Cb6:IlistoryBuffer.F-keyMeros.SearchHistoryBuffer.118n

?t的IConpiIedonJun152004.20:45:27.

[可收卻/$ATS7=45—[configruraConfigrurationsaved

/bin/ash:c1enanvsand

/$/bin/ashetransfer

Serialportsetup

M)demanddia1ingr

Screenandkeyboard

基于Linux的應(yīng)用程序的開發(fā)環(huán)節(jié)

1、建立工作目錄

[root@zxtsmile]#mkdirhello

[root@zxtsmile]#cdhello

2、編寫程序源代碼

在Linux下的文本編輯器有許多,常用的是vim和Xwindow界面下的gedit等,我們在

發(fā)過程中推薦使用vim,用戶需要學(xué)習(xí)vim的操作方法,請參考相關(guān)書籍中的關(guān)于vim的

操作指南。Kdevelope、anjuta軟件的界面與vc6.0類似,使用它們對于熟悉windows

環(huán)境下開發(fā)的用戶更容易上手。

實(shí)際的hello,c源代碼較簡樸,如下:

#incIude<stdio.h>

main()

(

printf("helloworld\n");

)

我們可以是用下面的命令來編寫he11o.c的源代碼,進(jìn)入hello目錄使用vi命令來編

輯代

碼:

[root@zxthe1lo]itvihe11o.c

按“i”或者“a”進(jìn)入編輯模式,將上面的代碼錄入進(jìn)去,完畢后按Esc鍵進(jìn)入命令狀態(tài),再

用命令“:wq”保存并退出。這樣我們便在當(dāng)前目錄下建立了一個(gè)名為hello,c的文獻(xiàn)。

3、編寫Makefile

要使上面的hello.c程序可以運(yùn)營,我們必須要編寫一個(gè)Makefi1e文獻(xiàn),Makefile

文獻(xiàn)

定義了一系列的規(guī)則,它指明了哪些文獻(xiàn)需要編譯,哪些文獻(xiàn)需要先編譯,哪些文獻(xiàn)需要

重新編譯等等更為復(fù)雜的命令。使用它帶來的好處就是自動(dòng)編譯,你只需要敲一個(gè)"make”

命令整個(gè)工程就可以實(shí)現(xiàn)自動(dòng)編譯,當(dāng)然我們本次實(shí)驗(yàn)只有一個(gè)文獻(xiàn),它還不能體現(xiàn)出使

用Makefile的優(yōu)越性,但當(dāng)工程比較大文獻(xiàn)比較多時(shí),不使用Makefile幾乎是不也許

的。

下面我們介紹本次實(shí)驗(yàn)用到的Makefile文獻(xiàn)。

CC=armv41-unknown_1inux-gcc

EXEC=he11o

OBJS=he11o.o

CFLAGS+=

LDFLAGS+=-static

all:$(EXEC)

$(EXEC):$(OBJS)

$(CC)$(LDFLAGS)-o$@$(OBJS)

clean:

—rm-f$(EXEC)*.elf*.gdb*.o

下面我們來簡樸介紹這個(gè)Makefile文獻(xiàn)的幾個(gè)重要部分:

CC指明編譯器

EXEC表達(dá)編譯后生成的執(zhí)行文獻(xiàn)名稱

OBJS目的文獻(xiàn)列表

CFLAGS編譯參數(shù)

LDFLAGS連接參數(shù)

a11:編譯主入口

clean:清除編譯結(jié)果

與上面編寫he1lo.c的過程類似,用vi來創(chuàng)建一個(gè)Makefile文獻(xiàn)并將代碼錄入其

[root@zxthello]#viMakefi1e

4、編譯應(yīng)用程序

在上面的環(huán)節(jié)完畢后,我們就可以在hell。目錄下運(yùn)營"make”來編譯我們的程序了。假如

進(jìn)行了修改,重新編譯則運(yùn)營:

[root@zxthello]#makec1ean

[root@zxtheHo]#make

5、下載調(diào)試

在宿主PC計(jì)算機(jī)上啟動(dòng)NFS服務(wù),并設(shè)立好共享的目錄,具體配置請參照前面第一章

第四

節(jié)中關(guān)于嵌入式Linux環(huán)境開發(fā)環(huán)境的建立。在建立好NFS共享目錄以后,我們就可以進(jìn)

入MINIC0M中建立開發(fā)板與宿主PC機(jī)之間的通訊了。

[root@zxthe11o]#minicom

[/mnt/yaffs]mount—tnfs-onolock192.168.0.56:/arm241Os/host

假如不想使用我們提供的源碼的話,可以再建立一個(gè)NFS共享文獻(xiàn)夾。如/root/share,我

們把我們自己編譯生成的可執(zhí)行文獻(xiàn)復(fù)制到該文獻(xiàn)夾下,并通過MINIC0M掛載到開發(fā)板上。

[root@zxthel1o]#cphel1o/root/share

[root@zxthellominicom

[/mnt/yaffs]mount-tnfs-onolock192.168.0.56:/root/share/

host

再進(jìn)入/host目錄運(yùn)營剛剛編譯好的hell。程序,查看運(yùn)營結(jié)果。

[/mnt/yaffs]cd/host

[/host]./hello

hellowor1d

實(shí)驗(yàn)思考:

1.Makefi1e是如何工作的?其中的宏定義分別是什么意思?

答:解釋makefile如何工作:makefile是一個(gè)文本文獻(xiàn),用于描述程序源代碼之間以

及程序可執(zhí)行代碼與源代碼之間的依賴關(guān)系。A簡樸例子:最終編譯生成的可執(zhí)行文獻(xiàn)ab.ou

t是由a.c和b.c共同編譯生成的,那么make文獻(xiàn)就要寫兩行:

ab.out:a.cb.c

gcca.cb.c-Oab.outA第一行描述了依賴關(guān)系,第二行描述了依賴關(guān)系是如何達(dá)

成的。

更復(fù)雜的例子:最終編譯生成的可執(zhí)行文獻(xiàn)ab.out是由a.c和b.obj功能編譯生成的,而

b.obj是由bl.c和b2.c編譯而成,那么要寫好多行:Mb.out:a.cb.obj

gcca.cb.obj-oab.out^b.obj:bl.cb2.cAgcc-cbl.cb2.c-ob.

objA這就是makefi1e的工作方法。A關(guān)于宏定義,簡樸點(diǎn)說就是文本替換。為了方便使

用不同的編譯器或者編譯環(huán)境以及硬件環(huán)境,一些復(fù)雜的軟件使用了大量的宏定義來代替諸

如“gcc

同組同學(xué):

10002201孫郡遙

10002304陸海霞

10002302祁蕾

10002308梁玉

實(shí)驗(yàn)三多線程應(yīng)用程序設(shè)計(jì)

實(shí)驗(yàn)?zāi)康模?/p>

了解多線程程序設(shè)計(jì)的基本原理。

學(xué)習(xí)pthread庫函數(shù)的使用。

實(shí)驗(yàn)環(huán)境:

硬件:UP-NETARM2410-S嵌入式實(shí)驗(yàn)平臺(tái),PC機(jī)Pentium500以上,硬盤40G以上,

內(nèi)存大

于128M。

軟件:PC機(jī)操作系統(tǒng)REDHATLINUX9.0+MINICOM+ARM-LINUX開發(fā)環(huán)境

實(shí)驗(yàn)內(nèi)容:

讀懂pthread.c的源代碼,熟悉幾個(gè)重要的PTHREAD庫函數(shù)的使用。掌握共享鎖和信號

的使用方法。

進(jìn)入/arm2410s/exp/basic/02_pthread目錄,運(yùn)營make產(chǎn)生pthread

程序,使用NFS方

式連接開發(fā)主機(jī)進(jìn)行運(yùn)營實(shí)驗(yàn)。

實(shí)驗(yàn)環(huán)節(jié):

1.實(shí)驗(yàn)源代碼與結(jié)構(gòu)流程圖

本實(shí)驗(yàn)為著名的生產(chǎn)者-消費(fèi)者問題模型的實(shí)現(xiàn),主程序中分別啟動(dòng)生產(chǎn)者線程和消費(fèi)者

線程。生產(chǎn)者線程不斷順序地將0到1000的數(shù)字寫入共享的循環(huán)緩沖區(qū),同時(shí)消費(fèi)者線程

不斷地從共享的循環(huán)緩沖區(qū)讀取數(shù)據(jù)。流程圖如下圖所示:

主程序

淚由

本實(shí)驗(yàn)具體代碼如下:

#include<stdio.h>

#inc1ude<std1ib.h>

#include<time.h>

ftinclude//pthread.h〃

#defineBUFFER_SIZE16

/*設(shè)立一個(gè)整數(shù)的圓形緩沖區(qū)*/

structprodcons{

intbuffer[BUFFER_SIZE];/*緩沖區(qū)數(shù)組*/

pthread_mutex_t1ock;/*互斥鎖*/

intreadpos,writepos;/*讀寫的位置文/

pthreadcondtnotempty;/*緩沖區(qū)非空信號*/

pthread_condtnotful1;/*緩沖區(qū)非滿信號*/

);

/*初始化緩沖區(qū)*/

voidinit(structprodcons*b)

(

pthread_mutex_init(&b->lock,NULL);

pthread_cond_init(&b->notempty,NDLL);

pthread_cond_init(&b->notfull,NULL);

b->readpos=0;

b->writepos=0;

}

/*向緩沖區(qū)中寫入一個(gè)整數(shù)*/

voidput(structprodcons*b,intdata)

(

pthread_mutexlock(&b->1ock);

/*等待緩沖區(qū)非滿*/

while((b->writepos4-1)%BUFFER_SIZE==b—>readpos)

printf("waitfornotfu1l\n〃);

pthread_condwait(&b->notfull,&b—>lock);

)

/大寫數(shù)據(jù)并且指針前移*/

b->buffer[b->writepos]=data;

b->writepos++;

if(b->writepos>=BUFFER_SIZE)b->writepos=0;

/*設(shè)立緩沖區(qū)非空信號文/

pthread_cond_signa1(&b—>notempty);

pthread_mutex_un1ock(&b->lock);

)

/*從緩沖區(qū)中讀出一個(gè)整數(shù)*/

intget(structprodcons*b)

(

intdata;

pthreadmutex_lock(&b->1ock);

/*等待緩沖區(qū)非空文/

while(b->writepos==b->readpos){

printfC'waitfornotempty\nz,);

pthread_condwait(&b->notempty,&b->lock);

)

/文讀數(shù)據(jù)并且指針前移*/

data=b->buffer[b->readpos];

b->readpos++;

if(b->readpos>=BUFFER_SIZE)b->readpos=0:

/*設(shè)立緩沖區(qū)非滿信號*/

pthread_cond_signa1(&b->notful1);

pthread_mutex_un1ock(6b->lock);

returndata;

}

^defineOVER(-1)

structprodconsbuffer;

void*producer(void*data)

into;

for(n=0;n<1000;n++){

printf("put->%dn);

put(&buffer,n);

)

put(&buffer,OVER);

printf("producerstopped!\n〃);

returnNULL;

)

void*consumer(void*data)

(

intd;

while(1){

d=get(&buffer);

if(d二二OVER)break;

printf(H%d—>get\n\d);

)

printf(〃consumerstopped!\n");

returnNULL;

intmain(void)

pthread_tth_a,th_b;

void*retval;

init(&buffer);

pthread_ereate(&th_a,NULL,producer,0);

pthread_create(&th_b,NULL,consumer,0);

/*等待生產(chǎn)者和消費(fèi)者結(jié)束*/

pthread_join(tha,&retval);

pthread_join(th_b,&retval);

return0;

)

3.重要函數(shù)分析:

下面我們來看一下,生產(chǎn)者寫入緩沖區(qū)和消費(fèi)者從緩沖區(qū)讀數(shù)的具體流程,生產(chǎn)者一方面要

獲得互斥鎖,并且判斷寫指針+1后是否等于讀指針,假如相等則進(jìn)入等待狀態(tài),等候條件

變量notfull;假如不等則向緩沖區(qū)中寫一個(gè)整數(shù),并且設(shè)立條件變量為notempty,最后

釋放互斥鎖。消費(fèi)者線程與生產(chǎn)者線程類似,這里就不再過多介紹了。流程圖如下:

進(jìn)行消費(fèi)Set)

生產(chǎn)者寫入共享的循環(huán)緩沖區(qū)函數(shù)PUT

voidput(structprodcons*b,intdata)

(

pthreadjnutex_1ock(&b->1ock);〃獲取互斥鎖

while((b->writepos+1)%BUFFER_SIZE==b->readpos){

〃假如讀寫位置相同

pthread_cond_wait(&b->notfu11,&b—>lock);

〃等待狀態(tài)變量6>!1。1加11,不滿則跳出阻塞

)

b->buffer[b->writepos]=data;//寫入數(shù)據(jù)

b->writepos++;

if(b—>writepos>=BUFFER_SIZE)b->writepos=0;

pthread_cond_sign

溫馨提示

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

評論

0/150

提交評論