摘 要: 介紹了一款針對(duì)MicroBlaze軟核處理器特別開(kāi)發(fā)的嵌入式操作系統(tǒng)Petalinux,成功地實(shí)現(xiàn)了其在ML402開(kāi)發(fā)板上的移植,,并且在該系統(tǒng)上實(shí)現(xiàn)了基于TCP/IP協(xié)議的套接字接口Socket的網(wǎng)絡(luò)通信,。
關(guān)鍵詞: FPGA;MicroBlaze軟核處理器,;Petalinux移植,;Socket網(wǎng)絡(luò)通信
嵌入式系統(tǒng)是為特定目的而構(gòu)建的一類計(jì)算機(jī)設(shè)備。該設(shè)備具有體積小,、功耗低,、可靠性穩(wěn)定、高度自動(dòng)化,、響應(yīng)速度快等特點(diǎn),,特別適合要求實(shí)時(shí)和多任務(wù)的體系[1]。Petalinux是由PetaLogix公司專門為在Xilinx FPGA的MicroBlaze軟核處理器上運(yùn)行而開(kāi)發(fā)的嵌入式Linux,。Petalinux發(fā)布的版本中包含定制的Linux2.4/2.6內(nèi)核原碼,、U-boot內(nèi)核編碼,、相關(guān)的開(kāi)發(fā)工具以及開(kāi)發(fā)板參考硬件平臺(tái)配置,極大地方便了開(kāi)發(fā)人員的使用,,縮短了產(chǎn)品的開(kāi)發(fā)周期,。
對(duì)于如何在嵌入式系統(tǒng)上實(shí)現(xiàn)遠(yuǎn)程網(wǎng)絡(luò)通信這一問(wèn)題,本文給出了一種基于Xilinx開(kāi)發(fā)板ML402的嵌入式網(wǎng)絡(luò)通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)方案,,成功實(shí)現(xiàn)了開(kāi)發(fā)板與PC機(jī)的實(shí)時(shí)網(wǎng)絡(luò)通信,。
1 硬件工程設(shè)計(jì)
1.1 底層硬件平臺(tái)的選取與設(shè)計(jì)
本設(shè)計(jì)方案采用Xilinx EDK 10.1在ML402開(kāi)發(fā)板搭建一個(gè)最簡(jiǎn)化的硬件平臺(tái),結(jié)構(gòu)如圖1所示,。
xil
圖中各部件在FPGA 內(nèi)部以IP核的形式構(gòu)建并連接,,系統(tǒng)以帶有32 bit MicroBlaze軟核的FPGA作為控制中心,SysACE用于存放文件系統(tǒng)和應(yīng)用程序配置文件;INTC用來(lái)實(shí)現(xiàn)中斷控制,;串口可在調(diào)試時(shí)輸出系統(tǒng)的運(yùn)行信息,;以太網(wǎng)控制器用來(lái)實(shí)現(xiàn)以太網(wǎng)功能;DDR_SDRAM通過(guò)XCL總線與處理器相連,,用于對(duì)片外存儲(chǔ)器進(jìn)行訪問(wèn)[2],。
1.2 軟件平臺(tái)的配置
在移植Petalinux之前,必須配置BSP(Board Support Package),。所謂BSP,,就是為給定的板子提供特定操作系統(tǒng)支持的代碼。介于主板硬件和操作系統(tǒng)之間,,屬于操作系統(tǒng)的一部分,主要目的是為了支持操作系統(tǒng),,使之能夠更好地運(yùn)行于硬件主板。
Xilinx EDK已經(jīng)包括相應(yīng)的BSP產(chǎn)生器,,因此,,第一步只需要把解壓的Petalinux文件夾下的hardware/edk_user_repository/PetaLogix/bsp/petalinux_v1_00_b文件夾拷貝到EDK文件夾下的\sw\lib\bsp目錄下進(jìn)行相應(yīng)的配置即可。接下來(lái)打開(kāi)已建立的硬件工程,,進(jìn)行軟件平臺(tái)配置,,點(diǎn)擊Software菜單,啟動(dòng)Software Platform Setting,。系統(tǒng)會(huì)彈出軟件平臺(tái)的配置窗口,,可以看到共有3個(gè)可配置項(xiàng)——Software Platform、OS and Libraries和Drivers,。右方的窗口為可配置選項(xiàng)的參數(shù),。首先對(duì)Software Platform進(jìn)行配置,點(diǎn)擊Software Platform,,在窗口右側(cè)可以看到可配置參數(shù),,包括兩個(gè)子窗口,其一是processor parameters,,其中包括處理器主頻信息,、交叉編譯器等選項(xiàng),。其中,extra compiler flag指定了在生成BSP與庫(kù)的過(guò)程中,,交叉編譯器所用的編譯標(biāo)志,,archiver和compiler分別指定了生成BSP與庫(kù)所用的工具鏈,在這里只需保持默認(rèn)即可,。在OS and Library settings子窗口中打開(kāi)OS的下拉菜單,,選擇Petalinux,版本只有1.00.b,,如果第一步?jīng)]有完成,,則在點(diǎn)開(kāi)OS的下拉菜單后,沒(méi)有Petalinux選項(xiàng),。
完成上一步之后,選中OS and Library可配置選項(xiàng),,這里主要是針對(duì)開(kāi)發(fā)板對(duì)?滋Clinux的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,,退出,,基于Petalinux的MicroBlaze軟件平臺(tái)配置完成。下一步是根據(jù)軟件平臺(tái)的配置生成針對(duì)MicroBlaze處理器的BSP與庫(kù),,使Petalinux與開(kāi)發(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文件夾下生成auto-config.in文件[3]。
1.3 Petalinux操作系統(tǒng)的移植
軟件平臺(tái)完成后需要對(duì)內(nèi)核進(jìn)行配置,,嵌入式系統(tǒng)開(kāi)發(fā)一般采用交叉編譯的方法,,通過(guò)PC機(jī)對(duì)內(nèi)核和應(yīng)用程序進(jìn)行編譯,具體步驟如下:
(1)將工程所在目錄復(fù)制到Petalinux解壓目錄下的
~/hardware/user-platforms目錄下,。
(2)進(jìn)入Petalinux解壓目錄,,運(yùn)行source ./settings.sh命令,設(shè)置Petalinux環(huán)境變量,。
(3)進(jìn)入~/software/petalinux-dist目錄,,運(yùn)行petalinux-new-platform-k 2.6-v Xilinx-p ml402新建用戶平臺(tái);其中-v后綴為FPGA的生產(chǎn)廠商,,-p后綴為工程使用的FPGA開(kāi)發(fā)板名稱,,-k為配置內(nèi)核的版本。然后運(yùn)行make menuconfig命令,,進(jìn)入Vendor/Product Selection選項(xiàng),,選擇相應(yīng)的平臺(tái),,退出并保存。
(4)進(jìn)入工程所在文件夾,,運(yùn)行petalinux-copy-auto-
config命令,,將libgen生成的microblaze_0/libsrc/Kconfig.auto和autoconfig.in轉(zhuǎn)換成linux格式,并拷貝到當(dāng)前活躍的platform下(例如software/linux-2.6.x/arch/Microblaze/platform/ml402),。它是根據(jù)在make menuconfig中選擇的vendor/platform來(lái)拷貝的,。
(5)內(nèi)核的配置與編譯
搭建的底層硬件平臺(tái)的不同決定了系統(tǒng)內(nèi)核的區(qū)別,參考文獻(xiàn)[2]中薛慧敏針對(duì)不同情況給出了較為詳細(xì)的配置過(guò)程,,可作為參考,,在此不再贅述。
(6)Xmd下載啟動(dòng)
Xmd是Xilinx EDK提供的調(diào)試工具,,可以使用該工具對(duì)EDK開(kāi)發(fā)的工程進(jìn)行調(diào)試,。使用該方法下載image文件,啟動(dòng)Petalinux后,,通過(guò)串口超級(jí)終端可以看到系統(tǒng)啟動(dòng)過(guò)程,。
2 網(wǎng)絡(luò)通信程序的開(kāi)發(fā)
Petalinux移植成功后,就可以使用petalinux-new-app命令在其上建立軟件應(yīng)用工程,,進(jìn)行軟件應(yīng)用的開(kāi)發(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)建
進(jìn)入新建的應(yīng)用工程文件夾,,輸入命令:gedit petaserver.c,,打開(kāi)文本編輯器,對(duì).C的應(yīng)用程序進(jìn)行編輯,。本應(yīng)用工程主要是作為網(wǎng)絡(luò)服務(wù)器,,接收客戶端傳送的命令,消息經(jīng)過(guò)處理后再回饋給客戶端,,主要流程如圖2所示,。
現(xiàn)行的網(wǎng)絡(luò)協(xié)議中TCP/IP協(xié)議是最通用的一個(gè),因此,,本程序也使用該協(xié)議實(shí)現(xiàn)網(wǎng)絡(luò)的互聯(lián)[4],。
Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,,程序員可以用它們來(lái)開(kāi)發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序,。網(wǎng)絡(luò)的 Socket數(shù)據(jù)傳輸是一種特殊的I/O,,Socket也是一種文件描述符。Socket具有一個(gè)類似于打開(kāi)文件的函數(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,針對(duì)于面向連接的,、無(wú)差錯(cuò)的,、發(fā)送先后順序一致的、包長(zhǎng)度不限和非重復(fù)的TCP服務(wù)應(yīng)用,;數(shù)據(jù)報(bào)式Socket是一種無(wú)連接的Socket,,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用,主要以獨(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[1],。
(1)服務(wù)器端petaserver.c主要代碼如下:
{
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)聽(tīng)服務(wù)請(qǐng)求
{
fprintf(stderr,"bind error!\n");
exit(1);
}
if(listen(sockfd,10)==-1) // Listen函數(shù)將一個(gè)
套接字轉(zhuǎn)換為被動(dòng)傾聽(tīng)套接字
{
fprintf(stderr,"listen error!\n");
exit(1);
}
if((connfd=accept(sockfd,(struct sockaddr *)&their_addr,
&sin_size))==-1)
//Accept函數(shù)從傾聽(tīng)套接字的
完成連接隊(duì)列中接收客戶端連接請(qǐng)求
{
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ù)用來(lái)控制對(duì)套接字的寫(xiě)操作
{
fprintf(stderr,"send error!\n");
exit(1);
}
//顯示連接成功,,開(kāi)始接收客戶端信息
while((len1=recv(connfd,str,100,0)) > 0)
//recv函數(shù)用來(lái)控制對(duì)套接字的讀操作
{
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ù)用來(lái)關(guān)閉一個(gè)
套接字描述符
}
(2)啟動(dòng)服務(wù)器
程序編寫(xiě)好后,重新編譯,,生成image.bin文件,,下載該文件。
打開(kāi)超級(jí)終端,,系統(tǒng)啟動(dòng)后輸入用戶名與密碼,,進(jìn)入petalinux系統(tǒng)執(zhí)行下列命令:
ls /bin 回車
petaserver 回車
可以看到服務(wù)器端啟動(dòng)語(yǔ)句輸出:
SOCKET: Creating socket..done.
SOCKET: start bind socket..done.
SOCKET: start listen..done.
這時(shí)打開(kāi)PC機(jī)客戶端,客戶端使用成都眾山科技有限公司提供的TCP/UDP Socket 調(diào)試工具 V2.3,,點(diǎn)擊TCP Client按鈕,,在彈出的窗口中輸入服務(wù)器IP地址:192.168.0.10,端口:8000,,點(diǎn)擊連接按鈕,,可以看到當(dāng)PC機(jī)客戶端向開(kāi)發(fā)板上服務(wù)器端發(fā)出連接請(qǐng)求時(shí),服務(wù)器端通過(guò)PC機(jī)超級(jí)終端輸出:
SOCKET:start accept..server:got connection from 192.168.0.1
Successfully connect
同時(shí)在PC機(jī)socket客戶端回顯:Successfully connect,;
客戶端向服務(wù)器發(fā)送hello petalinux,;
超級(jí)終端顯示服務(wù)器端已經(jīng)接收到客戶端發(fā)來(lái)的信息,,屏幕輸出為:15(接收到的字節(jié)長(zhǎng)度)和hello petalinux(接收到的內(nèi)容)。
至此說(shuō)明客戶端與服務(wù)器端完成了網(wǎng)絡(luò)的連通,,后續(xù)就可以接入外圍設(shè)備對(duì)系統(tǒng)進(jìn)行進(jìn)一步的開(kāi)發(fā)與完善了,。
本文簡(jiǎn)單介紹了基于Petalinux的嵌入式系統(tǒng)的開(kāi)發(fā)與移植過(guò)程以及客戶端與服務(wù)器端Socket的創(chuàng)建過(guò)程,通過(guò)在客戶端及服務(wù)器端創(chuàng)建Socket實(shí)現(xiàn)了PC機(jī)與Petalinux操作系統(tǒng)的實(shí)時(shí)網(wǎng)絡(luò)通信,,實(shí)驗(yàn)證明Petalinux的穩(wěn)定性和實(shí)時(shí)性較好,,為接下來(lái)在該系統(tǒng)上進(jìn)行網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)打下了基礎(chǔ),能夠滿足進(jìn)一步實(shí)驗(yàn)需求,。
參考文獻(xiàn)
[1] 歐文盛.ARM嵌入式Linux應(yīng)用實(shí)例開(kāi)發(fā)[M].北京:中國(guó)電力出版社,,2008.
[2] 薛慧敏,武傳華,,路后兵,,等.基于MicroBlaze的Petalinux嵌入式操作系統(tǒng)移植[J].微計(jì)算機(jī)信息,2011,,27(8):109-110.
[3] 薛小剛,,葛毅敏.Xilinx ISE9.x FPGA/CPLD設(shè)計(jì)指南[M]. 北京:人民郵電出版社,2007.
[4] IT同路人.Linux標(biāo)準(zhǔn)學(xué)習(xí)教程[M].北京:人民郵電出版社,,2008.