




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 24498-2025建筑門窗、幕墻用密封膠條
- 戰(zhàn)略合作合同協(xié)議書(經(jīng)典)
- 租賃合同變更及轉(zhuǎn)讓協(xié)議模板
- 建筑承包合同協(xié)議書格式
- 張偉房地產(chǎn)開發(fā)合同糾紛案件解析
- 2024年人教版九年級中考英語現(xiàn)在進(jìn)行時(shí)教學(xué)設(shè)計(jì)
- 合伙創(chuàng)業(yè)合同書
- 加盟合作合同協(xié)議
- 10《青山處處埋忠骨》教學(xué)設(shè)計(jì)-2023-2024學(xué)年統(tǒng)編版語文五年級下冊
- 供水改造工程合同范本-施工專用
- 人教版小學(xué)六年級下冊音樂教案全冊
- 12J201平屋面建筑構(gòu)造圖集(完整版)
- 2024年個(gè)人信用報(bào)告(個(gè)人簡版)樣本(帶水印-可編輯)
- 20CS03-1一體化預(yù)制泵站選用與安裝一
- (完整版)四年級上冊數(shù)學(xué)豎式計(jì)算題100題直接打印版
- 數(shù)理統(tǒng)計(jì)考試試卷及答案解析
- 排水溝施工合同電子版(精選5篇)
- 2022年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院單招語文模擬試題及答案
- 《酒店品牌建設(shè)與管理》課程教學(xué)大綱
- TSG11-2020 鍋爐安全技術(shù)規(guī)程
- 大氣商務(wù)企業(yè)培訓(xùn)之團(tuán)隊(duì)合作的重要性PPT模板
評論
0/150
提交評論