嵌入式開發(fā)技術(shù)課程設(shè)計報告畢業(yè)設(shè)計_第1頁
嵌入式開發(fā)技術(shù)課程設(shè)計報告畢業(yè)設(shè)計_第2頁
嵌入式開發(fā)技術(shù)課程設(shè)計報告畢業(yè)設(shè)計_第3頁
嵌入式開發(fā)技術(shù)課程設(shè)計報告畢業(yè)設(shè)計_第4頁
嵌入式開發(fā)技術(shù)課程設(shè)計報告畢業(yè)設(shè)計_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《嵌入式開發(fā)技術(shù)》課程設(shè)計報告《電子設(shè)計與制作》課程設(shè)計報告 嵌入式課程設(shè)計1設(shè)計要求1.1基本題型(1)嵌入式開發(fā)環(huán)境配置①采用vmware+linux配置開發(fā)主機系統(tǒng),要求構(gòu)建linux系統(tǒng),配置nfs,samba;②掌握minicom、samba及NFS使用,能利用其實現(xiàn)windows、linux開發(fā)主機與嵌入式實驗系統(tǒng)間的通信;③利用NFS服務(wù)實現(xiàn)主機與實驗系統(tǒng)間文件共享;④利用提供的工具構(gòu)建交叉編譯環(huán)境;要求:在下圖時間上面一行顯示小組成員姓名Armv4l-unknown-linux-gcc是否在/opt/host/armv4l/bin/,如果不是這個路徑,請使用vi修改/root/.bash_profile文件中。ATH變量為PATH=$PATH:$HOME/bin:/opt/host/armv4l/bin/,存盤后執(zhí)行:source/root/.bash_profile(2)熟悉VI、GCC、GDB及MAKE文件使用;(3)在開發(fā)系統(tǒng)中編寫一個程序,實現(xiàn)打印“通信工程13級第3小組嵌入式開發(fā)技術(shù)課程設(shè)計基礎(chǔ)內(nèi)容”功能,編寫makefile文件,并通過NFS下載到實驗箱中,驗證交叉編譯環(huán)境配置。1.2綜合題型基于socket編程的簡單聊天室程序設(shè)計:(1)掌握linux下socket編程方法;(2)基于C語言設(shè)計一個簡單的聊天室程序,PC運行客戶端程序,嵌入式系統(tǒng)運行服務(wù)器端程序,服務(wù)器隨時偵聽客戶端請求并將其接入,要求至少實現(xiàn)2個客戶端接入服務(wù)器并進行通信的功能;(3)編寫Makefile文件;(4)利用NFS將程序下載到實驗箱中,編譯執(zhí)行。(5)課程設(shè)計報告中應(yīng)包含服務(wù)器端socket創(chuàng)建、綁定、監(jiān)聽、允許接入及接收數(shù)據(jù)等關(guān)鍵代碼及其說明,客戶端請求及數(shù)據(jù)發(fā)送等關(guān)鍵代碼及說明;2開發(fā)環(huán)境、開發(fā)工具(1)安裝VWware軟件①開始安裝加載文件.雙擊該文件的圖標,進入加載安裝文件的界面。②設(shè)置安裝類型。安裝文件加載完畢后進入開始安裝界面。單擊next按鈕后,進入安裝類型選擇界面,選擇tyical選項。③執(zhí)行軟件包的安裝選項,依據(jù)所做的選擇,把對應(yīng)的軟件組件安裝到系統(tǒng)中,輸入正確的序列號。(2)配置VMware①打開桌面上VMware圖形,雙擊打開②再打開原來的文件夾,把漢化包打開③執(zhí)行軟件的安裝選項,依據(jù)所做的選擇,確認安裝。確認完后,即配置完成。④點擊打開虛擬機,選擇標準,下一步,執(zhí)行軟件的安裝選項。接下是密鑰,填寫老師所給的密碼。安裝完成。(3)安裝驅(qū)動點擊安裝包,根據(jù)軟件的安裝選項,點擊next按鈕,即可安裝完成。注:在電腦上安裝好虛擬機之后配置相關(guān)參數(shù)①配置NFS:點擊菜單運行系統(tǒng)設(shè)置->點擊服務(wù)器設(shè)置->NFS服務(wù)器,點擊增加,在目錄中選擇共享目錄的路徑,在主機(host)中填入主機IP地址(2),并選擇客戶對共享目錄的操作位讀寫(Read/write);在常規(guī)選項中選擇允許來自高于1024的端口的連接,點擊確定后即可配置好NFS。配置完成后,可以簡單測試一下NFS是否配置好了:在虛擬機上自己mount自己,看是否成功就可以判斷NFS是否配好了。mount2:/arm2410cl/host之后ls命令查看arm2410cl之下的文件目錄,如果文件目錄在,那么說明NFS配置成功。②端口配置用串口線連接好筆記本電腦和2410經(jīng)典版平臺。計算機,屬性,設(shè)備管理器,端口高級設(shè)置下端口號COM1進入虛擬機設(shè)置,串行端口3設(shè)計過程及結(jié)果3.1實現(xiàn)交叉編譯環(huán)境結(jié)果:3.2第幾小組成員步驟(1)創(chuàng)建工作目錄【root@vm-dev~】#mkdirwinter【root@vm-devwinter】#cdwinter(2)編寫winter.c文件 【root@vm-dev~】#viwinter.c(3)編寫Makefile文件CC=armv4l-unknown-linux-gccEXEC=clientserverOBJS=client.oserver.oCFLAGS+=LDFLAGS+=-staticall:$(EXEC)$(EXEC):$(OBJS)$(CC)$(LDFLAGS)–o$@$(OBJS)clean:-rm–f*.elf*.gdb*.o其中,CC指明編譯器EXEC表示編譯后生成的執(zhí)行文件名稱OBJS目標文件列表CFLAGS編譯參數(shù)LDFLAGS連接參數(shù)all:編譯主入口clean:清除編譯結(jié)果(4)運行make編譯程序【root@vm-dev~】#makeclean【root@vm-devwinter】#make(5)源程序#include<stdio.h>intmain(void){printf(“通信工程13級第三小組嵌入式開發(fā)技術(shù)課程設(shè)計基礎(chǔ)內(nèi)容“);}6)結(jié)果由于電腦與開發(fā)板不匹配,結(jié)果沒有辦法出來3.3實現(xiàn)Linux系統(tǒng)下的簡易聊天室(1)程序流程圖返回-1numbytes>0返回-1numbytes>0返回0是否連接上服務(wù)器connect()輸入文字關(guān)閉socket結(jié)束開始創(chuàng)建套接字socket初始化結(jié)構(gòu)體server_addr=0=0=0=0=0=0!=-1!=-1!=-1=-1=-1=-1開始定義套接字類型結(jié)構(gòu)體初始化綁定端口bind()監(jiān)聽端口listen()定義線程ppidpid接收信息accept()接收成功,發(fā)送send()創(chuàng)建子進程ppid創(chuàng)建子進程pidPid接收信息,大小為recvbyes睡眠usleep(10000)將信息發(fā)回給客戶send()結(jié)束=-1=-1=-1服務(wù)端處于監(jiān)聽狀態(tài),客戶端發(fā)送請求,連接成功并通信。首先服務(wù)端調(diào)用socket()函數(shù)創(chuàng)建一個套接字,然后把協(xié)議,端口號,ip信息通過bind()進行綁定。以上操作完后服務(wù)端就開始監(jiān)聽客戶端的請求,并設(shè)置監(jiān)聽的最大數(shù)目。當客戶端發(fā)送鏈接請求時,服務(wù)端就調(diào)用accept()函數(shù)接受客戶端的請求。然后對于客戶端來說,也是要先調(diào)用socket()函數(shù)創(chuàng)建客戶端的套接字,這里是用的TCP協(xié)議,所以可以不用bind()函數(shù)。接著調(diào)用connect()函數(shù)與服務(wù)端建立連接。當服務(wù)端和客戶端建立連接時,可以通過彼此之間的套接字描述符來進行數(shù)據(jù)傳輸。其中一方通過send函數(shù)把數(shù)據(jù)寫入數(shù)據(jù)緩沖區(qū),另一方通過recv()函數(shù)從緩沖區(qū)內(nèi)讀出數(shù)據(jù),這樣就完成了服務(wù)端與客戶端之間的數(shù)據(jù)傳輸。當雙方數(shù)據(jù)傳輸完成后,函數(shù)close()關(guān)閉各自的套接字,使客戶端和服務(wù)端通信中斷。(3)socket編程方案①設(shè)計一個簡單的聊天室程序,PC運行客戶端程序,嵌入式系統(tǒng)運行服務(wù)器端程序,服務(wù)器隨時偵聽客戶端請求并將其接入,要求至少實現(xiàn)2個客戶端接入服務(wù)器并進行通信的功能;②Makefile文件③NFS將程序下載到實驗箱中,編譯執(zhí)行。注:程序里的函數(shù)解釋(1)Socket()作用:socket函數(shù)為客戶機或服務(wù)器創(chuàng)建一個sokcet格式:intsocket(intfamily,inttype,intprotocol);參數(shù)說明:Family:表示地址族,可以去AF_UNLX和AF_INT。其中,AF_UNLX只能夠用于單一的UNIX系統(tǒng)進程間通信;AF_INT是針對Internet的,因而可以允許在遠程主機之間通信,實驗中使用AF_INT。Type:網(wǎng)絡(luò)程序所采用的通信協(xié)議,可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP協(xié)議,這樣提供按順序的、可靠的、雙向、面向連接的比特流;SOCKE_DGRAM表明使用的是UDP協(xié)議,這樣只會提供定長、不可靠、無連接的通信。(2)bind()格式:intbind(intsockfd,structsockaddr*addr,intaddrlen);參數(shù)說明:Sockfd:socket的文件描述符號。Sockaddr:表示名字所用的一個數(shù)據(jù)結(jié)構(gòu),用來保存地址(包括IP地址和端口)Addrlen:設(shè)置結(jié)構(gòu)大小長度。(3)listen()格式:intlisten(intsockfd,intbacklog);作用:監(jiān)聽連接信號,和accepted函數(shù)合同。參數(shù)說明:Sockfd:表示socket調(diào)用返回的文件描述符。Backlog:表示接入隊列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許20個,也可以子定義5~10個。(4)accept()格式:Intaccept(intsockfd,void*addr,int*addrlen);作用:與listen函數(shù)合用,監(jiān)聽信息、接收客戶端請求。參數(shù)說明:Sockfd:表示socket的文件描述符。Addr:表示指向局部的數(shù)據(jù)結(jié)構(gòu)structsockaddr-in的指針。Addrlen:表示地址的長度。(5)connect()格式:intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);作用:在面向連接的系統(tǒng)中客戶及連接服務(wù)器時使用,connect必須在bind后使用。參數(shù)作用:Sockfd:表示socket的文件描述符。Serv-addr:表示村訪目的端口和ip地址(套接字)的數(shù)據(jù)結(jié)構(gòu)。(6)send()和recv()格式1:Intsend(intsockfd,constvod*msg,intlen,intflags);功能:發(fā)送信息。格式2:Intrecv(intsockfd,void*buf,intlen,usignedintflags);作用:用于流式socket、數(shù)據(jù)報socket內(nèi)部之間的通信。(7)close()和shutdown()格式:Close(intsockfd)或Intshutdown(intsockfd,intf);參數(shù)說明:f的值為下面一種:0不允許繼續(xù)接收;1不允許繼續(xù)發(fā)送;2不允許繼續(xù)發(fā)送和接收。(8)有關(guān)線程的系統(tǒng)調(diào)用函數(shù)pthread_create()、pthread_join()實驗過程說明(使用TCP/IP)(1)監(jiān)聽連接利用socket、bind、listen建立連接,步驟是:先用socket函數(shù)初始化socket,創(chuàng)建新的sockfd。Sockfd=socket(AF_INT,SOCK_STREAM,0)此步驟涉及到IP地址及其處理過程。參數(shù)說明:inet_addr函數(shù)INADDR_ANY該函數(shù)把由小數(shù)點分開的十進制IP地址轉(zhuǎn)為unsingedlong類型,而在實驗中所使用的為INADDR_ANY,使用利用自已的IP地址自動填充。a)利用bind函數(shù)綁定端口和IP地址。My_addr.sin_family=AF_INET;/*將地址族類型設(shè)定好*/My_addr.sin_port=htons(MYPORT;/*將端口給其賦值*/My_addr.sin_addr.s_addr=INADDR_ANY;/*用連接地址自動填充ip*/Bind(sockfd,(stuctsockaddr*)&my_addr,sizeof(stuctsockaddr));/*sockfd是分配的socket名字,my-addr則便是分配好的端口與IP,用bind綁定*/b)利用listen監(jiān)聽請求(2)發(fā)送請求1)利用gethostbyname獲取主機信息。2)初始化socket端口。3)利用connect函數(shù)將自己的IP地址等信息發(fā)送到主機,等待主機調(diào)用accept函數(shù)來接受請求。(3)主機接收請求,進行數(shù)據(jù)通信1)主機利用accept接收請求。2)創(chuàng)建子進程,顯示歡迎信息;3)接收返回信息,顯示連接成功,并推出連接;4)關(guān)閉客戶端口socket;5)關(guān)閉服務(wù)端socket,結(jié)束子線程。(4)實現(xiàn)步驟①建立工作目錄【root@vm-dev~】#mkdirserver【root@vm-devserver】#cdserver【root@vm-devserver】#viserver.c【root@vm-dev~】#mkdirclient【root@vm-devclient】#cdclient【root@vm-devclient】#viclient.c②編寫程序源代碼程序附后③編譯實現(xiàn)過程ⅰ.在編寫完TCP服務(wù)端程序server.c后,用armv4l-unknown-linux-gcc–lpthread–oserver.cserver生成程序server。ⅱ.在編寫完TCP客戶端程序client.c后,用armv4l-unknown-linux-gcc–oclient.cclient生成程序clientⅲ.在嵌入式系統(tǒng)上運行server。在主機上打開一個窗口,運行client,輸入服務(wù)器的IP地址,并檢查器結(jié)果的正確性。ⅳ.輸入:#./server#./client2 (2為本機的ip地址)ⅴ.輸出:#server:gotconnectionfrom2ⅵ.客戶端發(fā)送信息服務(wù)器端接收信息??蛻舳送ㄟ^鍵盤輸入消息內(nèi)容平回車,以發(fā)送消息給服務(wù)器端;ⅶ.結(jié)果:服務(wù)端:客戶端:注:源程序客戶端代碼#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<sys/types.h>//數(shù)據(jù)類型定義#include<netinet/in.h>//定義數(shù)據(jù)結(jié)構(gòu)#include<sys/socket.h>#include<sys/wait.h>#include<unistd.h>#include<arpa/inet.h>//AF_INET相關(guān)操作函數(shù)#defineSERVER_PORT8887/*客戶機連接遠程主機的端口*/#defineMAXDATASIZE100/*每次可以接收的最大字節(jié)*/#defineSERVER_IP"3"/*服務(wù)器的IP地址*///#defineWELCOME“******WELCOMETOTHECHATROOM*****”intmain(){intsockfd,numbytes;charbuf[MAXDATASIZE];structsockaddr_inserver_addr;printf("\n======================clientinitialization======================\n");if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket");exit(1);}//結(jié)構(gòu)體的定義與初始化server_addr.sin_family=AF_INET;//使用IPv4的協(xié)議server_addr.sin_port=htons(SERVER_PORT);//端口號,htons()把16位值從主機字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序server_addr.sin_addr.s_addr=inet_addr(SERVER_IP);ip地址bzero(&(server_addr.sin_zero),sizeof(server_addr.sin_zero));//將第一個參數(shù)所指的內(nèi)存區(qū)域前sizeof(第二個參數(shù))個字符清零if(connect(sockfd,(structsockaddr*)&server_addr,sizeof(structsockaddr_in))==-1)//)&server_addr服務(wù)器端地址{perror("connect");exit(1);}//循環(huán)輸入文字while(1){bzero(buf,MAXDATASIZE);printf("\nBeginreceive...\n");if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)//buf接收數(shù)據(jù)緩沖區(qū),numbytes接收的字節(jié)數(shù){perror("recv");exit(1);}elseif(numbytes>0){intlen,bytes_sent;buf[numbytes]='\0';printf("Received:%s\n",buf);printf("Send:");charmsg[MAXDATASIZE];scanf("%s",msg);len=strlen(msg);//發(fā)送至服務(wù)器if(send(sockfd,msg,len,0)==-1)//msg要發(fā)送的數(shù)據(jù)指針{perror("senderror");}}else{//numbytes=0,表示socket已斷開printf("soketend!\n");}}close(sockfd);return0;}服務(wù)器端代碼#include<sys/types.h>#include<sys/socket.h>//包含套接字函數(shù)庫#include<stdio.h>#include<netinet/in.h>//包含AF_INET相關(guān)結(jié)構(gòu)#include<arpa/inet.h>//包含AF_INET相關(guān)操作的函數(shù)#include<unistd.h>#include<string.h>#include<stdlib.h>#include<fcntl.h>#include<sys/shm.h>#defineMYPORT8887#defineMYKEY12345#defineSIZE10240intmain(){charbuf[100];memset(buf,0,100);intserver_sockfd,client_sockfd;socklen_tserver_len,client_len;//?structsockaddr_inserver_sockaddr,client_sockaddr;printf("\n======================serverinitialization======================\n");server_sockfd=socket(AF_INET,SOCK_STREAM,0);//定義套接字類型server_sockaddr.sin_family=AF_INET;server_sockaddr.sin_port=htons(MYPORT);server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);server_len=sizeof(server_sockaddr);//允許重復(fù)使用本地地址和套接字綁定inton=1;setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));//綁定端口if(bind(server_sockfd,(structsockaddr*)&server_sockaddr,server_len)==-1){perror("bind");exit(1);}//監(jiān)聽端口if(listen(server_sockfd,5)==-1){perror("listen");exit(1);}client_len=sizeof(client_sockaddr);pid_tppid,pid;while(1){if((client_sockfd=accept(server_sockfd,(structsockaddr*)&client_sockaddr,&client_len))==-1){perror("accepterror");exit(1);}else{send(client_sockfd,"YouhaveconnectServer!",strlen("YouhaveconnectServer!"),0);}printf("\n%s:%dLoginserver!\n\n",inet_ntoa(client_sockaddr.sin_addr),ntohs(client_sockaddr.sin_port));//,inet_ntoa將32位二進制形式的IP地址轉(zhuǎn)換為數(shù)字點形式的IP地址ppid=fork();//創(chuàng)建子進程if(ppid==-1){printf("fork1failed:");}elseif(ppid==0)//子進程用于接收客戶端信息并發(fā)送{intrecvbytes;pid=fork();//再次創(chuàng)建子進程if(pid==-1){printf("fork2failed:");exit(1);}elseif(pid==0)//子進程的子進程用于接收消息{while(1){bzero(buf,100);if((recvbytes=recv(client_sockfd,buf,100,0))==-1){perror("readclient_sockfdfailed:");}elseif(recvbytes!=0){buf[recvbytes]='\0';usleep(10000);printf("%s:%dsaid:%s\n",inet_ntoa(client_sockaddr.sin_addr),ntohs(client_sockaddr.sin_port),buf);//將客戶端發(fā)送過來的消息發(fā)回給客戶if(send(client_sockfd,buf,recvbytes,0)==-1){perror("senderror");break;}}}}elseif(pid>0)//此時的id為子進程id{}}elseif(ppid>0){//總父進程中關(guān)閉client_sockfd(因為有另一個副本在子進程中運行了)返回等待接收消息close(client_sockfd);}}return0;}4設(shè)計總結(jié)在本學(xué)期的最后一周,我們被要求完成嵌入式的設(shè)計總結(jié),雖然只有不到一周的時間,但是大家都感覺收獲頗豐。把課堂上遺忘的、遺落的知識都撿了起來,舊的知識新的知識都掌握了很多,并且切實的體會到軟件開發(fā)的困難與樂趣,認識到了自己的不足,并且慢慢摸索,不恥下問,在老師和小組成員的共同努力下,結(jié)束了這次的實踐。此次課程設(shè)計老師要求我們完成兩道基礎(chǔ)題目,以及一道三選一的綜合題目。前面的基礎(chǔ)題目大家有在課堂上接觸過,并且通過查找資料,大家分工合作一個上午就有了很大的進展,但是在下午的完善工作中還是被卡住了,一個小的程序調(diào)試不出來,不能出現(xiàn)要求的結(jié)果,最后在其他組一個同學(xué)的幫助下完成了基礎(chǔ)題目。第二天大家開始做綜合題,經(jīng)過商量選擇了《基于socket編程的簡單聊天室程序設(shè)計》,其實三道題目

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論