摘 要: 隨著嵌入式Web的飛速發(fā)展,以Internet為中間環(huán)節(jié)使不同嵌入式設備進行通信的需求日益強烈,特別是在工業(yè)監(jiān)控領域。采用項目組自行研發(fā)的內嵌有MAC模塊的定制版32位處理器作為硬件平臺,以此為基礎設計了基于描述符的DMA傳輸機制的網絡驅動。同時,為了實現穩(wěn)定數據通信及Web瀏覽器功能,對嵌入式TCP/IP協議棧LwIP進行了無操作系統(tǒng)移植,并對協議棧內部的數據管理方式及底層接口進行詳細分析。測試結果表明,LwIP協議棧適用于工業(yè)遠程監(jiān)控,能夠在實現穩(wěn)定通信的同時兼顧速度與小內存消耗。
關鍵詞: LwIP 協議棧; 網絡驅動; 嵌入式系統(tǒng); 片上可編程系統(tǒng)
中圖分類號: TN915.04?34; TM417 文獻標識碼: A 文章編號: 1004?373X(2016)19?0011?05
Abstract: With the rapid development of the embedded Web, the communication demand among different embedded devices through the Internet becomes increasingly intense, especially in the industrial monitoring field. The customized 32?bit processor embedding MAC module was taken as the hardware platform, which was developed by the project group itself. And on this basis, the network drive of descriptor?based DMA transfer mechanism was designed. In order to realize the functions of stable data communication and Web browser, the protocol stack LwIP of the embedded TCP/IP was performed with transplantation without operating system. The data management method and bottom?layer port inside the protocol stack are analyzed in detail. The test results show that the LwIP is suitable for the the industrial remote monitoring, and can realize stable communication while ensuring the high speed and low memory consumption.
Keywords: LwIP; network drive; embedded system; programmble system on chip
0 引 言
嵌入式設備正在深度改變人們的日常生活與社會生產,小到生活中的各式智能家電,大到國防軍用航空航天設備。嵌入式Internet正在覆蓋更多的終端設備,而在眾多Internet通信協議中TCP/IP協議是目前運用次數最多,應用范圍最廣的一種標準協議[1]?;谏鲜鎏攸c,本文旨在為某研究所定制一款具有自主知識產權的定制版32位處理器,要求具備網絡訪問功能,能實現實時通信。此款處理器主要用于遠程工業(yè)控制,有低功耗、實時通信的特點[2]。
1 硬件驗證板卡設計
系統(tǒng)采用32位處理器,工作在100 MHz主頻,擁有256 KB的指令和數據內存以及32 KB的系統(tǒng)內存。它還包括:片上PLL,16通道、12位、5 MSPS ADC,10M/100M RMII接口的MAC,定時器,看門狗,64個GPIO,UART,SPI,I2C,LPC等多種功能豐富的外設,本芯片采用SMIC 0.13 μm工藝,144TQFP封裝。
為了驗證SoC芯片的性能和各個功能模塊,設計了一個硬件驗證板卡,如圖1所示。該板卡擁有完備的電源解決方案、復位管理和外設支持,滿足系統(tǒng)工作需求;設計有基于SPI總線的FLASH存儲器,基于I2C總線的E2PROM;擁有溫度測量模塊、以太網模塊,對外的串口通信模塊,用于驗證各個模塊的功能;另外,測試板卡將處理器的各個管腳引出,能夠同時滿足裸片測試和封裝后的成品芯片測試。
處理器內部集成有MAC模塊,需要一個PHY接口與以太網進行連接。在硬件板卡設計中,使用RMII接口進行通信的LAN8720搭建以太網通信模塊。
2 協議層網絡接口設計
底層網絡接口的設計包括協議層與驅動層兩部分內容,其中協議層的設計與協議本身的關系較為密切,包括了協議棧的初始化及網絡接口相關內容的初始化,這一部分的編寫具有可移植性,而驅動層的設計則與硬件驅動更為接近,需根據不同網絡設備分別進行設計[3]。協議棧的入口函數為lwip_init_task,所有與協議棧移植相關的文件都由此開始,此函數結構如圖2所示。
網絡接口的設置,首先需要設置網關、IP地址及子網掩碼,而后根據網絡接口情況通過nerif_add函數設置網絡接口信息。在本工程中只使用一個網絡接口,因此只需添加一個netif即可。函數netif_add的主要功能就是添加新的接口并設置該接口的netif信息,指定注冊函數,因此首先為當前網口申請全局netif結構體[4]。
3 驅動層LwIP接口的設計與實現
3.1 網卡驅動設計實現
3.1.1 網卡的數據存儲
在網卡驅動編寫時最核心的部分是數據的存儲與傳輸方式。在SoC設計中,根據需求MAC被集成在處理器中。但在實際編程設置過程中仍可將MAC部分看做一個獨立芯片,其同CPU之間的數據交換也與其他網卡芯片和主機間的數據傳遞并無太大出入[5]。在MAC同CPU進行數據交換時,不論是發(fā)送還是接收都需要使用到描述符鏈表及數據緩沖區(qū)。以發(fā)送為例,描述符與數據緩沖區(qū)被同時存儲在系統(tǒng)共享RAM中,數據緩沖區(qū)儲存著需要被發(fā)送的數據,而描述符則相當于一個指針指向被描述的數據緩沖區(qū)。
描述符有兩種不同的構造形式,即鏈型與環(huán)形。但不論是哪種構造形式,在RAM中都以相同的特殊寄存器形式存在,且一幀數據可占用多個描述符,但一個描述符僅能描述一幀數據。對于鏈型描述符而言,其第二個數據緩沖區(qū)用作指針指向下一個描述符。在環(huán)形結構中,相鄰兩個描述符之間的距離是在狀態(tài)寄存器CSR0中提前設置的,因此第二個緩沖區(qū)也能夠存儲數據。但由于環(huán)形結構的自身特點,當使用這種形式描述數據時,主機必須提供至少兩個串聯好的描述符以供識別。描述符的首地址需存儲在狀態(tài)寄存器中,CSR3存放接收描述符地址,CSR4則用于發(fā)送。本文中接收與發(fā)送數據緩沖區(qū)都是用鏈型描述符。
發(fā)送與接收數據的過程有一些不同,在發(fā)送過程中,主機通過改變OWN位將第一個描述符交給MAC,由MAC發(fā)送其所指向的數據。同時主機依然保持對下一個描述符的所有權,這樣可以給主機準備第二包數據的時間。而在接收過程中則相對簡單,通常來說描述符都由MAC掌握,除非此時主機為掛起狀態(tài)。
發(fā)送數據FIFO最多可存放兩幀的數據,這兩幀中包括當前正在等待發(fā)送的那一幀。而接收數據FIFO最多可存放四幀數據,這四幀中包括正在傳輸的那一幀[6]。不論是發(fā)送還是接收數據的流向總是在數據接口、FIFO及MII接口之間進行,只是方向相反。實際上在向PHY發(fā)送或接收數據時使用的接口為RMII,但作為MII的子分類,本文統(tǒng)一使用MII進行描述。
3.1.2 內部操作流程
(1) DMA控制器
數據在網卡與主機間通過DMA傳輸,這樣可以有效地避免多次內存拷貝帶來的時間及內存開銷,大大提高了數據的傳輸效率。同時DMA可以通過CSR0.1位被設置為兩種模式:當此位置1時,接收與發(fā)送享有同等的優(yōu)先級,DMA以輪詢的方式交替服務于二者之間;當設置為0時,若非當前正在發(fā)送則接收的優(yōu)先級將高于發(fā)送,但不論接收還是發(fā)送進程阻塞時間都不得多于兩次。每次通過DMA傳輸時的數據傳輸量也可以設為單字傳輸或自定義寬度傳輸,這里使用初始化設置,不定義最大寬度,因此由傳輸FIFO的大小來決定。
(2) 發(fā)送流程
發(fā)送過程共有三種狀態(tài),包括運行、暫停及掛起。停止狀態(tài)只在軟件及硬件復位或收到暫停命令時才會發(fā)生。在發(fā)送正常運行時,會按描述符指向的數據順序進行傳輸,此時若發(fā)送進程被掛起,發(fā)送流程將停留在下一描述符的位置,當再次運行時會從當前指向的描述符繼續(xù)進行。而一旦進入發(fā)送流程,除非主機改寫了CSR4,即保存發(fā)送鏈表基地址的寄存器,則基地址寄存器將保持為提取下一個描述符地址的狀態(tài)。因此對CSR4進行改寫時MAC必須為暫停狀態(tài)。
(3) 接收流程
與發(fā)送過程類似,接收過程也分為三種狀態(tài),包括運行、暫停及掛起。在軟、硬件復位及收到暫停命令時,發(fā)送將會暫停直到下次運行命令到來。當進入發(fā)送狀態(tài)時,MAC從接收描述符列表上獲取描述符且無論是否在鏈路上有等待被接收的數據。若當前沒有任何一幀數據待接收,則MAC保持等待狀態(tài),一旦有效幀出現接收過程則正式開始將數據填入當前描述符所指向的緩沖區(qū)。當此幀數據傳輸結束或數據緩沖區(qū)已滿,當前描述符中的OWN位將被清零用來表示當前描述符已被關閉。與此同時,下一個準備好的描述符將被獲取,數據會繼續(xù)填充緩沖區(qū)。
3.1.3 網卡驅動設計
在開始實際的網卡驅動程序編寫前,首先需要進行頭文件Nmac.h的編寫。這個文件規(guī)范了后續(xù)所有寄存器的操作,將所涉及到的寄存器編寫為結構體[7]。其中每個寄存器的每一位被獨立定義,這樣一來在后續(xù)的寄存器操作中,可隱藏按位讀寫帶來的程序不易讀不易改等問題。
網卡的所有控制狀態(tài)寄存器,如表1所示。可直接由主機進行操作,且每個寄存器都為32位,4字節(jié)對齊,因此在頭文件中首先將這12個寄存器集合成結構體。
接收描述符被分為4個32位數RDES0~RDES3,其中RDES2與RDES3存放接收緩沖區(qū)的地址。但根據選用鏈式或環(huán)形結構的不同選擇,RDES3分別存放下一個描述符的地址或接收緩沖區(qū)地址。RDES0的最高位是所有權位,其他位為狀態(tài)控制位。
與接收描述符相同,發(fā)送描述符同樣以4個32位數存放,其定義與接收描述符一起在初始化MAC時完成,但區(qū)別于接收描述符,為了節(jié)省內存發(fā)送描述符僅定義一個,循環(huán)使用。描述符在程序中的描述方式與寄存器及每位的操作與之前提到的寄存器相同,但在接收描述符中增加了pbuf項,方便存儲,MAC從PHY中接收到數據包后就直接將被發(fā)送至主機。由于使用的芯片為定制芯片,因此需要先對網卡進行測試,在測試正常后再進行LwIP的后續(xù)移植。
網卡驅動的編寫主要有兩個部分包括初始化函數和中斷處理函數。初始化函數MAC_Init首先分別初始化收發(fā)描述符,均使用鏈型結構。其中接收描述符設為一個數組,其中包含兩個描述符,互為首尾,為了節(jié)省內存,發(fā)送描述符只設置一個。在描述符初始化時,需同時設置好數據緩沖區(qū),并將緩沖區(qū)的地址賦值給RDES3,RDES2則指向下一個描述符或置0,其流程如圖3所示。
由于接收與發(fā)送共用一個中斷,因此當中斷產生時需先對其類型進行判斷。CSR5為狀態(tài)寄存器,其中CSR5.7為接收中斷狀態(tài)位表示有一幀數據已被接收,而CSR5.0則為發(fā)送中斷狀態(tài)位代表數據已發(fā)送完成。其流程如圖4所示。
3.2 頭文件移植與數據準備
3.2.1 內部數據類型定義
頭文件cc.h最主要的功能在于它需要根據編譯器和處理器定義協議棧中所需的數據類型。此外,也會完成一些相關的宏及大小端等的定義。通常來說,在C語言的語言體系下,struct會自動4字節(jié)對齊。然而在協議棧中這一做法卻會導致無法讀取對應長度的數據,因此需要增加關鍵詞packed取消對齊[8],這里值得注意的是,在不同編譯器版本下此關鍵詞可能會有變化。此外,還需定義大小端及錯誤代碼,這里根據處理器選擇小端,使用arch.h中LwIP內核自帶的錯誤代碼。
3.2.2 配置文件
LwIP在設計之初就為用戶提供了便捷的配置方案,這個文件位于LwIP的源碼目錄下,即“opt.h”。在“opt.h”中定義了包括buffer大小、數量、TCP窗口大小等一系列關鍵配置數據作為默認選項。當然為方便起見用戶也可根據自身的需求進行更改,因此就有了“l(fā)wipopts.h”文件,在這個文件中定義的數據將會覆蓋“opt.h”中的默認設置,其他位在“l(fā)wipopts.h”中的設置項則會沿用“opt.h”中的配置。由于“opt.h”中的默認設置采取了能使LwIP正常運行的最小值。所以當硬件平臺性能相對較弱時可直接沿用“opt.h”作為配置文件,這也就是選用默認配置的主要原因,但實際上可保留“l(fā)wipopts.h”用做選項開關便于調試。
3.3 LwIP底層移植
3.3.1 網絡接口初始化
low_level_init是LwIP在文件ethernetif.c中給出的第一個函數框架,它主要完成對網卡的初始化定義,此外還根據網卡的特點,對LwIP中的網絡接口管理結構體netif中一些與網卡有關的參數進行定義。其中設置的參數包括網卡MAC地址長度,網卡MAC地址,最大傳輸包大小,廣播、ARP、網絡接口鏈路使能。
同時還在函數中引用Mac_Init對網卡進行初始化,由于加入了LwIP的內存管理內容,因此還需對測試版的Mac_Init函數進行修改。用數組代替的收發(fā)內存替換為動態(tài)申請的數據包pBuf中的payload,這樣在程序開始運行后,首先就為接收數據申請出了兩塊緩沖區(qū)。同時,由于需要對接收到的數據進行一些必要的預處理,還在原有的描述符中增加了Pbuf,即指向緩沖區(qū)的指針。
3.3.2 數據發(fā)送數據
low_level_output函數接收由IP層傳入的數據,并將數據傳入MAC。此時并不需要確認數據長度是否大于64 B,網卡會根據其長度自動調節(jié)。由于需要增加pbuf的引用次數,因此為了防止在計數時發(fā)生中斷導致計數錯誤,需將中斷進行臨時關閉,計數后開啟。low_level_output會將承載有數據的數據緩沖區(qū)指針傳遞給網卡發(fā)送函數Mac_Copyout,并將數據寫入已在初始化時就申請好的描述符中進行發(fā)送。發(fā)送結束時會觸發(fā)發(fā)送中斷,使程序繼續(xù)執(zhí)行。中斷結束后將當前的緩沖區(qū)pbuf釋放,則發(fā)送流程結束。
3.3.3 數據接收
接收線程的起始點由接收中斷開始,由于不能長期占用中斷,當發(fā)現為接收中斷時就會立即跳出中斷進入數據處理函數RX_Processing,其流程如圖5所示。
4 協議棧功能測試
4.1 Ping測試
Ping程序是一個專門測試主機是否可正常通信的測試程序,此程序首先向主機發(fā)送ARP請求,若得到正常響應后再向主機發(fā)送ICMP報文并請求應答,因此Ping命令若能夠得到正常響應,則代表ARP,ICMP及IP協議工作正常。
4.2 Echo協議測試
Echo協議即應答協議,該協議作用于應用層,主要用于對TCP協議進行測試。首先需要在LwIP協議棧初始化后增加Echo的初始化,對TCP進行監(jiān)聽,此后使用telnet命令,測試端口為自定義端口,端口號為2000。通過實驗可得telnet命令的輸出結果,給鍵盤輸入任意字母并顯示,屏幕中將輸出該字母,即TCP正常工作,Echo協議可以正常運行。
4.3 Web測試
該測試板在投入使用后可能需要增加Web瀏覽功能,還需進行Web功能的測試。在此次測試中使用了由LwIP提供的socket接口編寫的HTTP程序進行測試,建立一個Web服務器。在瀏覽器中輸入測試板的IP地址后若能夠正常顯示測試頁面則具備Web瀏覽功能。通過對該測試板進行簡單的網頁瀏覽,表明測試板具備Web瀏覽功能。
4.4 速度及內存占用測試
網絡通信速度達到2.19 MB/s,即17.52 Mb/s符合速度要求。實際上本芯片的MAC核能夠實現百兆網的技術指標,但受限于處理器的響應速度,因此僅能達到2.19 MB/s。
由于測試板內存有限,需對程序進行結構優(yōu)化,刪除部分不常用的如SNMP,DNS,DHCP等功能。同時通過減少如pbuf預留個數等自定義項,以達到減少內存消耗的目的。其量化結果可在當前工程的編譯記錄文件tb.map中獲得。其中P1顯示的數值為程序代碼所占用空間的大小,而P2為程序的內存消耗總值。同時,還可以根據該文件查看各部分內存消耗的大小,以此進行程序的剪裁。
程序的內存消耗情況中標出的部分即為總消耗值約13 KB,小于要求數值。其中消耗內存最多的為memp,這部分的內存消耗主要由數據存儲產生,在程序中pbuf大小及個數的申請留有大量余量,因此在實際工作中可根據數據傳輸量的大小做出相應調整,內存消耗還有很大的減少空間。
5 結 論
通過移植研究TCP/IP協議棧LwIP,將TCP/IP協議棧與嵌入式設備結合起來,使項目組自行開發(fā)的32位定制處理器實現了網絡通信功能,并提出了一種基于無操作系統(tǒng)移植LwIP的方法,為使用自制處理器為內核的硬件平臺提供了技術方案。
參考文獻
[1] 厲魯衛(wèi),包建榮,蔣苗林,等.基于ARM嵌入式Web服務器的研究與設計[J].計算機工程與設計,2004,25(5):757?760.
[2] 張毅,趙國鋒.嵌入式Internet的幾種接入方式比較[J].重慶郵電學院學報(自然科學版),2002,14(4):83?86.
[3] 孔棟,鄭建宏.嵌入式TCP/IP協議棧LwIP在ARM平臺上的移植與應用[J].通信技術,2008,41(6):38?40.
[4] 張旭,高強,張芳.TCP/IP協議棧在嵌入式系統(tǒng)中的移植實現[J].科技資訊,2008(12):93.
[5] 張翠,鄧志良.LwIP協議棧在μC/OS?Ⅱ上的移植和應用[J].微計算機信息,2010,26(8):84?85.
[6] 陳鵬.基于通用架構的一體化紅外圖像信息處理器設計[J].現代電子技術,2016,39(3):39?42.
[7] 蘇勇輝.基于ARM微處理器TCP/IP協議棧LwIP實現[J].國外電子測量技術,2009,28(10):76?78.
[8] 鐘達,郭偉,習勇,等.基于SB3500多核處理器的軟件無線電系統(tǒng)設計[J].現代電子技術,2014,37(21):5?8.