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