092230017李建平-嵌入式實(shí)驗(yàn)報(bào)告_第1頁(yè)
092230017李建平-嵌入式實(shí)驗(yàn)報(bào)告_第2頁(yè)
092230017李建平-嵌入式實(shí)驗(yàn)報(bào)告_第3頁(yè)
092230017李建平-嵌入式實(shí)驗(yàn)報(bào)告_第4頁(yè)
092230017李建平-嵌入式實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

福建農(nóng)林大學(xué)金山學(xué)院(程序設(shè)計(jì)類課程)實(shí)驗(yàn)報(bào)告課程名稱:嵌入式Linux應(yīng)用開發(fā)姓名:李建平系:信息與機(jī)電工程系專業(yè):電子信息工程年級(jí):2009學(xué)號(hào):092230017指導(dǎo)教師:馬森林職稱:講師2012年12月9日

實(shí)驗(yàn)項(xiàng)目列表序號(hào)實(shí)驗(yàn)項(xiàng)目名稱成績(jī)指導(dǎo)教師1實(shí)驗(yàn)一、嵌入式linuxC語(yǔ)言開發(fā)工具2實(shí)驗(yàn)二、嵌入式Linux文件IO編程3實(shí)驗(yàn)三、嵌入式Linux多任務(wù)編程4實(shí)驗(yàn)四、NTP協(xié)議的客戶端實(shí)現(xiàn)56789101112

福建農(nóng)林大學(xué)金山學(xué)院實(shí)驗(yàn)報(bào)告系:信息與機(jī)電工程專業(yè):電子信息工程年級(jí):2009姓名:李建平學(xué)號(hào):092230017實(shí)驗(yàn)室號(hào)___田家炳406__計(jì)算機(jī)號(hào)實(shí)驗(yàn)時(shí)間:2012/11/7指導(dǎo)教師簽字:實(shí)驗(yàn)一嵌入式linuxC語(yǔ)言開發(fā)工具實(shí)驗(yàn)?zāi)康暮鸵笸ㄟ^(guò)指定指令的vim操作練習(xí),使讀者能夠熟練使用vim中的常見操作,并且熟悉vim的幾種模式,如果讀者能夠熟練掌握實(shí)驗(yàn)內(nèi)容中所要求的內(nèi)容,則表明對(duì)vim的操作已經(jīng)很熟練了。通過(guò)調(diào)試一個(gè)有問(wèn)題的程序,使讀者進(jìn)一步熟練使用vi操作,而且熟練掌握gcc編譯命令及gdb的調(diào)試命令,通過(guò)對(duì)有問(wèn)題程序的跟蹤調(diào)試,進(jìn)一步提高發(fā)現(xiàn)問(wèn)題和解決問(wèn)題的能力。這是一個(gè)很小的程序,希望讀者認(rèn)真調(diào)試。通過(guò)對(duì)包含多文件的makefile的編寫,熟悉各種形式的makefile,并且進(jìn)一步加深對(duì)makefile中用戶自定義變量、自動(dòng)變量及預(yù)定義變量的理解。4.通過(guò)使用autotools生成包含多文件的makefile,進(jìn)一步掌握autotools的使用方法。同時(shí),掌握Linux下安裝軟件的常用方法。實(shí)驗(yàn)步驟和原理vim使用練習(xí)(1)在“/root”目錄下建一個(gè)名為“vim”的目錄。(2)進(jìn)入“vim”目錄。(3)將文件“/etc/inittab”復(fù)制到“vim”目錄下。(4)使用vim打開“vim”目錄下的inittab。(5)設(shè)定行號(hào),指出設(shè)定initdefault(類似于“id:5:initdefault”)的所在行號(hào)。(6)將光標(biāo)移到該行。(7)復(fù)制該行內(nèi)容。(8)將光標(biāo)移到最后一行行首。(9)粘貼復(fù)制行的內(nèi)容。(10)撤銷第9步的動(dòng)作。(11)將光標(biāo)移動(dòng)到最后一行的行尾。(12)粘貼復(fù)制行的內(nèi)容。(13)光標(biāo)移到“si::sysinit:/etc/rc.d/rc.sysinit”。(14)刪除該行。(15)存盤但不退出。(16)將光標(biāo)移到首行。(17)插入模式下輸入“Hello,thisisviworld!”。(18)返回命令行模式。(19)向下查找字符串“0:wait”。(20)再向上查找字符串“halt”。(21)強(qiáng)制退出vim,不存盤。分別指出每個(gè)命令處于何種模式下?用gdb調(diào)試程序的bug(1)使用vi編輯器,將以下代碼輸入到名為greet.c的文件中。(2)使用gcc編譯這段代碼,注意要加上“-g”選項(xiàng)以方便之后的調(diào)試。(3)運(yùn)行生成的可執(zhí)行文件,觀察運(yùn)行結(jié)果。(4)使用gdb調(diào)試程序,通過(guò)設(shè)置斷點(diǎn)、單步跟蹤,一步步找出錯(cuò)誤所在。(5)糾正錯(cuò)誤,更改源程序并得到正確的結(jié)果。編寫包含多文件的makefile(1)用vi在同一目錄下編輯兩個(gè)簡(jiǎn)單的hello程序(2)仍在同一目錄下用vim編輯makefile,且不使用變量替換,用一個(gè)目標(biāo)體實(shí)現(xiàn)(即直接將hello.c和hello.h編譯成hello目標(biāo)體)。然后用make驗(yàn)證所編寫的makefile是否正確。(3)將上述makefile使用變量替換實(shí)現(xiàn)。同樣用make驗(yàn)證所編寫的makefile是否正確。(4)編輯另一個(gè)makefile,取名為makefile1,不使用變量替換,但用兩個(gè)目標(biāo)體實(shí)現(xiàn)(也就是首先將hello.c和hello.h編譯為hello.o,再將hello.o編譯為hello),再用make的“-f”選項(xiàng)驗(yàn)證這個(gè)makefile1的正確性。(5)將上述makefile1使用變量替換實(shí)現(xiàn)。4.使用autotools生成包含多文件的makefile(1)在原目錄下新建文件夾auto。(2)將上例的兩個(gè)代碼文件“hello.c”和“hello.h”復(fù)制到該目錄下。(3)使用autoscan生成configure.scan。(4)編輯configure.scan,修改相關(guān)內(nèi)容,并將其重命名為configure.in。(5)使用aclocal生成aclocal.m4。(6)使用autoconf生成configure。(7)使用autoheader生成config.h.in。(8)編輯makefile.am。(9)使用automake生成makefile.in。(10)使用configure生成makefile。(11)使用make生成hello可執(zhí)行文件,并在當(dāng)前目錄下運(yùn)行hello查看結(jié)果。(12)使用makeinstall將hello安裝到系統(tǒng)目錄下,并運(yùn)行,查看結(jié)果。(13)使用makedist生成hello壓縮包。(14)解壓hello壓縮包。(15)進(jìn)入解壓目錄。(16)在該目錄下安裝hello軟件。實(shí)驗(yàn)環(huán)境一套PXA270EP嵌入式實(shí)驗(yàn)箱。安裝Redhat9的宿主PC機(jī),并且配置好ARMLinux的開發(fā)環(huán)境。算法描述Linux編程工具編譯工具:在Linux下支持大量的語(yǔ)言,有C、C++、Java、Pascal、Fortran、COBOL等等。在實(shí)驗(yàn)以C語(yǔ)言為主。在使用這些編譯工具時(shí),是使用命令行方式的,也就是說(shuō),先用編輯工具輸入源程序,然后再執(zhí)行一長(zhǎng)串的命令(參數(shù)比較復(fù)雜)進(jìn)行編譯。例如:gcc–ohellohello.c就是將hello.c編譯為hello,然后你還需要為其賦予可執(zhí)行的權(quán)限,這樣才完成了整個(gè)工作。調(diào)試過(guò)程出錯(cuò)信息:調(diào)試成功:實(shí)驗(yàn)結(jié)果總結(jié)通過(guò)指定指令的vim操作練習(xí),我可以熟練使用vim中的常見操作,并且熟悉vim的幾種模式。接著調(diào)試一個(gè)有問(wèn)題的程序,我進(jìn)一步熟練使用vi操作,而且熟練掌握gcc編譯命令及gdb的調(diào)試命令,通過(guò)對(duì)有問(wèn)題程序的跟蹤調(diào)試,進(jìn)一步提高發(fā)現(xiàn)問(wèn)題和解決問(wèn)題的能力。附錄:Greet.c文件源碼:#include<stdio.h>#include<malloc.h>#include<string.h>intdisplay1(char*string);intdisplay2(char*string1);intmain(){ charstring[]="EmbedddedLinux"; display1(string); display2(string);}intdisplay1(char*string){ printf("Theoriginalstringis%s\n",string);}intdisplay2(char*string1){ char*string2; intsize,i; size=strlen(string1); string2=(char*)malloc(sizeof(size+1)); for(i=0;i<size;i++) { string2[size-i]=string1[i]; } string2[size+1]=''; printf("Thestringafterwardis%s\n",string2);}福建農(nóng)林大學(xué)金山學(xué)院實(shí)驗(yàn)報(bào)告系:信息與機(jī)電工程專業(yè):電子信息工程年級(jí):2009姓名:李建平學(xué)號(hào):092230017實(shí)驗(yàn)室號(hào)___田家炳406__計(jì)算機(jī)號(hào)實(shí)驗(yàn)時(shí)間:2012/11/21指導(dǎo)教師簽字:實(shí)驗(yàn)二嵌入式Linux文件IO編程實(shí)驗(yàn)?zāi)康暮鸵笸ㄟ^(guò)編寫文件讀寫及上鎖的程序,進(jìn)一步熟悉Linux中文件I/O相關(guān)的應(yīng)用開發(fā),并且熟練掌握open()、read()、write()、fcntl()等函數(shù)的使用。通過(guò)編寫多路復(fù)用串口讀寫,進(jìn)一步理解多路復(fù)用函數(shù)的用法,同時(shí)更加熟練掌握Linux設(shè)備文件的讀寫方法。實(shí)驗(yàn)內(nèi)容和原理文件的讀寫與上鎖在Linux中FIFO是一種進(jìn)程之間的管道通信機(jī)制。Linux支持完整的FIFO通信機(jī)制。本實(shí)驗(yàn)內(nèi)容比較有趣,我們通過(guò)使用文件操作,仿真FIFO(先進(jìn)先出)結(jié)構(gòu)以及生產(chǎn)者-消費(fèi)者運(yùn)行模型。本實(shí)驗(yàn)中需要打開兩個(gè)虛擬終端,分別運(yùn)行生產(chǎn)者程序(producer)和消費(fèi)者程序(customer)。此時(shí)兩個(gè)進(jìn)程同時(shí)對(duì)同一個(gè)文件進(jìn)行讀寫操作。因?yàn)檫@個(gè)文件是臨界資源,所以可以使用文件鎖機(jī)制來(lái)保證兩個(gè)進(jìn)程對(duì)文件的訪問(wèn)都是原子操作。先啟動(dòng)生產(chǎn)者進(jìn)程,它負(fù)責(zé)創(chuàng)建仿真FIFO結(jié)構(gòu)的文件(其實(shí)是一個(gè)普通文件)并投入生產(chǎn),就是按照給定的時(shí)間間隔,向FIFO文件寫入自動(dòng)生成的字符(在程序中用宏定義選擇使用數(shù)字還是使用英文字符),生產(chǎn)周期以及要生產(chǎn)的資源數(shù)通過(guò)參數(shù)傳遞給進(jìn)程(默認(rèn)生產(chǎn)周期為1秒,要生產(chǎn)的資源總數(shù)為10個(gè)字符,顯然默認(rèn)生產(chǎn)總時(shí)間為10秒鐘)。后啟動(dòng)的消費(fèi)者進(jìn)程按照給定的數(shù)目進(jìn)行消費(fèi),首先從文件中讀取相應(yīng)數(shù)目的字符并在屏幕上顯示,然后從文件中刪除剛才消費(fèi)過(guò)的數(shù)據(jù)。為了仿真FIFO結(jié)構(gòu),此時(shí)需要使用兩次拷貝來(lái)實(shí)現(xiàn)文件內(nèi)容的偏移。每次消費(fèi)的資源數(shù)通過(guò)參數(shù)傳遞給進(jìn)程,默認(rèn)值為10個(gè)字符。 2.多路復(fù)用式串口操作本實(shí)驗(yàn)中,實(shí)現(xiàn)兩臺(tái)機(jī)器(宿主機(jī)和目標(biāo)板)之間的串口通信,而且每臺(tái)機(jī)器均可以發(fā)送和接收數(shù)據(jù)。除了串口設(shè)備名稱不同(宿主機(jī)上使用串口1:/dev/ttyS0,而在目標(biāo)板上使用串口5:/dev/ttyS1),兩臺(tái)機(jī)器上的程序基本相同。首先程序打開串口設(shè)備文件并進(jìn)行相關(guān)配置。調(diào)用select()函數(shù),使它等待從標(biāo)準(zhǔn)輸入(終端)文件中的輸入以及從串口設(shè)備的輸入。如果有標(biāo)準(zhǔn)輸入上的數(shù)據(jù),則寫入到串口,使對(duì)方讀取。如果有串口設(shè)備上的輸入,則將數(shù)據(jù)寫入到普通文件中。實(shí)驗(yàn)環(huán)境一套PXA270EP嵌入式實(shí)驗(yàn)箱。安裝Redhat9的宿主PC機(jī),并且配置好ARMLinux的開發(fā)環(huán)境。算法描述及實(shí)驗(yàn)步驟1、文件的讀寫與上鎖2、多路復(fù)用式串口操作調(diào)試過(guò)程錯(cuò)誤判斷:lock_set函數(shù)未導(dǎo)入聲明錯(cuò)誤判斷:uart_api.h頭文件未包含錯(cuò)誤判斷:聲明的參數(shù)類型有誤實(shí)驗(yàn)結(jié)果總結(jié)本次實(shí)驗(yàn)主要練習(xí)了文件的讀寫及上鎖,多路復(fù)用式串口操作,例子上的源程序存在許多不足,需要對(duì)其進(jìn)行修改。這就用到了上次實(shí)驗(yàn)的內(nèi)容,gdb調(diào)試工具,另外本實(shí)驗(yàn)對(duì)文件操作所調(diào)用的系統(tǒng)api的函數(shù)有open()、read()、write()、fcntl(),通過(guò)FIFO的管道通信機(jī)制,將兩個(gè)進(jìn)程聯(lián)系起來(lái),實(shí)現(xiàn)半雙工通信。附錄:1、com_host.c/*com_host.c*/#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<fcntl.h>#include<sys/types.h>#include<sys/stat.h>#include<errno.h>#include"uart_api.h"intmain(void){ intfds[SEL_FILE_NUM],recv_fd,maxfd; charbuff[BUFFER_SIZE]; fd_setinset,tmp_inset; structtimevaltv; unsignedloop=1; intres,real_read,i; /*將從串口讀取的數(shù)據(jù)寫入到這個(gè)文件中*/ if((recv_fd=open(RECV_FILE_NAME,O_CREAT|O_WRONLY,0644))<0) { perror("open"); return1; } fds[0]=STDIN_FILENO;/*標(biāo)準(zhǔn)輸入*/ if((fds[1]=open_port(HOST_COM_PORT))<0)/*打開串口*/ { perror("open_port"); return1; } if(set_com_config(fds[1],115200,8,'N',1)<0)/*配置串口*/ { perror("set_com_config"); return1; } FD_ZERO(&inset); FD_SET(fds[0],&inset); FD_SET(fds[1],&inset); maxfd=(fds[0]>fds[1])?fds[0]:fds[1]; tv.tv_sec=TIME_DELAY; tv.tv_usec=0; printf("Inputsomewords(enter'quit'toexit):\n"); while(loop&&(FD_ISSET(fds[0],&inset)||FD_ISSET(fds[1],&inset))) { tmp_inset=inset; res=select(maxfd+1,&tmp_inset,NULL,NULL,&tv); switch(res) { case-1:/*錯(cuò)誤*/ { perror("select"); loop=0; } break; case0:/*超時(shí)*/ { perror("selecttimeout"); loop=0; } break; default: { for(i=0;i<SEL_FILE_NUM;i++) { if(FD_ISSET(fds[i],&tmp_inset)) { memset(buff,0,BUFFER_SIZE); /*讀取標(biāo)準(zhǔn)輸入或者串口設(shè)備文件*/ real_read=read(fds[i],buff,BUFFER_SIZE); if((real_read<0)&&(errno!=EAGAIN)) { loop=0; } elseif(!real_read) { close(fds[i]); FD_CLR(fds[i],&inset); } else { buff[real_read]='\0'; if(i==0) {/*將從終端讀取的數(shù)據(jù)寫入到串口*/ write(fds[1],buff,strlen(buff)); printf("Inputsomewords (enter'quit'toexit):\n"); } elseif(i==1) {/*將從串口讀取的數(shù)據(jù)寫入到普通文件中*/ write(recv_fd,buff,real_read); } if(strncmp(buff,"quit",4)==0) {/*如果讀取為'quit'則退出*/ loop=0; } } }/*endofifFD_ISSET*/ }/*fori*/ } }/*endofswitch*/ }/*endofwhile*/ close(recv_fd); return0;}2、lock_set.c/*lock_set.c*/intlock_set(intfd,inttype){ structflockold_lock,lock; lock.l_whence=SEEK_SET; lock.l_start=0; lock.l_len=0; lock.l_type=type; lock.l_pid=-1; /*判斷文件是否可以上鎖*/ fcntl(fd,F_GETLK,&lock); if(lock.l_type!=F_UNLCK) { /*判斷文件不能上鎖的原因*/ if(lock.l_type==F_RDLCK)/*該文件已有讀取鎖*/ { printf("Readlockalreadysetby%d\n",lock.l_pid); } elseif(lock.l_type==F_WRLCK)/*該文件已有寫入鎖*/ { printf("Writelockalreadysetby%d\n",lock.l_pid); } } /*l_type可能已被F_GETLK修改過(guò)*/ lock.l_type=type; /*根據(jù)不同的type值進(jìn)行阻塞式上鎖或解鎖*/ if((fcntl(fd,F_SETLKW,&lock))<0) { printf("Lockfailed:type=%d\n",lock.l_type); return1; } switch(lock.l_type) { caseF_RDLCK: { printf("Readlocksetby%d\n",getpid()); } break; caseF_WRLCK: { printf("Writelocksetby%d\n",getpid()); } break; caseF_UNLCK: { printf("Releaselockby%d\n",getpid()); return1; } break; default: break; }/*endofswitch*/ return0;}

福建農(nóng)林大學(xué)金山學(xué)院實(shí)驗(yàn)報(bào)告系:信息與機(jī)電工程專業(yè):電子信息工程年級(jí):2009姓名:李建平學(xué)號(hào):092230017實(shí)驗(yàn)室號(hào)___田家炳406__計(jì)算機(jī)號(hào)實(shí)驗(yàn)時(shí)間:2012/11/28指導(dǎo)教師簽字:實(shí)驗(yàn)三嵌入式Linux多任務(wù)編程實(shí)驗(yàn)?zāi)康暮鸵笸ㄟ^(guò)編寫多進(jìn)程程序,使讀者熟練掌握f(shuō)ork()、exec()、wait()和waitpid()等函數(shù)的使用,進(jìn)一步理解在Linux中多進(jìn)程編程的步驟。通過(guò)編寫一個(gè)完整的守護(hù)進(jìn)程,使讀者掌握守護(hù)進(jìn)程編寫和調(diào)試的方法,并且進(jìn)一步熟悉如何編寫多進(jìn)程程序。通過(guò)編寫有名管道多路通信實(shí)驗(yàn),讀者可進(jìn)一步掌握管道的創(chuàng)建、讀寫等操作,同時(shí),也復(fù)習(xí)使用select()函數(shù)實(shí)現(xiàn)管道的通信。通過(guò)編寫共享內(nèi)存實(shí)驗(yàn),讀者可以進(jìn)一步了解使用共享內(nèi)存的具體步驟,同時(shí)也進(jìn)一步加深對(duì)共享內(nèi)存的理解。在本實(shí)驗(yàn)中,采用信號(hào)量作為同步機(jī)制完善兩個(gè)進(jìn)程(“生產(chǎn)者”和“消費(fèi)者”)之間的通信。其功能類似于“消息隊(duì)列”小節(jié)中的實(shí)例。在實(shí)例中使用信號(hào)量同步機(jī)制。實(shí)驗(yàn)內(nèi)容和原理編寫多進(jìn)程程序該實(shí)驗(yàn)有3個(gè)進(jìn)程,其中一個(gè)為父進(jìn)程,其余兩個(gè)是該父進(jìn)程創(chuàng)建的子進(jìn)程,其中一個(gè)子進(jìn)程運(yùn)行“l(fā)s-l”指令,另一個(gè)子進(jìn)程在暫停5s之后異常退出,父進(jìn)程先用阻塞方式等待第一個(gè)子進(jìn)程的結(jié)束,然后用非阻塞方式等待另一個(gè)子進(jìn)程的退出,等待收集到第二個(gè)子進(jìn)程結(jié)束的信息,父進(jìn)程就返回。編寫守護(hù)進(jìn)程在該實(shí)驗(yàn)中,讀者首先創(chuàng)建一個(gè)子進(jìn)程1(守護(hù)進(jìn)程),然后在該子進(jìn)程中新建一個(gè)子進(jìn)程2,該子進(jìn)程2暫停10s,然后自動(dòng)退出,并由子進(jìn)程1收集子線程退出的消息。在這里,子進(jìn)程1和子進(jìn)程2的消息都在系統(tǒng)日志文件(例如“/var/log/messages”,日志文件的全路徑名因版本的不同可能會(huì)有所不同)中輸出。在向日志文件寫入消息之后,守護(hù)進(jìn)程(子進(jìn)程1)循環(huán)暫停,其間隔時(shí)間為10s。有名管道通信實(shí)驗(yàn)讀者還記得第5章多路復(fù)用小節(jié)中的例子嗎?其實(shí),在那個(gè)實(shí)驗(yàn)中,我們都用到有名管道(使用mknod命令創(chuàng)建)和多路復(fù)用(使用poll()函數(shù))。以下實(shí)驗(yàn)在功能上跟這個(gè)實(shí)驗(yàn)完全相同,這里只是用管道函數(shù)創(chuàng)建有名管道(并不是在控制臺(tái)下輸入命令),而且使用select()函數(shù)替代poll()函數(shù)實(shí)現(xiàn)多路復(fù)用(使用select()函數(shù)是出于以演示為目的)。共享內(nèi)存實(shí)驗(yàn)該實(shí)現(xiàn)要求利用共享內(nèi)存實(shí)現(xiàn)文件的打開和讀寫操作。實(shí)驗(yàn)環(huán)境一套PXA270EP嵌入式實(shí)驗(yàn)箱。安裝Redhat9的宿主PC機(jī),并且配置好ARMLinux的開發(fā)環(huán)境。算法描述及實(shí)驗(yàn)步驟1、編寫多進(jìn)程程序2、編寫守護(hù)進(jìn)程3、有名管道通信實(shí)驗(yàn)4、共享內(nèi)存實(shí)驗(yàn)調(diào)試過(guò)程編寫多進(jìn)程程序?qū)嶒?yàn)結(jié)果編寫多進(jìn)程程序編寫守護(hù)進(jìn)程有名管道通信共享內(nèi)存總結(jié)通過(guò)編寫多進(jìn)程程序,我熟練掌握f(shuō)ork()、exec()、wait()和waitpid()等函數(shù)的使用,并且進(jìn)一步理解在Linux中多進(jìn)程編程的步驟。通過(guò)編寫有名管道多路通信實(shí)驗(yàn),我進(jìn)一步掌握管道的創(chuàng)建、讀寫等操作,同時(shí),也復(fù)習(xí)使用select()函數(shù)實(shí)現(xiàn)管道的通信。通過(guò)編寫共享內(nèi)存實(shí)驗(yàn),我進(jìn)一步了解使用共享內(nèi)存的具體步驟,同時(shí)也進(jìn)一步加深對(duì)共享內(nèi)存的理解。附錄:producer.c#include"shm_com.h"#include"sem_com.h"intmain(){ void*shared_memory=NULL; structshm_buff*shm_buff_inst; intshmid,semid; semid=semget(ftok(".",'a'),1,0666); if(semid==-1) { perror("Producerisn'texist\n"); exit(1); } shmid=shmget(ftok(".",'b'),sizeof(structshm_buff),0666|IPC_CREAT); if(shmid==-1) { perror("shmget\n"); exit(1); } shared_memory=shmat(shmid,(void*)0,0); if(shared_memory==(void*)-1) { perror("shmat\n"); exit(1); } printf("Memoryattachedat%X\n",(int)shared_memory); shm_buff_inst=(structshm_buff*)shared_memory; do { sem_p(semid); printf("Sharedmemorywaswrittenbyprocess%d:%s\n",shm_buff_inst->pid,shm_buff_inst->buffer); if(strncmp(shm_buff_inst->buffer,"quit",4)==0) { break; } shm_buff_inst->pid=0; memset(shm_buff_inst->buffer,0,SHM_BUFF_SZ); sem_v(semid); sleep(3); }while(1); if(shmdt(shared_memory)==-1) { perror("shmdt\n"); exit(1); } if(shmctl(shmid,IPC_RMID,NULL)==-1) { perror("shmctl(IPC_RMID)"); exit(1); } exit(0);}Customer.c#include"shm_com.h"#include"sem_com.h"#include<signal.h>#include<stdio.h>intignore_signal(void){ signal(SIGINT,SIG_IGN); signal(SIGSTOP,SIG_IGN); signal(SIGQUIT,SIG_IGN); return0;}intmain(){ void*shared_memory=NULL; structshm_buff*shm_buff_inst; charbuffer[BUFSIZ]; intshmid,semid; ignore_signal(); semid=semget(ftok(".",'a'),1,0666|IPC_CREAT); init_sem(semid,5); shmid=shmget(ftok(".",'b'),sizeof(structshm_buff),0666|IPC_CREAT); if(shmid==-1) { perror("shmgetfailed"); del_sem(semid); exit(1); } shared_memory=shmat(shmid,(void*)0,0); if(shared_memory==(void*)-1) { perror("shmat"); del_sem(semid); exit(1); } printf("Memoryattacgedat%X\n",(int)shared_memory); shm_buff_inst=(structshm_buff*)shared_memory; do { sem_p(semid); printf("Entersometexttothesharedmemory(enter'quit'toexit):"); if(fgets(shm_buff_inst->buffer,SHM_BUFF_SZ,stdin)==NULL) { perror("fqets"); sem_v(semid); break; } shm_buff_inst->pid=getpid(); sem_v(semid); }while(strncmp(shm_buff_inst->buffer,"quit",4)!=0); del_sem(semid); if(shmdt(shared_memory)==-1) { perror("shmdt\n"); exit(1); } exit(0);}

福建農(nóng)林大學(xué)金山學(xué)院實(shí)驗(yàn)報(bào)告系:信息與機(jī)電工程專業(yè):電子信息工程年級(jí):2009姓名:李建平學(xué)號(hào):092230017實(shí)驗(yàn)室號(hào)___田家炳406__計(jì)算機(jī)號(hào)實(shí)驗(yàn)時(shí)間:2012/12/5指導(dǎo)教師簽字:實(shí)驗(yàn)四嵌入式Linux文件網(wǎng)絡(luò)編程——NTP協(xié)議的客戶端實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康暮鸵笸ㄟ^(guò)實(shí)現(xiàn)NTP協(xié)議的練習(xí),進(jìn)一步掌握Linux網(wǎng)絡(luò)編程,并且提高協(xié)議的分析與實(shí)現(xiàn)能力,為參與完成綜合性項(xiàng)目打下良好的基礎(chǔ)通過(guò)編寫多路復(fù)用串口讀寫,進(jìn)一步理解多路復(fù)用函數(shù)的用法,同時(shí)更加熟練掌握Linux設(shè)備文件的讀寫方法。實(shí)驗(yàn)內(nèi)容和原理NetworkTimeProtocol(NTP)協(xié)議是用來(lái)使計(jì)算機(jī)時(shí)間同步化的一種協(xié)議,它可以使計(jì)算機(jī)對(duì)其服務(wù)器或時(shí)鐘源(如石英鐘,GPS等)做同步化,它可以提供高精確度的時(shí)間校正(LAN上與標(biāo)準(zhǔn)時(shí)間差小于1毫秒,WAN上幾十毫秒),且可用加密確認(rèn)的方式來(lái)防止惡毒的協(xié)議攻擊。NTP提供準(zhǔn)確時(shí)間,首先要有準(zhǔn)確的時(shí)間來(lái)源,這一時(shí)間應(yīng)該是國(guó)際標(biāo)準(zhǔn)時(shí)間UTC。NTP獲得UTC的時(shí)間來(lái)源可以是原子鐘、天文臺(tái)、衛(wèi)星,也可以從Internet上獲取。這樣就有了準(zhǔn)確而可靠的時(shí)間源。時(shí)間是按NTP服務(wù)器的等級(jí)傳播。按照距離外部UTC源的遠(yuǎn)近將所有服務(wù)器歸入不同的Stratum(層)中。Stratum-1在頂層,有外部UTC接入,而Stratum-2則從Stratum-1獲取時(shí)間,Stratum-3從Stratum-2獲取時(shí)間,以此類推,但Stratum層的總數(shù)限制在15以內(nèi)。所有這些服務(wù)器在邏輯上形成階梯式的架構(gòu)并相互連接,而Stratum-1的時(shí)間服務(wù)器是整個(gè)系統(tǒng)的基礎(chǔ)。進(jìn)行網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)時(shí)最重要的是了解協(xié)議數(shù)據(jù)格式。NTP數(shù)據(jù)包有48個(gè)字節(jié),其中NTP包頭16字節(jié),時(shí)間戳32個(gè)字節(jié)。NTP數(shù)據(jù)包格式:實(shí)驗(yàn)環(huán)境一套PXA270EP嵌入式實(shí)驗(yàn)箱。安裝Redhat9的宿主PC機(jī),并且配置好ARMLinux的開發(fā)環(huán)境。算法描述及實(shí)驗(yàn)步驟調(diào)試過(guò)程原代碼中少了結(jié)構(gòu)體structaddrinfo{intai_flags;intai_family;intai_socktype;intai_protocol;size_tai_addrlen;structsockaddr*ai_addr;char*ai_canonname;/*canonicalname*/structaddrinfo*ai_next;/*thisstructcanformalinkedlist*/};實(shí)驗(yàn)結(jié)果總結(jié)通過(guò)實(shí)現(xiàn)NTP協(xié)議的實(shí)驗(yàn),我進(jìn)一步掌握Linux網(wǎng)絡(luò)編程,并且提高協(xié)議的分析與實(shí)現(xiàn)能力,為參與完成綜合性項(xiàng)目打下良好的基礎(chǔ)通過(guò)編寫多路復(fù)用串口讀寫,進(jìn)一步理解多路復(fù)用函數(shù)的用法,同時(shí)更加熟練掌握Linux設(shè)備文件的讀寫方法。附錄:/*ntp.c*/#include<sys/types.h>#include<sys/socket.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<unistd.h>#include<netinet/in.h>#defineNTP_PORT 123 /*NTP專用端口號(hào)字符串*/#defineTIME_PORT 37 /*TIME/UDP端口號(hào)*/#defineNTP_SERVER_IP "210.72.145.44" /*國(guó)家授時(shí)中心IP*/#defineNTP_PORT_STR "123" /*NTP專用端口號(hào)字符串*/#defineNTPV1 "NTP/V1" /*協(xié)議及其版本號(hào)*/#defineNTPV2 "NTP/V2"#defineNTPV3 "NTP/V3"#defineNTPV4 "NTP/V4"#defineTIME "TIME/UDP"#defineNTP_PCK_LEN48#defineLI0#defineVN3#defineMODE3#defineSTRATUM0#definePOLL4#definePREC-6#defineJAN_1970 0x83aa7e80/*從1900年到1970年之間的時(shí)間秒數(shù)*/#defineNTPFRAC(x) (4294*(x)+((1981*(x))>>11))#defineUSEC(x) (((x)>>12)-759*((((x)>>10)+32768)>>16))typedefstruct_ntp_time{unsignedintcoarse;unsignedintfine;}ntp_time;structaddrinfo{intai_flags;intai_family;intai_socktype;intai_protocol;size_tai_addrlen;structsockaddr*ai_addr;char*ai_canonname;/*canonicalname*/structaddrinfo*ai_next;/*thisstructcanformalinkedlist*/};structntp_packet{ unsignedcharleap_ver_mode; unsignedcharstartum; charpoll; charprecision; introot_delay; introot_dispersion; intreference_identifier; ntp_timereference_timestamp; ntp_timeoriginage_timestamp; ntp_timereceive_timestamp; ntp_timetransmit_timestamp;};charprotocol[32];/*構(gòu)建NTP協(xié)議包*/intconstruct_packet(char*packet){ charversion=1; longtmp_wrd; intport; time_ttimer; strcpy(protocol,NTPV3); /*判斷協(xié)議版本*/ if(!strcmp(protocol,NTPV1)||!strcmp(protocol,NTPV2)||!strcmp(protocol,NTPV3)||!strcmp(protocol,NTPV4)) { memset(packet,0,NTP_PCK_LEN); port=NTP_PORT; /*設(shè)置16字節(jié)的包頭*/ version=protocol[6]-0x30; tmp_wrd=htonl((LI<<30)|(version<<27)|(MODE<<24)|(STRATUM<<16)|(POLL<<8)|(PREC&0xff)); memcpy(packet,&tmp_wrd,sizeof(tmp_wrd)); /*設(shè)置RootDelay、RootDispersion和ReferenceIndentifier*/ tmp_wrd=htonl(1<<16); memcpy(&packet[4],&tmp_wrd,sizeof(tmp_wrd)); memcpy(&packet[8],&tmp_wrd,sizeof(tmp_wrd)); /*設(shè)置Timestamp部分*/ time(&timer); /*設(shè)置TransmitTimestampcoarse*/ tmp_wrd=htonl(JAN_1970+(long)timer); memcpy(&packet[40],&tmp_wrd,sizeof(tmp_wrd)); /*設(shè)置TransmitTimestampfine*/ tmp_wrd=htonl((long)NTPFRAC(timer)); memcpy(&packet[44],&tmp_wrd,sizeof(tmp_wrd)); returnNTP_PCK_LEN; } elseif(!strcmp(protocol,TIME))/*"TIME/UDP"*/ { port=TIME_PORT; memset(packet,0,4); return4; } return0;}/*獲取NTP時(shí)間*/intget_ntp_time(intsk,structaddrinfo*addr,structntp_packet*ret_time){ fd_setpending_data; structtimevalblock_time; chardata[NTP_PCK_LEN*8]; intpacket_len,data_len,count,result,i,re; data_len=addr->ai_addrlen; count=0; if(!(packet_len=construct_packet(data))) { return0; } /*客戶端給服務(wù)器端發(fā)送NTP協(xié)議數(shù)據(jù)包*/ if((result=sendto(sk,data,packet_len,0,addr->ai_addr,data_len))<0) { perror("sendto"); return0; } /*調(diào)用select()函數(shù),并設(shè)定超時(shí)時(shí)間為1s*/ FD_ZERO(&pending_data); FD_SET(sk,&pending_data); block_time.tv_sec=10; block_time.tv_usec=0; if(select(sk+1,&pending_data,NULL,NULL,&block_time)>0) { if((count=recvfrom(sk,data,NTP_PCK_LEN*8,0,addr->ai_addr,&data_len))<0) { perror("recvfrom"); return0; } if(protocol==TIME) { memcpy(&ret_time->transmit_timestamp,data,4); return1; } elseif(count<NTP_PCK_LEN) { return0; } /*設(shè)置接收NTP包的數(shù)據(jù)結(jié)構(gòu)*/ ret_time->leap_ver_mode=ntohl(data[0]); ret_time->startum=ntohl(data[1]); ret_time->poll=ntohl(data[2]); ret_time->precision=ntohl(data[3]); ret_time->root_delay=ntohl(*(int*)&(data[4])); ret_time->root_dispersion=ntohl(*(int*)&(data[8])); ret_time->reference_identifier=ntohl(*(int*)&(data[12])); ret_time->reference_timestamp.coarse=ntohl(*(int*)&(data[16])); ret_time->reference_timestamp.fine=ntohl(*(int*)&(data[20])); ret_time->originage_timestamp.coarse=ntohl(*(int*)&(data[24])); ret_time->originage_timestamp.fine=ntohl(*(int*)&(data[28])); ret_time->receive_timestamp.coarse=ntohl(*(int*)&(data[32])); ret_time->receive_timestamp.fine=ntohl(*(int*)&(data[36])); ret_time->transmit_timestamp.coarse=ntohl(*(int*)&(data[40])); ret_time->transmit_timestamp.fine=ntohl(*(int*)&(data[44])); return1; }/*endofifselect*/ return0;}/*修改本地時(shí)間*/intset_local_time(structntp_packet*pnew_time_packet){ structtimevaltv; tv.tv_sec=pnew_time_packet->transmit_timestamp.coarse-JAN_1970; tv.tv_usec=USEC(pnew_time_packet->transmit

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論