摘 要: 針對嵌入式設備接入以太網的需求,搭建了基于LPC23/24XX微控制器和DM9161A器件的硬件平臺,在對LPC23/24XX以太網MAC(介質訪問控制層)控制器的特性進行分析的基礎上,開發(fā)和移植LwIP協議棧的網絡接口層和操作系統模擬層,實現了一個低成本嵌入式網絡系統。通過對該系統進行TCP性能測試并在上面實現一個簡單的WEB服務器,表明了該系統效率較高,具有實用價值。
關鍵詞: LPC23/24XX;DM9161A;LwIP;嵌入式網絡技術
0 引言
隨著Internet的廣泛應用和通信技術的飛速發(fā)展,越來越多的應用場合需要將嵌入式設備接入以太網。得益于微電子技術的進步,許多嵌入式控制芯片集成了以太網MAC控制器,NXP公司推出的LPC23/24XX系列微控制器便是其中的代表,該系列微控制器在嵌入式領域使用量大,應用范圍廣。LwIP輕量級TCP/IP協議棧是一套用于嵌入式網絡系統的開放源碼[1],具有較完整的TCP/IP功能,特別適合在資源緊張的微控制器上使用。本文以LPC23/24XX系列微控制器和DM9161A以太網PHY器件為硬件基礎,根據LPC23/24XX以太網MAC控制器的特性來移植LwIP協議棧,實現一個低成本的嵌入式網絡系統。
1 系統硬件設計
LPC23/24XX系列微控制器使用了一個可在72 MHz頻率下運行的ARM7內核,包含1個10/100 Mb/s以太網模塊,該模塊位于獨立的AHB總線上,有16 KB的SRAM和DMA控制器[2]。本文采用該系列中的LPC2378進行實驗。
DM9161A是目前常見的一款低成本物理層收發(fā)器,在以太網PHY層使用,通過介質無關接口MII或簡化介質無關接口RMII連接到以太網MAC層[3]。DM9161A的接線圖如圖1所示。
LPC2378微控制器的以太網模塊通過10個引腳與DM9161A相連,如圖2所示。
2 LPC23/24XX以太網控制器結構與模塊功能描述
LPC23/24XX微控制器的以太網模塊包含一個全功能的10/100 Mb/s以太網MAC控制器,通過配置DMA硬件來提高性能[4]。以太網模塊通過操作控制寄存器組,實現半雙工或全雙工操作、流量控制、接收包過濾以及LAN上喚醒等各種功能,其結構如圖3所示。
MAC控制器通過RMII接口與DM9161A進行連接,RMII接口可以在幾乎不修改代碼的情況下兼容大部分PHY器件。以太網模塊中的DMA管理器利用描述符數組和狀態(tài)數組來工作。描述符和狀態(tài)充當以太網硬件和驅動程序之間的接口,描述符用來設置對應緩沖區(qū)的首地址和控制信息,狀態(tài)符存儲著對應收發(fā)數據最新的狀態(tài)信息。描述符數組和狀態(tài)數組在邏輯上是一個環(huán)形隊列結構,在接收和發(fā)送數據的過程中,它們會有3種不同的狀態(tài):空狀態(tài)、部分滿狀態(tài)和滿狀態(tài),如圖4所示。
對描述符數組的操作采用生產者/消費者模式,在接收過程中,以太網MAC控制器是生產者,RxProduceIndex寄存器為數組索引;驅動程序是消費者,RxConsumeIndex寄存器為數組索引。在發(fā)送過程中,驅動程序是生產者,TxProduceIndex寄存器為數組索引;MAC控制器是消費者,TxConsumeIndex寄存器為數組索引。描述符還有一個擁有者的屬性,只有描述符的擁有者才能對它的值進行讀寫。驅動程序通過將TxProduceIndex/RxConsumeIndex寄存器加1,能夠將描述符和狀態(tài)的擁有權移交給MAC控制器。MAC控制器通過更新TxProduceIndex/RxConsumeIndex寄存器將描述符和狀態(tài)的擁有權移交給驅動程序。
3 LwIP協議棧的移植
LwIP協議棧的移植工作分兩個部分,分別是網絡接口層的實現和操作系統模擬層的移植。
3.1 網絡接口層的實現
LwIP源碼給出了網絡接口驅動程序的整體框架,用戶需要自己完成的函數主要有3個[5],分別是:
?、啪W絡接口初始化函數low_level_init()。該函數用來對網絡接口進行初始化,任何與初始化網絡接口有關的操作都可以在該函數內實現。如對網絡接口有關參數進行配置、完成網絡芯片硬件上所需的初始化操作等。
?、凭W絡接口輸入函數low_level_input()。該函數為到達的數據包分配pbuf,并將數據包從網絡接口轉移到pbuf鏈中。
?、蔷W絡接口輸出函數low_level_output()。該函數實現真正的數據包發(fā)送過程。當需要發(fā)送數據包時,數據包裝載在事先已分配好的pbuf中,由該函數負責將數據包發(fā)送至指定的網絡接口中。
這3個函數的實現都與網絡接口的硬件特性密切相關,其實就是相當于為以太網MAC控制器編寫驅動程序。初始化函數low_level_init()對應的是控制器的初始化配置過程,輸入函數low_level_input()對應的是控制器的數據接收過程,輸出函數low_level_output()對應的是控制器的數據發(fā)送過程。下面只詳細討論以太網MAC控制器的初始化和數據接收過程,而數據發(fā)送過程與接收過程的實現相似,本文不進行詳述。
3.1.1 初始化過程
驅動程序在初始化過程需要為DMA管理器分配描述符數組和狀態(tài)數組。發(fā)送和接收功能都有各自的描述符和狀態(tài)數組,這些數組的基址存放在TxDescriptor/TxStatus和RxDescriptor/RxStatus寄存器中。而描述符數組中描述符的數目需使用減1編碼寫入到TxDescriptorNumber/RxDescriptorNumber寄存器中,狀態(tài)與描述符的數目相同。在初始化數組之后,需要為描述符分配幀緩沖區(qū),描述符的Packet字段使用對應緩沖區(qū)的基址來填充,而其Size字段需要填入緩沖區(qū)的大小。緩沖區(qū)的大小根據具體情況而定,范圍在1 B ~ 2 KB之間,緩沖區(qū)太小緩沖效果不明顯,影響網絡性能,太大則會占用太多的控制器存儲空間。
3.1.2 接收過程
以圖5為例,在初始化之后,這個例子中的描述符和狀態(tài)數組長度為4,描述符數組的基址為0x7FE010EC,狀態(tài)數組的基址為0x7FE011F8,每個描述符分配到的幀緩沖區(qū)大小為8 B。
假設幀數據共有19 B,因為幀緩沖區(qū)大小為8 B,因此幀數據將存儲在3個緩沖區(qū)中。在將最初的8 B幀數據寫入1號緩沖區(qū)之后,接收DMA管理器將繼續(xù)填充2號緩沖區(qū)。因為幀數據還沒結束,1號緩沖區(qū)的狀態(tài)中的LastFrag位應為0,RxSize字段應為7(8個字節(jié),采用減1編碼)。2號緩沖區(qū)的操作與1號緩沖區(qū)相同。在將最后3 B幀數據寫入3號緩沖區(qū)之后,幀數據到達末尾,3號緩沖區(qū)狀態(tài)應為:LastFrag=1,RxSize=2。
依據前面提到的生產者/消費者操作模式,在上述例子中,當驅動程序沒有將RxConsumeIndex加1時,接收DMA管理器不能讀取新的描述符,因為描述符數組處于滿狀態(tài)。只有在驅動程序將接收數據傳送給了LwIP主線程并且對RxConsumeIndex進行更新之后,DMA管理器才能繼續(xù)讀取描述符并接收數據。接收完一幀數據后,驅動程序將把3個緩沖區(qū)中的信息組成的完整幀數據封裝為pbuf的形式,提交給協議棧內核進行處理。
3.2 操作系統模擬層的移植
為了提高可移植性,LwIP協議棧源碼并不實現操作系統中的具體操作,而是定義了協議棧與操作系統之間的接口函數,稱之為操作系統模擬層。本文使用μC/OS-II開源實時操作系統來實現操作系統模擬層。
操作系統模擬層主要實現以下4大功能:
?、胚M程同步。此功能提供了多個進程之間的同步操作,可以使用信號量來實現這個功能。其結構和函數接口如表1所示。
⑵消息傳遞。提供了進程之間傳遞數據的功能,具體可以使用郵箱方法來傳遞。其結構和函數接口如表2所示。
?、嵌〞r與超時處理。LwIP在初始化時會為協議棧進程注冊多個定時與超時處理函數,當定時與超時事件發(fā)生時便會調用相應的函數進行處理,操作系統模擬層提供的接口函數能返回這些定時與超時事件的所在位置。其函數接口如表3所示。
?、冗M程管理。對LwIP協議棧的進程進行管理和維護,主要指創(chuàng)建進程。具體結構和函數接口如表4所示。
μC/OS-II操作系統中包含了關于郵箱、信號量和隊列機制的操作函數,在這些函數的基礎上進行簡單的封裝和修改,可以實現LwIP系統模擬層中郵箱與信號量的操作[6]。但需要注意的是LwIP和μC/OS-II對郵箱機制的實現不一樣。在LwIP中,為了提高協議棧通信的效率,要求郵箱中能夠存放多條消息,而μC/OS-II中的郵箱最多只能傳遞一條消息。所以這里采用μC/OS-II提供的隊列操作函數,因為隊列中可以存放多條消息。
接下來要實現的是與等待超時相關的函數。協議棧的穩(wěn)定運行需要設定多種內部定時器,如TCP定時器、ARP定時器等。
最后,初始化協議棧時,系統要為內核創(chuàng)建一個主進程,這里可以對μC/OS-II的任務創(chuàng)建函數OSTaskCreate做簡單的封裝,便可以得到所需要的進程創(chuàng)建函數。
3.3 TCP性能測試
移植工作完成后,為了測試TCP的性能,在系統上建立了一個簡單的TCP回顯服務器,接著利用網絡性能測試工具Jperf進行TCP帶寬測試,測試結果如圖6所示??梢钥闯鰩挿€(wěn)定在3 342 kb/s左右。
4 嵌入式WEB服務器的實現
為了驗證系統的實用性,這里實現了一個簡單的嵌入式WEB服務器,該WEB服務器可以響應來自瀏覽器的HTTP GET請求,并在發(fā)送請求的瀏覽器上顯示請求頁面。在PC上的瀏覽器中輸入服務器的IP地址,測試結果如圖7所示,表明該系統運行良好,具有實用價值。
5 結論
本文介紹了一種采用集成以太網MAC的微控制器和外接PHY器件,實現嵌入式以太網接口的方案,并在上面完成了LwIP協議棧的移植與應用。本方案采用了較新的電子器件和計算機技術,具有高效率、兼容多種PHY器件、低成本與易于實現等優(yōu)點,適合中低檔的嵌入式設備接入以太網的應用領域。
參考文獻
[1] 肖樂,李兵,邱雅.一種高速嵌入式遠程監(jiān)控系統的研究與實現[J].微型機與應用,2010, 29(5):55-57.
[2] LPC23XX User manual(Rev. 4.1)[EB/OL].[2012-9-05] http://www.nxp.com/documents.
[3] 張東,胡榮貴,徐海. ARM7芯片W90N740以太網接口設計及驅動開發(fā)[J].微型機與應用,2010,29(10):18-21.
[4] 扶文樹,何軍,陳國勝,等.LPC23xx的自適應以太網通信接口設計[J].單片機與嵌入式系統應用,2008(6):72-74.
[5] 朱升林.嵌入式網絡那些事:LwIP協議深度剖析與實戰(zhàn)演練[M].北京:水利電力出版社,2012.
[6] JLabrosse J.嵌入式實時操作系統μC/OS-II[M].邵貝貝,譯.北京:北京航空航天大學出版社,2003.