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