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