摘要: 介紹一種針對MicroBlaze軟核處理器特別開發的嵌入式操作系統Petalinux,成功地實現了其在ML507開發板上的移植,并且通過LabVIEW軟件在該系統上實現了基于TCP/IP協議的網絡數據收發。同時,測試了該嵌入式系統的網絡數據傳輸性能。
引言
嵌入式系統是指以應用為中心,以計算機技術為基礎,軟件硬件可裁減,能夠適應應用系統,并對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統。主要由嵌入式微處理器、外圍硬件設備、嵌入式操作系統以及用戶應用軟件等部分組成[1]。Petalinux是由PetaLogix公司專門為在Xilinx FPGA的MicroBlaze軟核處理器上運行而開發的嵌入式Linux。Petalinux的發布版本中包含定制的Linux2.4/2.6內核原碼、Uboot內核編碼、相關的開發工具,以及開發板參考硬件平臺配置,極大地方便了開發人員的使用,縮短了產品的開發周期。
針對如何在嵌入式系統上實現遠程數據傳輸的問題,本文給出了一種基于Xilinx ML507開發板的嵌入式網絡數據傳輸系統的設計與實現方案。通過LabVIEW編程軟件編寫客戶端,成功實現了開發板與PC機的實時網絡數據傳輸,同時測試了Petalinux操作系統的網絡數據傳輸性能。
1 系統平臺的搭建
1.1 開發板的選取與硬件平臺的設計
本設計方案采用Xilinx EDK 10.1在ML507開發板搭建一個簡化的硬件平臺,平臺結構如圖1所示。
各部件在FPGA內部以IP核的形式構建,并通過SPLB總線、XCL(Xilinx緩存鏈路)總線相互連接。系統以帶有32位MicroBlaze軟核處理器為控制中心,CF卡用于存放文件系統和應用程序配置文件;中斷控制器用來實現中斷控制;串口模塊可在調試時輸出系統的運行信息;三態以太網媒體訪問控制器用來實現以太網功能;雙倍速率同步動態隨機存儲器通過XCL總線與MicroBlaze處理器相連,用于對片外存儲器進行訪問[2]。
圖1 硬件平臺結構框圖
1.2 軟件平臺的配置
在移植Petalinux之前,必須配置BSP(Board Support Package)。所謂BSP,就是為給定的板子提供特定操作系統支持的代碼,是介于主板硬件和操作系統之間的一層,應該說是屬于操作系統的一部分。主要目的是為了支持操作系統,使之能夠更好地在硬件主板運行。
Xilinx EDK已經包括相應的BSP產生器,因此按下面步驟配置軟件平臺:
① 把解壓的Petalinux文件夾下~/hardware/edk_user_repository/PetaLogix/bsp/petalinux_v1_00_b文件夾拷貝到EDK文件夾下的“~\sw\lib\bsp”目錄下。
② 打開已建立的硬件工程,點擊Software菜單,啟動Software Platform Setting。對Software Platform窗口進行配置,點擊Software Platform,在OS&Library settings子窗口中,打開OS的下拉菜單,選擇Petalinux,版本只有1.00.b。如果第一步沒有完成,那么再打開OS的下拉菜單后,將沒有Petalinux選項,其余選項保持默認。
③ 選中OS and Library可配置選項,這里主要是針對開發板對uclinux的BSP進行配置,包括Flash與Memory,以及輸入/輸出調試端口的配置。在這里,主要對以下參數進行修改:
Lmb memory:dlmb_crtlr
Main memory:DDR_SDRAM
Stdin:RS232_Uart
Stdout:RS232_Uart
最后,點擊OK,退出?;赑etalinux的MicroBlaze軟件平臺配置完成。
軟件平臺配置完后就要根據相應配置生成針對MicroBlaze處理器的BSP和庫,使Petalinux與開發板的信息交互成為可能。進入EDK的Software菜單,點擊Generate BSP and Libraries,系統會自動生成板級支持包和庫。之后就可以在~/microblaze_0/ libsrc/ petalinux_v1_00_b文件夾下生成autoconfig.in文件[3]。
1.3 Petalinux操作系統的移植
軟件平臺配置完成后需要對內核進行裁減,嵌入式系統開發一般采用交叉編譯的方法,通過PC機上的虛擬機對內核和應用程序進行編譯,具體步驟如下[4]:
① 拷貝工程文件夾到Petalinux系統目錄;
② 設置Petalinux環境變量;
③ 在內核中新建用戶平臺;
④ 構建內核Makefile文件;
⑤ 對內核進行配置與編譯;
⑥ xmd下載image文件啟動系統。
搭建的底層硬件平臺的不同決定了系統內核配置的區別,參考文獻[2]中針對ML402開發板中的不同情況給出了較為詳細的移植過程,可作為參考,在此不再展開敘述。
使用EDK提供的調試工具xmd下載image文件,啟動Petalinux后,通過串口超級終端可以看到系統啟動過程。
2 TCP/IP服務器端程序的創建
Petalinux移植成功后,緊接著開發所需的服務器程序。在虛擬機終端下進入petalinuxdist文件夾目錄,輸入命令petalinuxnewapp speedtest。其中,speedtest為服務器端程序名。創建成功后,在~/petalinux/software/userapps文件夾下新建了以程序speedtest為名的文件夾,里面包括.C的應用程序、Makefile的編譯規則和readme的幫助文件。接下來進入speedtest文件夾目錄,輸入命令gedit speedtest.c,打開文本編輯器,對.C的應用程序進行編輯。
TCP/IP協議是目前最通用的網絡協議,因此,本程序也使用該協議實現網絡的互聯。在Linux系統中,通過提供Socket接口進行網絡編程。Socket接口是TCP/IP網絡的API,其定義了許多函數或例程,程序員可以用它們來開發TCP/IP網絡上的應用程序。網絡的 Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket具有一個類似于打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨后的連接建立、數據傳輸等操作都是通過該Socket實現的。
常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。流式Socket是一種面向連接的Socket,針對于面向連接的、無差錯的、發送先后順序一致的、包長度不限和非重復的TCP服務應用;數據報式Socket是一種無連接的Socket,主要是以獨立的數據報進行網絡傳輸,數據報的最大長度為32 KB,傳輸不保證順序性、可靠性和無重復性,它通常用于單個報文傳輸或可靠性不重要的場合。根據以上特點,本應用選擇流式Socket。
本文設計的網絡服務器,主要用于接收客戶端傳送的指令,然后發送數組給客戶端,具體流程如圖2所示。
圖2 服務器端通信流程
服務器端speedtest.c主要代碼如下[5]:
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ //創建套接字Socket函數可以調用Socket函數,該函數返回一//個類似于文件描述符的句柄
fprintf(stderr,"socket error!\n");
exit(1);
}
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){ //Bind函數將Socket與本機上的一個端//口相關聯,在該端口監聽服務請求
fprintf(stderr,"bind error!\n");
exit(1);
}
if(listen(sockfd,10)==-1){// listen函數將一個套接字轉換為被動傾聽套接字
fprintf(stderr,"listen error!\n");
exit(1);
}
if((connfd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1){//Accept函數從傾聽套接字的完成連接隊列中接收客戶端連接請求
fprintf(stderr,"accept error!\n");
exit(1);
}
printf("server:got connection from %s\n",inet_ntoa(their_addr.sin_addr));
printf ("successfully connect.\r\n");//顯示連接成功,開始接收客戶端請求
if ((recfd=recv(connfd,buffer,recbufsize,0))==-1){// recv函數用來控制對套接字的讀操作;
recfd=recv(connfd,buffer,recbufsize,0);
}
printf("\n收到字符串%d\n");
for (i=1;i<=N;i++) a[i]=i;
b=sizeof(a);
if(send(connfd,a,b,0)==-1){//控制對套接字的寫操作,發送1到4 999數組
fprintf(stderr,"send error!\n");
exit(1);
printf("%d",b);
}
while(1){//方便測試網絡傳輸速度
send(connfd,a,b,0);
}
printf ("send successfully\r\n");
close(sockfd); //關閉一個套接字描述符
圖3 TCP/IP客戶端LabVIEW仿真圖
啟動服務器在程序編寫好后重新編譯,生成image.bin文件,下載該文件。
打開超級終端看到系統啟動后,輸入用戶名與密碼,進入Petalinux系統執行下列命令:
ls /bin
speedtest
可以看到服務器端啟動語句輸出:
SOCKET: Creating socket..done.
SOCKET: start bind socket..done.
SOCKET: start listen..done.
說明服務器已經處于監聽狀態,等待客戶端的連接請求。
3 TCP/IP客戶端程序的創建
服務器端編寫完畢后,通過LabVIEW編程軟件編寫PC機客戶端,仿真圖如圖3所示。
設置服務器IP地址:192.168.0.10,端口:8000。點擊運行按鈕,可以看到當PC機客戶端向開發板上服務器端發出連接請求時,服務器端通過串口輸出:
SOCKET:start accept..server:got connection from 192.168.0.1
Successfully connect
隨即服務器向PC機客戶端發送0~4 999個數組,在PC機上通過LabVIEW軟件開發可視化圖形界面,查看數據傳輸內容,以及數據傳輸過程中的丟包情況,界面如圖4所示。
圖4中輸出數據轉化為波形圖后顯示為一條上升的直線,中間無跳變點,說明數據無丟失。同樣,也可以通過右側的data數據框看到每一個輸出的數值,觀察結果同樣顯示數據發送完整。
?
圖4 服務器端與客戶端連通后客戶端輸出界面
為了測試系統的數據傳輸速度,服務器端程序通過添加循環語句使其能夠持續地發送數組,并通過多特Netpersec網速測試軟件來測試系統的網絡傳輸速度,界面如圖5所示。
可以看出使用Petalinux操作系統時,本系統的網絡傳輸速率平均為20.9 Mb/s。至此完成了客戶端與服務器端網絡數據的傳輸,并測試了Petalinux的傳輸速度,結果表明Petalinux操作系統能夠滿足一般的數據傳輸需要,后續就可以接入外圍設備對系統進行進一步的開發與完善了。
結語
本文簡單介紹了Petalinux系統的開發與移植過程,以及TCP/IP客戶端與服務器端通信程序的創建過程,實現了PC機與Petalinux操作系統的實時數據傳輸,同時測試了系統的傳輸性能。實驗證明Petalinux的穩定性和實時性較好,為接下來在該系統上進行網絡應用程序開發打下了基礎。
圖5 PetaLinux操作系統網絡數據傳輸速度
參考文獻
[1] 華清遠見嵌入式培訓中心.嵌入式Linux C編程入門[M].北京:人民郵電出版社,2009.
[2] 薛慧敏,武傳華,路后兵,等. MicroBlaze處理器的Petalinux操作系統移植[J].單片機與嵌入式系統應用,2011(4):6769.
[3] 薛小剛,葛毅敏.Xilinx ISE9.x FPGA/CPLD設計指南[M].北京:人民郵電出版社,2007.
[4] John Williams.2010 Xilinx Professor Workshop—Embedded Linux on Xilinx MicroBlaze,2010.
[5] 李俊.嵌入式Linux設備驅動開發詳解[M].北京:人民郵電出版社,2008.
楊謝(碩士研究生)、路后兵(講師),主要研究方向為嵌入式系統開發;武傳華(教授)、錢怡(講師),主要研究方向為軟件無線電技術應用。
?
評論
查看更多