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