)實驗平臺:正點原子開拓者FPGA 開發(fā)板
2)摘自《開拓者 Nios II開發(fā)指南》關(guān)注官方微信號公眾號,獲取更多資料:正點原子
3)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/docs/index.html
第二十五章基于NicheStack的WebServer實驗
本章我們通過修改Intel官方的一個Web Server的例程來展示如何在開拓者FPGA開發(fā)板上
實現(xiàn)Web Server服務(wù)器。我們可以通過在瀏覽器中輸入開發(fā)板的IP地址來訪問開發(fā)板,這時開
發(fā)板會返回一個網(wǎng)頁,我們可以通過網(wǎng)頁控制開發(fā)板的LED燈的顯示。本章分為以下幾個部分:
25.1 簡介
25.2 實驗任務(wù)
25.3 硬件設(shè)計
25.4 軟件設(shè)計
25.5 下載驗證
簡介
一、 Web Server簡介
Web Server中文名稱叫網(wǎng)頁服務(wù)器或web服務(wù)器。WEB服務(wù)器也稱為WWW(WORLD WIDE WEB)
服務(wù)器,主要功能是存儲、處理和向客戶端提供Web頁面。。
Web服務(wù)器的客戶端和服務(wù)器之間的通信使用超文本傳輸協(xié)議(HTTP)進行。提供的頁面
最常見的是HTML文檔,除了文本內(nèi)容之外,還可能包括圖像、樣式表和腳本。
用戶代理(通常是Web瀏覽器或Web爬蟲程序)通過使用HTTP發(fā)出對特定資源的請求來啟動
通信,并且服務(wù)器響應(yīng)該資源的內(nèi)容或者如果不能這樣做則響應(yīng)錯誤消息。資源通常是服務(wù)器
輔助存儲上的真實文件,但不一定是此種情況,取決于Web服務(wù)器的實現(xiàn)方式。
雖然Web Server的主要功能是提供內(nèi)容,但HTTP的完整實現(xiàn)還包括從客戶端接收內(nèi)容的方
式。此功能用于提交Web表單,包括上載文件。許多通用Web服務(wù)器還支持使用Active Server
Pages(ASP),PHP(超文本預(yù)處理器)或其他腳本語言的服務(wù)器端腳本。這意味著Web服務(wù)器
的行為可以在單獨的文件中編寫腳本,而實際的服務(wù)器軟件保持不變。通常,此函數(shù)用于動態(tài)
生成HTML文檔,而不是返回靜態(tài)文檔。前者主要用于從數(shù)據(jù)庫中檢索或修改信息。后者通常更
快,更容易緩存,但無法提供動態(tài)內(nèi)容。Web服務(wù)器不僅用于服務(wù)萬維網(wǎng),還可以嵌入在諸如
打印機,路由器,網(wǎng)絡(luò)攝像頭之類的設(shè)備中,并且僅用于本地網(wǎng)絡(luò)。用作監(jiān)視或管理以上設(shè)備
系統(tǒng)的一部分。這通常意味著不需要在客戶端計算機上安裝其他軟件,因為只需要Web瀏覽器
(現(xiàn)在大多數(shù)操作系統(tǒng)都包含瀏覽器)。
二、 Read-Only Zip File簡介
英特爾FPGA提供了一個只讀zip文件系統(tǒng),用于硬件抽象層(HAL)。只讀zip文件系統(tǒng)提
供對存儲在Flash中的簡單文件系統(tǒng)的訪問。該文件系統(tǒng)適用于嵌入式軟件。驅(qū)動程序利用文
件子系統(tǒng)的HAL通用設(shè)備驅(qū)動程序框架。因此,可以使用ANSI C標(biāo)準(zhǔn)庫I/O函數(shù)(例如fopen()
和fread())訪問zip文件子系統(tǒng)。英特爾FPGA只讀zip文件系統(tǒng)作為軟件包提供。HAL驅(qū)動程
序的所有源文件和頭文件都位于<Nios II EDS安裝路徑>/components/altera_ro_zipfs/HAL
目錄中。
zip文件必須是未壓縮的。Altera只讀zip文件系統(tǒng)僅使用zip格式將文件捆綁在一起;它不
提供已知zip工具的文件解壓縮功能。使用WinZip GUI可以直接創(chuàng)建沒有壓縮的zip文件。或者
使用-e0選項在命令行中使用winzip或pkzip時禁用壓縮。
實驗任務(wù)
本章的實驗任務(wù)是使用基于Nios II SBT for Eclipse自帶的Web Server工程模板建立一
個適用于開拓者開發(fā)板的Web Server。
硬件設(shè)計
本章的Web Server實驗硬件部分可以基于《基于NicheStack的簡單telnet服務(wù)器實驗》,
在該實驗的硬件部分(Qsys)對三個IP核的設(shè)置進行小的修改即可。
第一個修改的IP核是添加到Qsys的EPCS IP核, 將其名稱修改為epcs_flash_controller,將
其地址設(shè)置為0并鎖定,如下圖所示:
圖 25.3.1 設(shè)置EPCS的名稱和基址
修改名稱是為了和軟件部分相對應(yīng),后面會講到,修改地址是為了方便后面使用,也是因
為此工程的要求。
第二個修改的IP核是SDRAM,因為我們將EPCS的地址設(shè)為0,所以我們需要將SDRAM的地址
設(shè)為0x0200_0000或其它的合適值,如下圖所示:
圖 25.3.2 設(shè)置SDRAM的基址
第三個修改的IP核是Nios II,由于修改了EPCS的名稱,所以需要將Reset Vector重新設(shè)
置為更改之后的EPCS,如下圖所示:
圖 25.3.3 重新設(shè)置Nios II的復(fù)位向量
修改完之后如果沒有錯誤的話就重新Generate,如果有地址錯誤,就先點擊自動分配地址,
然后再修改SDRAM的地址為0x0200_0000或其它的合適值即可。重新Generate之后,由于硬件的
Verilog HDL頂層代碼和之前一樣,無需改動,所以我們直接編譯生成sof文件。
至此,硬件部分設(shè)計完成,下面開始基于 Nios II SBT for Eclipse 的軟件部分的設(shè)計。
軟件設(shè)計
在打開Nios II SBT for Eclipse之前,我們需要做一些準(zhǔn)備工作以便能正確運行Web
Server。
因為Nios II SBT for Eclipse自帶的Web Server工程模板例程是需要Read-Only Zip文件
系統(tǒng)才可以正常運行,很不幸的是官方的Read-Only Zip文件系統(tǒng)的驅(qū)動程序是基于并行接口
的CFI Flash,而我們開拓者開發(fā)板上只有基于串行SPI接口的EPCS,而沒有并口的CFI Flash,
所 以 不 進 行 相 應(yīng) 修 改 是 使 用 不 了 的 。 這 里 我 們 需 要 將 位 于 <Quartus 安 裝 文 件
夾>\nios2eds\components\altera_ro_zipfs\HAL\src目錄下的altera_ro_zipfs.c文件替換
成我們提供在本工程的doc文件夾下的支持串行接口Flash的altera_ro_zipfs.c文件。下面我
們以read_word函數(shù)來簡單的看一下這兩個文件的區(qū)別。
原始的altera_ro_zipfs.c文件的read_word函數(shù):
圖 25.4.1 原read_word函數(shù)
更改后的altera_ro_zipfs.c文件的read_word函數(shù):
圖 25.4.2 修改后的read_word函數(shù)
可以看到更改后的文件增加了if-else語句來判斷是串口的Flash還是并口的Flash。需要
注意的是其中的EPCS_FLASH_CONTROLLER_BASE和epcs_flash_controller,只有當(dāng)我們在Qsys
中將EPCS的名稱設(shè)置為epcs_flash_controller時才會出現(xiàn)的。
現(xiàn)在我們打開Nios II SBT for Eclipse,點擊File/New/Nios Application and BSP from
Template選項后進入圖 25.4.3所示界面,輸入完相應(yīng)的信息后,我們在左下方的“Template”
欄選擇“Web Server”,這是一個在MicroC/OS-II上使用NichStack的HTTP服務(wù)器工程模板,
服務(wù)器可以處理從Altera只讀zip文件系統(tǒng)提供的HTML、JPEG和GIF文件的基本請求,需要注意
的是它并不是功能齊全的HTTP服務(wù)器的完整實現(xiàn)。
圖 25.4.3 創(chuàng)建Web Server工程
選擇完成后,點擊“Finish”,工程創(chuàng)建完成后,有如下圖所示的工程目錄結(jié)構(gòu):
圖 25.4.4 WebServer工程結(jié)構(gòu)
其中的C源文件說明如下:
alt_error_handler.c:alt_uCOSIIErrorHandler函數(shù)的定義,用于MicroC/OS-II錯誤的
簡單錯誤處理程序,并打印相應(yīng)信息。
alt_error_handler.h:上述函數(shù)的聲明。
http.c:HTTP服務(wù)器的實現(xiàn),包括所有必要的套接字調(diào)用,以處理多個連接并解析基本HTTP
命令以處理GET和POST請求。通過HTTP GET對文件的請求指示服務(wù)器從Flash文件系統(tǒng)獲取文件
(如果可用)并將其發(fā)送到請求它的客戶端。
http.h:定義HTTP服務(wù)器實現(xiàn)和常見HTTP服務(wù)器字符串和常量的頭信息。
network_utilities.c:包含用于管理尋址的MAC地址、IP地址和DHCP。這些在初始化期間
由NicheStack使用,但是是特定于實現(xiàn)的,所以我們需要對該文件稍作修改——將MAC地址設(shè)
置為任何合適的值,后面我們會講解如何修改。
srec_flash.c:包含遠程配置所需的SREC解析和flash編程例程。
web_server.c:main函數(shù)所在的源文件,包含大量代碼,包括,網(wǎng)絡(luò)初始化例程,Web服
務(wù)器任務(wù)(WSTask)以及所有板控制實用程序/任務(wù)。
web_server.h:整個示例應(yīng)用程序的定義。
另外system文件夾下的ro_zipfs.zip文件是ro_zip文件系統(tǒng)所使用的文件,我們將其替換
成我們自己的ro_zipfs.zip文件(放在工程所在的doc文件夾下)。
因為此例程默認使用DHCP客戶端,由于我們不需要使用,所以將其關(guān)閉。右鍵點擊
qsys_webserver_bsp,選擇“Nios II/BSP Editor”,進入下圖所示界面
圖 25.4.5 取消勾選DHCP客戶端
在 “ Software Packages” 菜 單 欄 下 選中“ altera_iniche ” 后 取 消 勾 選
“enable_dhcp_client” 。 除 此 之 外 , 我 們 還 需 要 設(shè) 置 “ altera_ro_zipfs ” 。 選 中
“altera_ro_zipfs”后,將“ro_zipfs_offset”設(shè)置為0x100,如下圖所示:
圖 25.4.6 設(shè)置ro_zip文件系統(tǒng)的偏移地址
其中“ro_zipfs_base”是Flash器件在Qsys中的基址,由于我們在Qsys中將EPCS的基址設(shè)為0x0,所以此處無需修改,此處需要注意的是該工程模板的要求是存放Flash的基址必須是0x0,
“ro_zipfs_name”為文件系統(tǒng)的掛在點,保持默認即可,“ro_zipfs_offset”指明文件系統(tǒng)
在Flash中的偏移量,默認值為0x100000,遠大于EPCS器件的大小(0x800),所以此處我們將
其設(shè)置為0x100。設(shè)置完成后,點擊右下角的“Generate”,再點擊“Exit”退出,彈出下圖
所示信息時點擊“Yes,Save”。
圖 25.4.7 保存修改
為了編譯能正確通過,我們再次右鍵點擊qsys_webserver_bsp,選擇“Nios II/ Generate
BSP”。
因為不使用DHCP,所以我們需要設(shè)置靜態(tài)IP地址。打開qsys_webserver目錄下的
web_server.h文件,修改第64行~72行的宏定義,如下圖所示:
圖 25.4.8 設(shè)置靜態(tài)IP地址
修改完靜態(tài)IP地址后,我們還需要給WebServer服務(wù)器一個MAC地址。我們只需將
qsys_webserver目錄下的network_utilities.c文件第282行的get_board_mac_addr函數(shù)修改
成如下形式:
圖 25.4.9 設(shè)置MAC地址
MAC地址任意設(shè)置。設(shè)置完成后,如果我們直接編譯工程,會出現(xiàn)如下錯誤:
圖 25.4.10 未定義錯誤
因為我們沒有“EXT_FLASH_NAME”只有“EPCS_FLASH_CONTROLLER_NAME”,所以我們需要
將錯誤所在行的“EXT_FLASH_NAME”替換為“EPCS_FLASH_CONTROLLER_NAME”。替換完成后,
編譯通過。
經(jīng)過以上修改后,軟件設(shè)計部分就可以正常使用了。
下載驗證
講完了軟件工程,接下來我們就將該實驗下載至我們的開拓者開發(fā)板進行驗證。
首先我們用一根網(wǎng)線將開發(fā)板和電腦進行連接,然后連接JTAG和電源,開發(fā)板上電后我們
在Quartus II軟件中將qsys_eth.sof文件下載至我們的開拓者開發(fā)板,qsys_eth.sof下載完成
后,我們就將ro_zip文件系統(tǒng)下載至我們的EPCS,下載方法如下:
在Nios II SBT for Eclipse軟件中點擊“Nios II”菜單欄,單擊“Flash Programmer”,
如下圖所示:
圖 25.5.1 打開Flash Programmer
或者按快捷鍵Ctrl+7,彈出下圖所示界面:
圖 25.5.2 新建下載項
我們點擊“File”菜單,選擇“New...”,彈出下圖所示界面:
圖 25.5.3 加載settings.bsp文件
我們先點擊箭頭1所指的“…”添加qsys_webserver_bsp工程下的settings.bsp文件,然
后點擊箭頭2所指的“OK”按鈕,進入下圖所示界面:
圖 25.5.4 出現(xiàn)時間戳不匹配錯誤
可以看到界面下方出現(xiàn)了系統(tǒng)時間戳不匹配的錯誤,我們單擊右上角箭頭1所指的
“Connection...”按鈕,在下圖所示界面中,勾選“System ID checks”下的兩個選項:
圖 25.5.5 勾選忽視時間戳匹配
此時系統(tǒng)時間戳不匹配的錯誤變成警告,不影響下載,單擊“Close”按鈕。點擊圖 25.5.4
箭頭2所指的“Add...”按鈕,在彈出的界面中將標(biāo)識1的“Files of type”設(shè)置為“All Files”,
標(biāo)識2的“Look in”為qsys_webserver的system文件夾,選中標(biāo)識3的“ro_zipfs”,單擊標(biāo)
識4的“Select” ,如下圖所示:
圖 25.5.6 添加ro_zip文件
回到下圖所示界面后,我們將箭頭1所指“Flash Offset”設(shè)置為0x100,這是我們在BSP中
設(shè)置的ro_zip文件系統(tǒng)在Flash中的偏移地址,然后點擊箭頭2所指的“Start”,開始將ro_zip
文件系統(tǒng)下載到EPCS中。
圖 25.5.7 設(shè)置偏移地址
下載完成后,在win10系統(tǒng)下可能會彈出下圖所示的警告,這是由于版本不新引起的,不過不影響功能,在win7系統(tǒng)下則沒有此警告。點擊“Exit”,退出下載Flash界面。
圖 25.5.8 win10下的警告
將ro_zip文件系統(tǒng)下載到開拓者開發(fā)板的EPCS Flash中后,我們將最后一個文件
qsys_webserver.elf下載至我們的開拓者開發(fā)板,qsys_webserver.elf下載完成以后,我們的
C程序就會執(zhí)行在我們的開拓者開發(fā)板上,此時在Nios II Console上打印如下信息:
圖 25.5.9 Nios II控制臺打印信息
從中我們可以看到此處MAC地址(十六進制)與我們設(shè)置的十進制相符,IP地址也是我們
設(shè)置的靜態(tài)IP地址192.168.1.234。et1的IP地址為192.168.1.234,此IP地址為我們可以通過
電腦瀏覽器訪問的地址。
現(xiàn)在我們打開電腦的瀏覽器,看一下會出現(xiàn)什么結(jié)果吧。此處我們選擇Google Chrome瀏
覽器(任一瀏覽器都可以),在地址欄輸入“192.168.1.234”,如下圖所示:
圖 25.5.10 瀏覽器中輸入IP地址
回車后,出現(xiàn)下圖所示界面:
圖 25.5.11 連接成功后顯示的網(wǎng)頁
與此同時,控制臺會打印以下信息:
圖 25.5.12 控制臺打印相應(yīng)信息
表明成功抓取到需要顯示的文件。
我們點擊“LEDs”下的“Start”按鈕后,開拓者開發(fā)板上的4個led燈顯示快速流水效果,
如下:
圖 25.5.13 顯示結(jié)果
即使在潮濕的道路上,現(xiàn)代Grand i10 Nios Turbo也能完成0-100英里/小時的速度行駛僅10.1秒。在干燥狀態(tài)下,它可以舒適地在10秒標(biāo)記以下。
憑借空間,功能,燃油效率,舒適性以及當(dāng)然,價格承受能力比其他各個方面都要重要,結(jié)果幾乎永遠不會是每當(dāng)您接過方向盤時都能露出笑容的汽車。
近期,Maruti Suzuki和Tata分別與Baleno RS和Tiago JTP合作,試圖以預(yù)算吸引愛好者,但收效甚微。現(xiàn)在,現(xiàn)代汽車希望通過新的現(xiàn)代Grand i10 Nios Turbo來試試運氣,通過在引擎蓋下插入100馬力的1.0升渦輪增壓汽油,給人一種非常明智,非常實用的掀背車。
現(xiàn)代Grand i10 Nios Turbo引擎蓋下的1.0升渦輪增壓汽油輸出100bhp和172Nm,并配有5速手動變速箱。
這是為Venue,Verna和Aura提供動力的引擎。但是,與Venet和Verna的120bhp調(diào)諧狀態(tài)不同,在Grand i10 Nios的情況下,就像其緊湊型轎車衍生產(chǎn)品一樣,這款三缸渦輪增壓汽油發(fā)動機可輸出100bhp的峰值扭矩和172Nm的峰值扭矩。這些數(shù)字再加上980千克的整備重量,應(yīng)該使Grand i10 Nios Turbo迅速擺脫困境,而且的確如此。不幸的是,我們測試汽車的那天也碰巧是迄今為止最下雨的日子,即使是我們能找到的最干燥的柏油碎石地也相當(dāng)潮濕。盡管如此,Nios Turbo還是從靜止開始10.1秒就達到了100kmph,實際上是第二檔。可以肯定的是,在干燥條件下,汽車的0-100公里/小時的行駛時間很容易在10秒以下。為了獲得最佳效果,請使發(fā)動機轉(zhuǎn)速高于2,000標(biāo)記,使其一直旋轉(zhuǎn)到最高6,600rpm的紅線,這將很高興。較長的齒輪傳動裝置可以使您在每個齒輪檔中都有足夠的轉(zhuǎn)速,并且在城市交通中也很容易駕馭。盡管像普通的1.2 Nios一樣,Nios Turbo也采用了5速手動變速箱,但它們并不是同一單位。它提供了精確的變速,可以很好地插入正確的檔位。
現(xiàn)代Grand i10 Nios的懸架已經(jīng)有一點穩(wěn)固的跡象,尤其是在低速行駛時;在Nios Turbo的情況下,它可以使它在大多數(shù)速度下總體感覺更加平衡。盡管如此,Nios Turbo和1.2汽油版一樣,感覺更偏向舒適。快速地走過彎道,不會嚇到您放慢腳步,但也不會使您更加努力。話雖如此,它仍然比大多數(shù)家庭掀背車要好,但不能與VW Polo 1.0 TSI等汽車相提并論,這將不可避免地成為Nios Turbo的評判對象。盡管轉(zhuǎn)向沒有提供任何理由去抱怨重量,但它并沒有提供太多反饋信息。但是,我們最大的問題是現(xiàn)代決定堅持使用標(biāo)準(zhǔn)175/60 R15橡膠,而且,面向燃油效率的Nios Turbo MRF Ecotred。對于Nios Turbo之類的東西,更胖,更抓地力的橡膠會更有意義,并且確實可以幫助改善整體駕駛體驗。更好的橡膠也將有助于改善制動性能,這固然不錯,但是肯定還有改進的余地。
普通Nios和Nios Turbo之間唯一的后方視覺區(qū)別是行李箱蓋和前格柵上存在Turbo徽章
在更實際的方面,按照現(xiàn)代汽車的要求,配備1.0升渦輪增壓汽油的Grand i10 Nios整體油耗為20.3kmpl,僅比1.2汽油低0.4kmpl。現(xiàn)代汽車僅在頂級Sportz內(nèi)飾中提供第二個Nios Turbo,因此您可以獲得套件,例如帶有Apple CarPlay和Android Auto的觸摸屏,倒車攝像頭,自動空調(diào),無線充電,投影儀大燈和霧燈等。但是,它錯過了無鑰匙進入和按鈕啟動/停止以及后雨刮器的功能。在視覺上,唯一的區(qū)別是在前后分別增加了“ Turbo”徽章和您在此處看到的黑色和紅色雙色調(diào)處理,這是Turbo變體所獨有的。16英寸合金輪轂與1.2 Grand i10 Nios相同。在設(shè)計方面,我們真的沒有什么可抱怨的,除了行李箱蓋上的各種徽章。聽起來我們好像在這里挑剔,但如果您包括現(xiàn)代徽標(biāo),則有五個徽章,我們希望它看起來更干凈。
現(xiàn)代Grand i10 Nios Turbo功能列表包括無線智能手機充電。
現(xiàn)代Grand i10 Nios Turbo表現(xiàn)出色,這主要歸功于為其提供動力的一流1.0升渦輪增壓汽油發(fā)動機。它的直線速度很快,可以發(fā)揮相當(dāng)大的功率和扭矩,并且在驅(qū)動動力方面也不會令人失望。換上更好的橡膠,Nios Turbo會比現(xiàn)在輕松得多。盡管它可能不如處理部門的主要競爭對手那么熟練,但它速度稍快,而且更實用,功能更豐富,更便宜且總體上更易于使用。尋找Grand i10 Nios Turbo那種性能的買家應(yīng)該會發(fā)現(xiàn),現(xiàn)代汽車為Turbo收取的溢價比普通的1.2 Nios Sportz DT高。您對待Hyundai Grand i10 Nios Turbo的態(tài)度決定了它是否有意義。如果您打算尋找VW Polo 1.0 TSI的替代產(chǎn)品,那么駕駛經(jīng)驗可能會讓您有些不知所措。但是,如果您將Grand i10 Nios Turbo當(dāng)作明智的家庭用艙口蓋使用,并且既實用又令人興奮,那么這輛車就變得很有意義了。
紅色和黑色雙色調(diào)外部處理是Grand i10 Nios Turbo車型獨有的。