
2.1 利用EDK搭建硬件系統
利用EDK8.2軟件搭建硬件系統,因為基于Linux的操作系統設計中,CPU、RAM和總線是必須的。由于芯片內部的BRAM只有128kb/s, 而下載Linux內核的.elf文件通常遠大于這個容量,因此需要使用外部的存儲單元。本文使用opb_sdram存儲控制模塊實現此功能。本文使用Uart16550控制模塊,能方便地通過RS232端口觀察測試的結果。為滿足本文應用的需要,可以使用Uartlite模塊實現RS232的COM2端口和外部設備通信的功能。添加Ethernet_Mac的IP模塊,可使用以太網端口將開發板連接到網絡上。為了調試的方便,可以加入GPIO模塊。通過GPIO控制LED燈,可顯示系統狀態。若選擇應用程序初始化硬件,當bit數據下載到FPGA系統正常運行時,可以觀察到LED燈被點亮。另外,根據設計需求,也可以掛載用戶定制的IP,以處理用戶的特定的需求。
選擇參數時,可以使用默認值,而存儲器參數可以選擇容量大一些的。使用的PowerPC 405硬核,PPC的工作頻率設置為100MHz, 參考時鐘和系統的總線頻率也分別設置為100MHz;使用的BRAM模塊IBRAM和DBRAM速率分別設置為64Kb/s。最終定制的SoPC硬件系統如圖4所示。

2.2 SoPC的Linux系統構建
在SoPC的硬件系統構建完成之后,利用EDK軟件生成的板級支持包(BSP)配置編譯內核。BSP包含了所選定處理器架構的屬性文件以及相關硬件的驅動源文件。將這些文件加入到Linux內核中,然后配置內核選項選擇對應的處理器架構、所選硬件的驅動模塊以及需要的其他內核模塊,之后再對完成配置的內核進行編譯,生成Linux的內核image文件。
生成內核image文件之后,還需要生成系統運行所需要的根文件系統。根文件系統中包含了嵌入式Linux系統的所有應用程序、庫以及系統配置等相關文件。根文件系統中常用的程序和命令可利用開源軟件Busybox構造。構造完成之后,在Busybox生成的目錄和文件的基礎上再構造根文件系統的目錄樹,并添加相關設備文件和配置文件以及系統運行時需要的腳本文件,從而形成最終的根文件系統。至此,就可以將文件系統作為映像編譯到內核中,也可以通過網絡使用NFS文件系統加載根文件系統。
3 應用舉例
以一個多進程的嵌入式Web服務器用于實現控制遠程設備的的開發為例,闡述在基于Linux的SoPC系統上開發應用程序的過程。嵌入式Web服務器的開發包括HTTP協議裁減和具體的應用程序實現。用戶可以通過向Web服務器發送CGI請求的方式使服務器通過串口和外部設備通信,達到遠程控制的目的。
3.1 HTTP協議裁減
嵌入式Web服務器主要基于HTTP協議進行設計,而HTTP協議的實現又是基于TCP/IP協議棧的。在Linux內核中,由于已經包含了TCP/IP協議棧的完整實現,從而為嵌入式Web服務器的實現提供了很好的基礎。相對于在無操作系統環境的SoPC上實現Web服務器來說,基于Linux系統的開發可以節省大量的工作。
HTTP協議是一個屬于應用層的面向對象的協議,由于其采用簡捷、快速的方式,適用于分布式超媒體信息系統[4]。嵌入式Web服務器根據不同的需要,實現的功能也不同。相對于完整的Web服務器,它需要實現的功能要簡單得多[5]。本文的嵌入式Web服務器僅實現協議中最常用的部分。考慮到嵌入式系統的存儲空間和處理能力,對HTTP協議進行了裁減。這不僅可以提高Web服務器的效率,也可以減少占用的空間,具有積極的意義。
當客戶機與Web服務器進行會話時,客戶機首先通過SOCKET與服務器建立連接,連接之后便向服務器提出請求,請求信息包括希望返回的文件名和客戶機信息等。客戶機以請求頭(包括HTTP方法和頭字段[6])的形式將信息發送給服務器。HTTP方法常用的有GET、HEAD、POST,因此本文即采用GET、HEAD、POST三種方法。
HTTP頭字段包括general-header、request-header、response-header、entity-header四大類,而每一類中又定義了多個類型[6],其中的大部分都是不常用的,所以應根據需要選定幾種類型。本文設計的服務器支持以下幾種頭類型:Date、Host、Server、Accept、Connection、Content-Type、Content-Length、Accept-Charset、 Accept-Language。
服務器收到一個請求,就會立刻解釋請求中所用到的方法,并開始處理,處理完成之后會發送應答消息。應答消息包含了狀態碼、一些頭字段以及實體信息(即客戶請求的服務器上的資源內容),其中HTTP協議的狀態碼也有四大類[6]。這些狀態碼詳細說明了服務器的狀態、出錯信息以及對用戶的指示。由于嵌入式Web服務器只需向用戶提供服務,而無需向用戶反饋具體的狀態,因此,本文實現中只保留特定的幾種錯誤信息,而省略了大部分的狀態信息。
3.2 支持多進程的嵌入式Web服務器的實現
本系統的設計對HTTP協議進行了裁減,然后利用Linux系統提供的進程調度功能、網絡通信功能(包括SOCKET、TCP連接等),使用C語言編寫了一個支持多進程的Web服務器。實現的Web服務器接收客戶端的請求,根據需要選擇發送文件通過串口和外部設備通信,并將外部設備返回的結果發送給客戶端。其功能描述如下:在指定的端口監聽用戶的HTTP請求,對該請求進行分析解釋并執行相應的操作;將用戶要求的內容或者出錯信息以HTTP應答的方式返回給用戶。其中,用戶的請求分為CGI請求和非CGI請求,如果是CGI請求,則首先檢查用戶的權限和文件是否存在,然后新創建一個進程,并在該子進程中通過串口和外部設備通信,最后將串口返回的結果或者出錯信息傳送給Web服務器返回給用戶;如果是非CGI請求,則只進行權限和文件檢查,如果檢查通過則發送該文件,否則給出出錯信息。軟件的工作流程如圖5所示。

本文給出了基于Linux的SoPC開發的方法,并實現了一個具體的應用設計——嵌入式Web服務器。該設計快速、簡單,而且由于基于Linux操作系統,從而保證了系統的穩定性,同時因為利用了系統的進程調度功能,加快了信息的處理速度。SoPC和嵌入式Linux操作系統二者的結合,既滿足了嵌入式應用按需定制、量體裁衣的需求,又能開發出穩定而功能強大的嵌入式系統。這在嵌入式應用日益復雜的背景下,具有很大意義和良好的應用前景。
參考文獻
[1] AVNET. Virtex-II Pro FF1152 development board user’s guide. https://www.em.avnet.com. 2005.
[2] 董代潔.基于FPGA的可編程SoC設計.北京:北京航空航天大學出版社,2006.
[3] IBM. Core connect bus architecture. http://www-03.ibm.com/chips/products/coreconnect/. 2004.
[4] DOUGLAS E C.用TCP/IP進行網際互聯(第一卷):原理、協議與結構. 第四版.林瑤,譯.北京:電子工業出版社, 2001.
[5] 劉殿敏, 李科杰. 基于Linux嵌入式HTTP網絡服務器的設計與實現[J]. 計算機工程,2004,(23):193-195.
[6] FIELDING R, GETTYS J, MOGUL J, et al.RFC2616: Hypertext transfer protocol——HTTP/1.1. The Internet Engineering Task Force, June 1999.





