黃 翌,陳麗娟
(1.中國電子科技集團(tuán)第三十八研究所 孔徑陣列與空間探測安徽省重點(diǎn)實(shí)驗(yàn)室,安徽 合肥 230088;2.合肥工業(yè)大學(xué) 儀器科學(xué)與光電工程學(xué)院,安徽 合肥 230009)
?
基于ENC28J60的Nios Ⅱ網(wǎng)絡(luò)驅(qū)動程序開發(fā)
黃翌1,陳麗娟2
(1.中國電子科技集團(tuán)第三十八研究所 孔徑陣列與空間探測安徽省重點(diǎn)實(shí)驗(yàn)室,安徽 合肥230088;2.合肥工業(yè)大學(xué) 儀器科學(xué)與光電工程學(xué)院,安徽 合肥230009)
摘要:文章介紹了以ENC28J60作為網(wǎng)絡(luò)設(shè)備的嵌入式系統(tǒng)以太網(wǎng)通信功能的實(shí)現(xiàn)方法,研究了ENC28J60硬件的初始化、數(shù)據(jù)包收發(fā)的軟件編程算法,分析了LwIP 的網(wǎng)絡(luò)接口驅(qū)動層設(shè)計(jì),介紹了如何在LwIP下開發(fā)網(wǎng)絡(luò)驅(qū)動程序完成LwIP協(xié)議棧在ENC28J60芯片上的移植,并對系統(tǒng)的通信性能進(jìn)行了驗(yàn)證。
關(guān)鍵詞:Nios Ⅱ軟核;LwIP協(xié)議棧;ENC28J60硬件;驅(qū)動程序
嵌入式IP軟核進(jìn)行SOPC設(shè)計(jì)的方法因?yàn)榈统杀?、可剪裁、可重?gòu)等特性得到越來越廣泛的應(yīng)用。Altera公司的Nios Ⅱ軟核是一種采用流水線技術(shù)、單指令流的RISC處理器,可以通過開放的Avalon總線與其他采用VHDL語言描述的硬件接口模塊組成嵌入式硬件系統(tǒng)[1]。它具有靈活、可裁減、低成本、高性能等特點(diǎn),因此有很強(qiáng)的競爭力。自從2000年問世以來,Nios Ⅱ已廣泛地應(yīng)用于通信、工業(yè)控制、計(jì)算機(jī)相關(guān)產(chǎn)品和消費(fèi)類電子領(lǐng)域等[2]。
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,越來越多的工業(yè)測試設(shè)備將以太網(wǎng)接入功能作為默認(rèn)配置來實(shí)現(xiàn)設(shè)備的遠(yuǎn)程監(jiān)控和信息分布式處理,而此前選擇的以太網(wǎng)控制器都是專為個人計(jì)算機(jī)系統(tǒng)設(shè)計(jì)的,結(jié)構(gòu)復(fù)雜、占用空間大且較昂貴[3]。本文使用的以太網(wǎng)控制器芯片ENC28J60是微芯公司專為嵌入式系統(tǒng)開發(fā)的小型以太網(wǎng)控制器,采用標(biāo)準(zhǔn)的SPI串行接口,外圍元件配置簡單,完全兼容IEEE 802.3協(xié)議,內(nèi)部集成MAC和10 BASE-T PHY,支持全雙工和半雙工模式[4]。芯片內(nèi)的雙端口RAM可以自由配置,內(nèi)嵌可編程數(shù)據(jù)包過濾器,支持單播(unicast)、組播(multicast)、廣播(broadcast)和可編程模式匹配信息包,以減輕控制器芯片的處理負(fù)荷。本文主要介紹如何在Nios Ⅱ下基于LwIP協(xié)議棧開發(fā)ENC28J60網(wǎng)絡(luò)驅(qū)動程序。
1軟件系統(tǒng)
系統(tǒng)軟件平臺采用μC/OS-Ⅱ嵌入式操作系統(tǒng),使用LwIP網(wǎng)絡(luò)協(xié)議棧。
針對所使用的ENC28J60芯片,設(shè)計(jì)其在LwIP下的驅(qū)動程序。在此基礎(chǔ)上開發(fā)的應(yīng)用程序工作系統(tǒng)模型如圖1所示。
圖1 程序系統(tǒng)模型
μC/OS-Ⅱ開源實(shí)時操作系統(tǒng)是專門為計(jì)算機(jī)的嵌入式應(yīng)用設(shè)計(jì)的,絕大部分代碼用C語言編寫,便于移植到任何一種CPU上。μC/OS-Ⅱ?qū)崿F(xiàn)了一個基于優(yōu)先級調(diào)度的搶占式的實(shí)時內(nèi)核,并在這個內(nèi)核之上提供最基本的系統(tǒng)服務(wù),如信號量、郵箱、消息隊(duì)列、內(nèi)存管理、中斷管理等,具有執(zhí)行效率高、占用空間小、實(shí)時性能優(yōu)良和可擴(kuò)展性強(qiáng)等特點(diǎn)[5]。
LwIP是lightweight(輕量級)IP協(xié)議棧,提供了一套小型化的TCP/IP傳輸控制協(xié)議,可以在提供完整的TCP/IP功能的同時減少系統(tǒng)資源的使用[6]。
LwIP是專為存儲器容量較小的嵌入式系統(tǒng)設(shè)計(jì)的,適用于Nios Ⅱ處理器系統(tǒng)。LwIP使用操作系統(tǒng)提供了一些高級管理功能,如信號量管理、消息隊(duì)列管理、創(chuàng)建線程等。如果使用的操作系統(tǒng)不同,則必須針對不同的操作系統(tǒng)進(jìn)行移植。LwIP分為幾個層次,如圖2所示。
圖2中網(wǎng)絡(luò)接口驅(qū)動層用來為LwIP提供網(wǎng)絡(luò)接口芯片的驅(qū)動程序。針對不同的網(wǎng)絡(luò)接口芯片開發(fā)設(shè)計(jì)不同的驅(qū)動程序,則可使LwIP操作不同的網(wǎng)絡(luò)接口芯片。本系統(tǒng)采用ENC28J60芯片,需要設(shè)計(jì)其驅(qū)動程序,并提供與LwIP的調(diào)用接口。
圖2 LwIP軟件層次
1.1網(wǎng)絡(luò)設(shè)備驅(qū)動的體系結(jié)構(gòu)
LwIP協(xié)議棧的網(wǎng)絡(luò)設(shè)備驅(qū)動程序的體系結(jié)構(gòu)如圖3所示,其源代碼中提供了網(wǎng)絡(luò)設(shè)備接口及以上層次的代碼,開發(fā)網(wǎng)絡(luò)設(shè)備驅(qū)動程序的主要工作就是完成設(shè)備驅(qū)動功能層的相應(yīng)代碼。LwIP中所有的網(wǎng)絡(luò)設(shè)備都抽象為一個統(tǒng)一的接口,即網(wǎng)絡(luò)設(shè)備接口struct netif,操作系統(tǒng)通過網(wǎng)絡(luò)設(shè)備接口鏈表對所有網(wǎng)絡(luò)設(shè)備進(jìn)行管理[7]。
網(wǎng)絡(luò)設(shè)備驅(qū)動程序需要根據(jù)具體的硬件特性操控內(nèi)部的功能寄存器,實(shí)例化相應(yīng)的網(wǎng)絡(luò)設(shè)備接口,實(shí)現(xiàn)其中的收發(fā)數(shù)據(jù)包函數(shù)及中斷處理程序,將具體的收發(fā)數(shù)據(jù)包函數(shù)賦予網(wǎng)絡(luò)設(shè)備接口結(jié)構(gòu)體中的函數(shù)指針,最后將此結(jié)構(gòu)體加入網(wǎng)絡(luò)設(shè)備鏈表完成網(wǎng)絡(luò)設(shè)備驅(qū)動程序的開發(fā)[8]。
圖3 網(wǎng)絡(luò)設(shè)備驅(qū)動的體系結(jié)構(gòu)
1.2ENC28J60網(wǎng)絡(luò)接口數(shù)據(jù)結(jié)構(gòu)
struct netif結(jié)構(gòu)體是整個網(wǎng)絡(luò)驅(qū)動結(jié)構(gòu)的核心,如圖4所示。
圖4中定義了很多供網(wǎng)絡(luò)協(xié)議接口層調(diào)用設(shè)備的標(biāo)準(zhǔn)方法[9]。
(1)全局信息及底層硬件信息。*next為指向全局鏈表下一個設(shè)備的指針;ip_addr為網(wǎng)絡(luò)設(shè)備IP地址;netmask為網(wǎng)絡(luò)設(shè)備子網(wǎng)掩碼;gw為網(wǎng)絡(luò)設(shè)備網(wǎng)關(guān)地址;state為指向網(wǎng)絡(luò)設(shè)備驅(qū)動的特定狀態(tài);hwaddr_len為網(wǎng)絡(luò)設(shè)備物理地址長度,即MAC地址長度,值為6;hwaddr為網(wǎng)絡(luò)設(shè)備物理地址,即MAC地址;mtu為最大傳輸單元,以太網(wǎng)中值為1500;flags為網(wǎng)絡(luò)設(shè)備狀態(tài)信息標(biāo)志位;link_type為網(wǎng)絡(luò)設(shè)備連接類型;name為網(wǎng)絡(luò)設(shè)備名稱,用于標(biāo)識設(shè)備驅(qū)動的種類;num為用來區(qū)分相同類別的不同網(wǎng)絡(luò)接口。
(2)數(shù)據(jù)包處理函數(shù)。*input為指向數(shù)據(jù)包接收函數(shù),用于將網(wǎng)絡(luò)設(shè)備接收到的數(shù)據(jù)包提交給IP層;*output為指向數(shù)據(jù)包發(fā)送函數(shù),用于IP層將數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)接口上;*linkoutput為指向鏈路連接函數(shù),由ARP調(diào)用,用于進(jìn)行IP地址解析。
圖4 網(wǎng)絡(luò)接口數(shù)據(jù)結(jié)構(gòu)
1.3網(wǎng)絡(luò)驅(qū)動程序?qū)崿F(xiàn)原理
(1)網(wǎng)絡(luò)設(shè)備初始化。首先對netif網(wǎng)絡(luò)接口數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化,設(shè)定物理地址、IP地址,對函數(shù)指針賦值,將其加入網(wǎng)絡(luò)設(shè)備鏈表;然后在操作系統(tǒng)中增加數(shù)據(jù)包傳輸?shù)男盘柫亢虯RP(Address Resolution Protocol)地址解析協(xié)議信號量,防止網(wǎng)絡(luò)硬件資源的重復(fù)占用造成資源互鎖;最后完成網(wǎng)絡(luò)設(shè)備的硬件初始化,申請接收和發(fā)送緩沖區(qū),設(shè)置單播、組播和廣播寄存器,設(shè)置中斷并使能等功能。
根據(jù)SOPC軟件系統(tǒng)的框架要求,驅(qū)動程序需要實(shí)現(xiàn)2個專用的宏定義ALTERA-ENC28J60-INSTANCE(name,dev)和ALTERA-ENC28J60-INIT(name,dev)來調(diào)用網(wǎng)絡(luò)設(shè)備初始化。
(2)網(wǎng)絡(luò)數(shù)據(jù)包接收和中斷處理。中斷觸發(fā)后,將判斷是否有傳輸錯誤。如果有傳輸錯誤,對網(wǎng)絡(luò)設(shè)備相應(yīng)傳輸功能進(jìn)行復(fù)位初始化;如果收到了有效數(shù)據(jù)包,將數(shù)據(jù)存入接收緩沖區(qū),給操作系統(tǒng)發(fā)送數(shù)據(jù)包傳輸信號量并退出中斷。
操作系統(tǒng)收到信號量后,將調(diào)用* input指向的數(shù)據(jù)包接收函數(shù),通過對網(wǎng)絡(luò)層和傳輸層的解析,最后提交到應(yīng)用層進(jìn)行用戶處理。
(3)網(wǎng)絡(luò)數(shù)據(jù)包發(fā)送和ARP數(shù)據(jù)解析。網(wǎng)絡(luò)連接后,驅(qū)動程序自動觸發(fā)ARP解析,調(diào)用鏈路連接函數(shù)。鏈路連接函數(shù)在使用網(wǎng)絡(luò)設(shè)備資源前需要判斷ARP信號量是否釋放防止資源互鎖,然后調(diào)用LwIP網(wǎng)絡(luò)協(xié)議棧內(nèi)部函數(shù)etharp-output進(jìn)行地址解析,最后釋放ARP信號量。
網(wǎng)絡(luò)數(shù)據(jù)包的發(fā)送需要應(yīng)用層程序調(diào)用*output指向的數(shù)據(jù)包發(fā)送函數(shù),等待可用的數(shù)據(jù)包傳輸信號量,將待發(fā)送數(shù)據(jù)存入網(wǎng)絡(luò)設(shè)備內(nèi)部的發(fā)送緩沖區(qū),網(wǎng)絡(luò)設(shè)備將自動發(fā)送網(wǎng)絡(luò)數(shù)據(jù),函數(shù)最后釋放數(shù)據(jù)包傳輸信號量。
(4)ENC28J60網(wǎng)絡(luò)驅(qū)動程序的結(jié)構(gòu)。按照LwIP協(xié)議棧對驅(qū)動程序的要求,需要實(shí)現(xiàn)網(wǎng)絡(luò)設(shè)備硬件初始化函數(shù)enc28j60-init、網(wǎng)絡(luò)數(shù)據(jù)輸入處理函數(shù)enc28j60-input、網(wǎng)絡(luò)數(shù)據(jù)輸出處理函數(shù)enc28j60-output和網(wǎng)絡(luò)數(shù)據(jù)中斷處理函數(shù)enc28j60-isr,各函數(shù)的處理流程如圖5所示。
圖5 函數(shù)處理流程圖
2測試
將驅(qū)動程序加入測試應(yīng)用程序后,編譯下載到硬件電路中,完成主控計(jì)算機(jī)與硬件電路的網(wǎng)絡(luò)信息互傳。使用Ping命令進(jìn)行測試,利用網(wǎng)絡(luò)抓包軟件對數(shù)據(jù)包進(jìn)行分析,如圖6所示,Ping命令產(chǎn)生的網(wǎng)際控制報(bào)文協(xié)議(Internet Control Message Protocol,ICMP)包進(jìn)行網(wǎng)絡(luò)交互,數(shù)據(jù)包響應(yīng)完整,TTL(time to live)小于2 ms。
在主控計(jì)算機(jī)端使用sniffer軟件向硬件電路發(fā)送數(shù)據(jù)包進(jìn)行硬件電路接收數(shù)據(jù)處理測試,得到的測試結(jié)果見表1所列。
圖6 Ping命令產(chǎn)生的ICMP報(bào)文
數(shù)據(jù)包長度/Byte發(fā)送速率/(包·s-1)發(fā)送數(shù)據(jù)量/(104包)接收數(shù)據(jù)量/包收包率/%100100110001005001001100010010001001676367.63
通過表1的測試結(jié)果可以看出,當(dāng)有大數(shù)據(jù)包(數(shù)據(jù)包長度為1 000 Byte)頻繁到達(dá)時,硬件電路無法及時處理數(shù)據(jù),使接收報(bào)文成功率下降,并導(dǎo)致操作系統(tǒng)無法響應(yīng)其他任務(wù)。由于大數(shù)據(jù)包不斷到達(dá)網(wǎng)絡(luò)設(shè)備,觸發(fā)中斷,操作系統(tǒng)被網(wǎng)絡(luò)任務(wù)占用,無法執(zhí)行其他任務(wù)的現(xiàn)象稱為網(wǎng)絡(luò)堵塞。當(dāng)取消主控計(jì)算機(jī)的發(fā)送任務(wù)后,驅(qū)動程序中的出錯處理可以使網(wǎng)絡(luò)設(shè)備自行恢復(fù)正常通訊??紤]到在多數(shù)嵌入式系統(tǒng)應(yīng)用中網(wǎng)絡(luò)作為控制及信息傳輸工具,不需要頻繁地處理大數(shù)據(jù),通過在驅(qū)動程序初始化網(wǎng)絡(luò)設(shè)備時限制數(shù)據(jù)包的長度,增加大數(shù)據(jù)丟包處理機(jī)制,并調(diào)高關(guān)鍵任務(wù)的優(yōu)先級,可以解決多任務(wù)處理時無法及時響應(yīng)大數(shù)據(jù)包而造成網(wǎng)絡(luò)堵塞的“假死機(jī)”現(xiàn)象。
3結(jié)束語
本文分析了如何基于Nios Ⅱ軟核在μC/OS-Ⅱ操作系統(tǒng)和LwIP協(xié)議棧上開發(fā)ENC28J60網(wǎng)絡(luò)設(shè)備驅(qū)動程序,詳細(xì)討論了基于Nios Ⅱ框架μC/OS-Ⅱ?qū)崟r操作系統(tǒng)中需要實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)、指針函數(shù)和宏定義;并重點(diǎn)介紹了網(wǎng)絡(luò)設(shè)備的硬
件初始化和網(wǎng)絡(luò)數(shù)據(jù)包的接收和發(fā)送處理;最后通過硬件設(shè)備和測試應(yīng)用程序?qū)W(wǎng)絡(luò)性能進(jìn)行了評估。測試結(jié)果表明,在不存在大數(shù)據(jù)量接收和發(fā)送事件的應(yīng)用場合,網(wǎng)絡(luò)設(shè)備響應(yīng)快。本系統(tǒng)已經(jīng)成功應(yīng)用于分布式儀表監(jiān)控測量系統(tǒng)中,使用方便、運(yùn)行穩(wěn)定,具有一定的實(shí)用價值。
[參考文獻(xiàn)]
[1]田青峰,盧泳兵,劉志鵬.NIOS在網(wǎng)絡(luò)通信系統(tǒng)中的應(yīng)用[J].無線電工程,2013,43(5):10-12.
[2]王仁波,魏雄.基于Nios Ⅱ軟核嵌入式系統(tǒng)的以太網(wǎng)接口設(shè)計(jì)[J].東華理工學(xué)院學(xué)報(bào):自然科學(xué)版,2007,30(1):73-77.
[3]鮑軍民.基于ENC28J60控制器的智能儀表以太網(wǎng)接口設(shè)計(jì)[J].電子元器件應(yīng)用,2007,9(11):1-5.
[4]李陽,吳成富,鄧紅德.基于DSP和ENC28J60的多串口與以太網(wǎng)數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)[J].測控技術(shù),2011,30(12):61-65.
[5]胡玨.基于μC/OS-Ⅱ的實(shí)時多任務(wù)應(yīng)用研究[J].計(jì)算技術(shù)與自動化,2008,27(1):115-119.
[6]時建雷,肖鐵軍.面向LwIP的NIOSII網(wǎng)絡(luò)驅(qū)動程序開發(fā)[J].微計(jì)算機(jī)信息,2008,24(5):36-38.
[7]喬從連.Nios Ⅱ網(wǎng)絡(luò)設(shè)備加載及UDP通訊應(yīng)用[J].微計(jì)算機(jī)信息,2009,25(12-2):84-86.
[8]羅維,李君懿.基于BF533的Linux網(wǎng)絡(luò)驅(qū)動程序的開發(fā)[J].電子設(shè)計(jì)工程,2009,17(5):33-35.
[9]王建平,周辰飛,朱程輝,等.一種ZigBee-TCP/IP無縫網(wǎng)關(guān)模型[J].合肥工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2013,36(9):1058-1062.
(責(zé)任編輯胡亞敏)
Development of Nios Ⅱ network driver based on ENC28J60
HUANG Yi1,CHEN Li-juan2
(1.Key Laboratory of Aperture Array and Space Application,No.38 Research Institute of China Electronics Technology Group Corporation,Hefei 230088,China;2.School of Instrument Science and Opto-electronic Engineering,Hefei University of Technology,Hefei 230009,China)
Abstract:In this paper,a method of realizing embedded system network communication with ENC28J60 as network device is presented.The ENC28J60’s hardware initialization and the arithmetic of how to receive and transmit the data packet are studied.Then the design of LwIP’s network interface driver layer is analyzed,and the ENC28J60’s driver is developed based on LwIP to achieve the transplant of LwIP.Finally,the communication performance of the system is tested.
Key words:Nios Ⅱ soft-core;LwIP protocol stack;ENC28J60 hardware;driver
收稿日期:2015-06-30;修回日期:2016-02-11
基金項(xiàng)目:國家國際科技合作專項(xiàng)資助項(xiàng)目(2011DFA12430);安徽省重大科學(xué)儀器專項(xiàng)資助項(xiàng)目(1310115190)
作者簡介:黃翌(1978-),男,安徽合肥人,中國電子科技集團(tuán)第三十八研究所高級工程師.
doi:10.3969/j.issn.1003-5060.2016.04.006
中圖分類號:TP393.1
文獻(xiàn)標(biāo)識碼:A
文章編號:1003-5060(2016)04-0462-05