《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計應(yīng)用 > 基于Petalinux的Socket網(wǎng)絡(luò)通信系統(tǒng)設(shè)計與實現(xiàn)
基于Petalinux的Socket網(wǎng)絡(luò)通信系統(tǒng)設(shè)計與實現(xiàn)
來源:微型機與應(yīng)用2012年第8期
楊 謝,武傳華,路后兵,楊 標
(合肥電子工程學院,安徽 合肥230037)
摘要: 介紹了一款針對MicroBlaze軟核處理器特別開發(fā)的嵌入式操作系統(tǒng)Petalinux,成功地實現(xiàn)了其在ML402開發(fā)板上的移植,并且在該系統(tǒng)上實現(xiàn)了基于TCP/IP協(xié)議的套接字接口Socket的網(wǎng)絡(luò)通信。
Abstract:
Key words :

摘  要: 介紹了一款針對MicroBlaze軟核處理器特別開發(fā)的嵌入式操作系統(tǒng)Petalinux,成功地實現(xiàn)了其在ML402開發(fā)板上的移植,并且在該系統(tǒng)上實現(xiàn)了基于TCP/IP協(xié)議的套接字接口Socket的網(wǎng)絡(luò)通信。
關(guān)鍵詞: FPGA;MicroBlaze軟核處理器;Petalinux移植;Socket網(wǎng)絡(luò)通信

    嵌入式系統(tǒng)是為特定目的而構(gòu)建的一類計算機設(shè)備。該設(shè)備具有體積小、功耗低、可靠性穩(wěn)定、高度自動化、響應(yīng)速度快等特點,特別適合要求實時和多任務(wù)的體系[1]。Petalinux是由PetaLogix公司專門為在Xilinx FPGA的MicroBlaze軟核處理器上運行而開發(fā)的嵌入式Linux。Petalinux發(fā)布的版本中包含定制的Linux2.4/2.6內(nèi)核原碼、U-boot內(nèi)核編碼、相關(guān)的開發(fā)工具以及開發(fā)板參考硬件平臺配置,極大地方便了開發(fā)人員的使用,縮短了產(chǎn)品的開發(fā)周期。
    對于如何在嵌入式系統(tǒng)上實現(xiàn)遠程網(wǎng)絡(luò)通信這一問題,本文給出了一種基于Xilinx開發(fā)板ML402的嵌入式網(wǎng)絡(luò)通信系統(tǒng)的設(shè)計與實現(xiàn)方案,成功實現(xiàn)了開發(fā)板與PC機的實時網(wǎng)絡(luò)通信。
1 硬件工程設(shè)計
1.1 底層硬件平臺的選取與設(shè)計

    本設(shè)計方案采用Xilinx EDK 10.1在ML402開發(fā)板搭建一個最簡化的硬件平臺,結(jié)構(gòu)如圖1所示。

xil

 

    圖中各部件在FPGA 內(nèi)部以IP核的形式構(gòu)建并連接,系統(tǒng)以帶有32 bit MicroBlaze軟核的FPGA作為控制中心,SysACE用于存放文件系統(tǒng)和應(yīng)用程序配置文件;INTC用來實現(xiàn)中斷控制;串口可在調(diào)試時輸出系統(tǒng)的運行信息;以太網(wǎng)控制器用來實現(xiàn)以太網(wǎng)功能;DDR_SDRAM通過XCL總線與處理器相連,用于對片外存儲器進行訪問[2]。
1.2 軟件平臺的配置
    在移植Petalinux之前,必須配置BSP(Board Support Package)。所謂BSP,就是為給定的板子提供特定操作系統(tǒng)支持的代碼。介于主板硬件和操作系統(tǒng)之間,屬于操作系統(tǒng)的一部分,主要目的是為了支持操作系統(tǒng),使之能夠更好地運行于硬件主板。
    Xilinx EDK已經(jīng)包括相應(yīng)的BSP產(chǎn)生器,因此,第一步只需要把解壓的Petalinux文件夾下的hardware/edk_user_repository/PetaLogix/bsp/petalinux_v1_00_b文件夾拷貝到EDK文件夾下的\sw\lib\bsp目錄下進行相應(yīng)的配置即可。接下來打開已建立的硬件工程,進行軟件平臺配置,點擊Software菜單,啟動Software Platform Setting。系統(tǒng)會彈出軟件平臺的配置窗口,可以看到共有3個可配置項——Software Platform、OS and Libraries和Drivers。右方的窗口為可配置選項的參數(shù)。首先對Software Platform進行配置,點擊Software Platform,在窗口右側(cè)可以看到可配置參數(shù),包括兩個子窗口,其一是processor parameters,其中包括處理器主頻信息、交叉編譯器等選項。其中,extra compiler flag指定了在生成BSP與庫的過程中,交叉編譯器所用的編譯標志,archiver和compiler分別指定了生成BSP與庫所用的工具鏈,在這里只需保持默認即可。在OS and Library settings子窗口中打開OS的下拉菜單,選擇Petalinux,版本只有1.00.b,如果第一步?jīng)]有完成,則在點開OS的下拉菜單后,沒有Petalinux選項。
    完成上一步之后,選中OS and Library可配置選項,這里主要是針對開發(fā)板對?滋Clinux的BSP進行配置,包括Flash與Memory以及輸入輸出調(diào)試端口的配置,在這里主要對以下參數(shù)進行修改:
    Lmb memory:dlmb_crtlr
    Main memory:DDR_SDRAM
    Stdin:RS232_Uart
    Stdout:RS232_Uart
    最后點擊OK,退出,基于Petalinux的MicroBlaze軟件平臺配置完成。下一步是根據(jù)軟件平臺的配置生成針對MicroBlaze處理器的BSP與庫,使Petalinux與開發(fā)板的信息交互成為可能。進入EDK的Software菜單,點擊Generate BSP and Libraries,系統(tǒng)會自動生成板級支持包與庫。之后就可以在microblaze_0/libsrc/petalinux_v1_00_b文件夾下生成auto-config.in文件[3]。
1.3 Petalinux操作系統(tǒng)的移植
    軟件平臺完成后需要對內(nèi)核進行配置,嵌入式系統(tǒng)開發(fā)一般采用交叉編譯的方法,通過PC機對內(nèi)核和應(yīng)用程序進行編譯,具體步驟如下:
    (1)將工程所在目錄復(fù)制到Petalinux解壓目錄下的
~/hardware/user-platforms目錄下。
    (2)進入Petalinux解壓目錄,運行source ./settings.sh命令,設(shè)置Petalinux環(huán)境變量。
    (3)進入~/software/petalinux-dist目錄,運行petalinux-new-platform-k 2.6-v Xilinx-p ml402新建用戶平臺;其中-v后綴為FPGA的生產(chǎn)廠商,-p后綴為工程使用的FPGA開發(fā)板名稱,-k為配置內(nèi)核的版本。然后運行make menuconfig命令,進入Vendor/Product Selection選項,選擇相應(yīng)的平臺,退出并保存。
    (4)進入工程所在文件夾,運行petalinux-copy-auto-
config命令,將libgen生成的microblaze_0/libsrc/Kconfig.auto和autoconfig.in轉(zhuǎn)換成linux格式,并拷貝到當前活躍的platform下(例如software/linux-2.6.x/arch/Microblaze/platform/ml402)。它是根據(jù)在make menuconfig中選擇的vendor/platform來拷貝的。
    (5)內(nèi)核的配置與編譯
    搭建的底層硬件平臺的不同決定了系統(tǒng)內(nèi)核的區(qū)別,參考文獻[2]中薛慧敏針對不同情況給出了較為詳細的配置過程,可作為參考,在此不再贅述。
    (6)Xmd下載啟動
    Xmd是Xilinx EDK提供的調(diào)試工具,可以使用該工具對EDK開發(fā)的工程進行調(diào)試。使用該方法下載image文件,啟動Petalinux后,通過串口超級終端可以看到系統(tǒng)啟動過程。
2 網(wǎng)絡(luò)通信程序的開發(fā)
    Petalinux移植成功后,就可以使用petalinux-new-app命令在其上建立軟件應(yīng)用工程,進行軟件應(yīng)用的開發(fā)。新建的軟件應(yīng)用工程放在~/petalinux/software/user-apps。
2.1 軟件應(yīng)用工程的建立
    在petalinux-dist文件夾下輸入命令:petalinux-new-app petaserver,其中petaserver為應(yīng)用工程名稱。創(chuàng)建成功后,在user-apps文件夾下新建了以工程名稱petaserver為名稱的文件夾,里面包括.C的應(yīng)用程序、Makefile的編譯規(guī)則和readme的幫助文件。
2.2 Socket程序的創(chuàng)建
    進入新建的應(yīng)用工程文件夾,輸入命令:gedit petaserver.c,打開文本編輯器,對.C的應(yīng)用程序進行編輯。本應(yīng)用工程主要是作為網(wǎng)絡(luò)服務(wù)器,接收客戶端傳送的命令,消息經(jīng)過處理后再回饋給客戶端,主要流程如圖2所示。

    現(xiàn)行的網(wǎng)絡(luò)協(xié)議中TCP/IP協(xié)議是最通用的一個,因此,本程序也使用該協(xié)議實現(xiàn)網(wǎng)絡(luò)的互聯(lián)[4]。
    Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。網(wǎng)絡(luò)的 Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket具有一個類似于打開文件的函數(shù)調(diào)用Socket(),該函數(shù)返回一個整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實現(xiàn)的。常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的、無差錯的、發(fā)送先后順序一致的、包長度不限和非重復(fù)的TCP服務(wù)應(yīng)用;數(shù)據(jù)報式Socket是一種無連接的Socket,對應(yīng)于無連接的UDP服務(wù)應(yīng)用,主要以獨立的數(shù)據(jù)報進行網(wǎng)絡(luò)傳輸,數(shù)據(jù)報的最大長度為32 KB,傳輸不保證順序性、可靠性和無重復(fù)性,它通常用于單個報文傳輸或可靠性不重要的場合。根據(jù)以上特點,本應(yīng)用選擇流式Socket[1]。
    (1)服務(wù)器端petaserver.c主要代碼如下:
    {
        if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
//創(chuàng)建套接字Socket函數(shù)可以調(diào)用Socket函數(shù),
該函數(shù)返回一個類似于文件描述符的句柄
        {
          fprintf(stderr,"socket error!\n");
          exit(1);
        }
        if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct
sockaddr))==-1)  //Bind函數(shù)將socket與本機上
的一個端口相關(guān)聯(lián),在該端口監(jiān)聽服務(wù)請求
        {
          fprintf(stderr,"bind error!\n");
          exit(1);
        }
        if(listen(sockfd,10)==-1)   // Listen函數(shù)將一個
套接字轉(zhuǎn)換為被動傾聽套接字
        {
          fprintf(stderr,"listen error!\n");
          exit(1);
        }
    if((connfd=accept(sockfd,(struct sockaddr *)&their_addr,
&sin_size))==-1)
    //Accept函數(shù)從傾聽套接字的
完成連接隊列中接收客戶端連接請求
        {
          fprintf(stderr,"accept error!\n");
          exit(1);
        }
    printf("server:got connection from %s\n",inet_ntoa
(their_addr.sin_addr));
if(send(connfd,"successfully connect\n",20,0)==-1)
//send函數(shù)用來控制對套接字的寫操作
        {
          fprintf(stderr,"send error!\n");
          exit(1);
        }
    //顯示連接成功,開始接收客戶端信息
        while((len1=recv(connfd,str,100,0)) > 0)
//recv函數(shù)用來控制對套接字的讀操作
        {
          len1=recv(connfd,str,100,0);
          printf("\n收到字符數(shù):%d\n",len1);
          str[len1]=0;
          printf("Received from client:%s\n",str);
        }
        close(sockfd);//Close函數(shù)用來關(guān)閉一個
套接字描述符
    }
    (2)啟動服務(wù)器
    程序編寫好后,重新編譯,生成image.bin文件,下載該文件。
    打開超級終端,系統(tǒng)啟動后輸入用戶名與密碼,進入petalinux系統(tǒng)執(zhí)行下列命令:
    ls /bin 回車
    petaserver 回車
    可以看到服務(wù)器端啟動語句輸出:
    SOCKET: Creating socket..done.
    SOCKET: start bind socket..done.
    SOCKET: start listen..done.
    這時打開PC機客戶端,客戶端使用成都眾山科技有限公司提供的TCP/UDP Socket 調(diào)試工具 V2.3,點擊TCP Client按鈕,在彈出的窗口中輸入服務(wù)器IP地址:192.168.0.10,端口:8000,點擊連接按鈕,可以看到當PC機客戶端向開發(fā)板上服務(wù)器端發(fā)出連接請求時,服務(wù)器端通過PC機超級終端輸出:
    SOCKET:start accept..server:got connection from 192.168.0.1
    Successfully connect
    同時在PC機socket客戶端回顯:Successfully connect;
    客戶端向服務(wù)器發(fā)送hello petalinux;
    超級終端顯示服務(wù)器端已經(jīng)接收到客戶端發(fā)來的信息,屏幕輸出為:15(接收到的字節(jié)長度)和hello petalinux(接收到的內(nèi)容)。
    至此說明客戶端與服務(wù)器端完成了網(wǎng)絡(luò)的連通,后續(xù)就可以接入外圍設(shè)備對系統(tǒng)進行進一步的開發(fā)與完善了。
    本文簡單介紹了基于Petalinux的嵌入式系統(tǒng)的開發(fā)與移植過程以及客戶端與服務(wù)器端Socket的創(chuàng)建過程,通過在客戶端及服務(wù)器端創(chuàng)建Socket實現(xiàn)了PC機與Petalinux操作系統(tǒng)的實時網(wǎng)絡(luò)通信,實驗證明Petalinux的穩(wěn)定性和實時性較好,為接下來在該系統(tǒng)上進行網(wǎng)絡(luò)應(yīng)用程序開發(fā)打下了基礎(chǔ),能夠滿足進一步實驗需求。
參考文獻
[1] 歐文盛.ARM嵌入式Linux應(yīng)用實例開發(fā)[M].北京:中國電力出版社,2008.
[2] 薛慧敏,武傳華,路后兵,等.基于MicroBlaze的Petalinux嵌入式操作系統(tǒng)移植[J].微計算機信息,2011,27(8):109-110.
[3] 薛小剛,葛毅敏.Xilinx ISE9.x FPGA/CPLD設(shè)計指南[M]. 北京:人民郵電出版社,2007.
[4] IT同路人.Linux標準學習教程[M].北京:人民郵電出版社,2008.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。