ENC28J60在嵌入式系統(tǒng)接口上的設(shè)計與實現(xiàn)
摘要:文章首先介紹了uC/OS-II在ARM上的移植。在此基礎(chǔ)上,根據(jù)以太網(wǎng)控制器ENC28J60的特點,設(shè)計了該系統(tǒng)的硬件結(jié)構(gòu)。闡述了如何在嵌入式實時操作系統(tǒng)μC/OS-II上移植實現(xiàn)LwIP這套TCP/IP協(xié)議棧,并詳細地描述了ENC28J60網(wǎng)卡驅(qū)動的軟件流程,給μC/OS-II加上了網(wǎng)絡(luò)支持。
關(guān)鍵字:嵌入式系統(tǒng)、以太網(wǎng)、ENC28J60、LwIP
【Abstract】The paper introduces the transplantation of uC/OS-II to ARM at first. Basic on this, the hardware frame is designed according to the features of Ethernet Controller ENC28J60. Then it expatiates how to realize the transplantation of LwIP protol stack to the embedded RTOS(Real-Time Operating System) μC / OS-Ⅱ, and describes the software flow of ENC28J60 network card drive in detail, which makes uC/OS-II become a true RTOS with networking utilities.
【Keywords】Embedded System, Ethernet Network, ENC28J60, LwIP
一、引言隨著計算機技術(shù)的發(fā)展,嵌入式系統(tǒng)已成為計算機領(lǐng)域的一個重要組成部分,實時操作系統(tǒng)的應(yīng)用也越來越受到重視。uC/OS-II是專門為嵌入式應(yīng)用設(shè)計的實時操作系統(tǒng)內(nèi)核,它具有以下幾個優(yōu)點:源代碼公開,代碼結(jié)構(gòu)清晰,注釋詳盡,組織有條理,具有良好的可擴展性和可移植性,最多可以管理60個任務(wù)。uC/OS-II采用了基于優(yōu)先級的占先式實時內(nèi)核,它包含了實時內(nèi)核任務(wù)管理、時間管理、任務(wù)間的同步(信號量、郵箱、消息隊列)和內(nèi)存管理等功能。正適合嵌入式操作系統(tǒng)體積小、速度快、可裁減、可移植的特性。
嵌入式系統(tǒng)在網(wǎng)絡(luò)化開發(fā)的過程中,如何解決與網(wǎng)絡(luò)連接,即如何將通用處理器的網(wǎng)絡(luò)連接裝置應(yīng)用于嵌入式網(wǎng)絡(luò)的開發(fā)是十分重要的。目前市面上有許多以太網(wǎng)絡(luò)控制芯片,其中大多功耗高、功能復(fù)雜,不適用于價格低廉的嵌入式系統(tǒng)之中。并且目前市場上的大部分以太網(wǎng)控制器采用的封裝均超過80引腳,而符合IEEE802.3協(xié)議的ENC28J60只有28引腳,就能既提供相應(yīng)的功能,又可以大大簡化相關(guān)的設(shè)計,并減小占板空間,再加上由Microchip免費提供的用于單片機的TCP/IP軟件堆棧,使之成為目前市面上最小的嵌入式應(yīng)用以太網(wǎng)解決方案。
二、uC/OS-II在ARM上的移植ARM是目前嵌入式領(lǐng)域中應(yīng)用最廣泛的RISC微處理器結(jié)構(gòu),以其低成本、低功耗、高性能等優(yōu)點占據(jù)了嵌入式系統(tǒng)應(yīng)用領(lǐng)域的領(lǐng)先地位[1]。uC/OS-II可以簡單地看作是一個多任務(wù)調(diào)度器,在這個任務(wù)調(diào)度器上完善地添加了與多任務(wù)操作系統(tǒng)相關(guān)的一些系統(tǒng)服務(wù),如信號量、郵箱等。其90%的代碼是用C語言寫的,可以直接移植到有C語言編譯器的處理器上。移植工作主要都集中在多任務(wù)切換的實現(xiàn)上,因為這部分代碼用來保存和恢復(fù)CPU現(xiàn)場(即寫/讀相關(guān)寄存器),不能用C語言,只能使用匯編語言完成。uC/OS-II的全部源代碼量大約是6000-7000行,共15個文件[1]。將uC/OS-II移植到ARM處理器上,需要修改三個與ARM體系結(jié)構(gòu)相關(guān)的文件,代碼量大約是500行。以下是這個三個文件的移植工作:
1) OS_CPU. H 的移植
首先進行基本配置和數(shù)據(jù)類型定義,因為不同的編譯器所提供的同一數(shù)據(jù)類型的數(shù)據(jù)長度并不相同。其次用#define 語句定義2 個宏開關(guān)中斷:即
退出臨界區(qū)宏定義: # define OS_EXITCRITICAL ( ) ARMDisable Int ( ) //關(guān)中斷,
進入臨界區(qū)宏定義# define OS_ENTERCRITICAL ( ) ARMEnableInt ( ) //開中斷。
最后根據(jù)堆棧的方向定義OS_STK GROWTH。
2) OS_CPU.C的移植
OS_CPU.C的移植包括任務(wù)堆棧初始化和相應(yīng)函數(shù)的實現(xiàn).在這里共有6個函數(shù)[2]:OSTaskStkInit( ),OSSTaskCreateHook( ),OSTaskDelHook( ),OSTaskSwHook( ),OSTaskStatHook( ),OSTimeTickHook( )。其中后面的5個HOOK函數(shù)又稱為鉤子函數(shù),主要是用來對uC/OS-II進行功能擴展。這些函數(shù)為用戶定義函數(shù),由操作系統(tǒng)調(diào)用相應(yīng)的HOOK函數(shù)去執(zhí)行,在一般情況下,他們都沒有代碼,所以實現(xiàn)為空函數(shù)即可。而函數(shù)OSTaskStkInit( )對堆棧進行初始化,在ARM系統(tǒng)中,任務(wù)堆棧空間由高到低依次為PC,LR,R12,R11,…,R1,R0,CPSR,SP,SR。在進行堆棧初始化以后,OSTaskStkInit( )返回新的堆棧棧頂指針。
3) OS_CPU A. S 的移植
uC/OS-II移植的最后還需要用戶編寫4個重要的匯編函數(shù),包括OSStartHighRdy( )、OSCtxSw( )、OSIntCtxSw( )及OSTickISR( )。分別介紹如下:OSStartHighRdy( )函數(shù)由OSStart( )調(diào)用,用以運行優(yōu)先級最高的就緒任務(wù),其運行過程:調(diào)用用戶定義的OSTaskSwHook( )函數(shù)→獲取任務(wù)堆棧指針→置位全局;OSCtxSw( )函數(shù),實時操作系統(tǒng)內(nèi)任務(wù)級的切換是通過處理器的軟中斷實現(xiàn)的,并且軟中斷服務(wù)例程的向量地址必須指向OSCtxSw( )函數(shù);OSIntCtxSw( )函數(shù)用于實現(xiàn)中斷級任務(wù)切換,并用在最初清理堆棧(調(diào)整堆棧指針的位置);OSTicklSR( )函數(shù)實現(xiàn)任務(wù)切換,并使用內(nèi)核定時器產(chǎn)生時鐘節(jié)拍。
三、主要硬件選型及設(shè)計系統(tǒng)主要采用ENC28J60+LPC2212/LPC2214,其信息終端模塊硬件系統(tǒng)框圖,如圖1所示。
圖1 信息終端模塊硬件系統(tǒng)框圖
圖2 網(wǎng)卡芯片的配置原理圖部分電路圖
硬件由以下幾部分組成:
1) 單片機及其外圍器件:LPC2214、PLL(10KHz晶體等)、LED指示燈;
2) 以太網(wǎng)控制器部分:ENC28J60、耦合變壓器、RJ45插座、25MHz晶體;
3) 電源部分:由一片7805提供5V的直流電壓,SPX1117M3-1.8 提供1.8V的直流電壓 SPX1117M3-3.3提供3.3V的直流電壓。
系統(tǒng)采用LPC2212/LPC2214單片機,LPC2212/LPC2214是一款基于16/32位ARM7TDMI-S,并支持實時仿真和跟蹤的CPU,帶有128/256 k字節(jié)(kB)嵌入的高速Flash存儲器。128位寬度的存儲器接口和獨特的加速結(jié)構(gòu)使32位代碼能夠在最大時鐘速率下運行。對代碼規(guī)模有嚴格控制的應(yīng)用可使用16位Thumb模式將代碼規(guī)模降低超過30%,而性能的損失卻很小。
ENC28J60是Microchip Technology(美國微芯科技公司)近期推出的28引腳獨立以太網(wǎng)控制器,它采用業(yè)界標準的SPI串行接口,具有10 Mbps SPI接口,符合IEEE802.3協(xié)議,內(nèi)置了10 Mbps以太網(wǎng)物理層器件(PHY)及介質(zhì)訪問控制器(MAC),可按以太網(wǎng)協(xié)議可靠地收發(fā)信息包數(shù)據(jù)[3]。另外,它還具有可編程8 KB雙端口SRAM緩沖器,此緩沖存儲器具有靈活可靠的數(shù)據(jù)管理機制,以高效的方式進行信息包的存儲、檢索和修改,以減輕主控單片機的內(nèi)存負荷。該系統(tǒng)用到的網(wǎng)卡芯片配置原理部分電路圖,如上圖2所示。
四、軟件及其程序設(shè)計系統(tǒng)軟件的核心是uC/OS-II 內(nèi)核通過ENC28J60以太網(wǎng)控制器以TCP/IP協(xié)議棧LwIP為協(xié)議和以太網(wǎng)相連接,在該系統(tǒng)中主要完成以下三個方面的設(shè)置與實現(xiàn):
1) TCP/IP協(xié)議棧的精簡與實現(xiàn);2) ENC28J60以太網(wǎng)控制器驅(qū)動程序的實現(xiàn);3) 整個系統(tǒng)的流程圖及實現(xiàn)。該系統(tǒng)的軟件框圖,如圖3所示。
圖3 系統(tǒng)軟件框圖
4.1 TCP/IP協(xié)議棧實現(xiàn)1) LwIP協(xié)議
嵌入式系統(tǒng)uC/OS-II只是一個實時的任務(wù)調(diào)度及通信內(nèi)核,缺少對外圍設(shè)備和接口的支持。以開放源代碼的TCP/IP協(xié)議棧LwIP為原型,對嵌入式TCP/IP協(xié)議進行改造,可使uC/OS-II成為支持網(wǎng)絡(luò)的RTOS。
LwIP協(xié)議棧在設(shè)計時就考慮到了將來的移植問題,它把所有的硬件、OS、編譯器相關(guān)的部分獨立出來,放在一個固定的目錄下[4]。因此LwIP在uC/OS-II 上的實現(xiàn)就是修改這個目錄下的文件,其他的文件一般不必修改。本系統(tǒng)的硬件平臺是ENC28J60+LPC2212/LPC2214。uC/OS-II在LPC2214需要說明的一點是LwIP會為每個網(wǎng)絡(luò)連接動態(tài)分配一些信號量(Semaphone)和消息隊列(Message Queue),當連接斷開時會刪掉這些Semaphone和Queue。
2) 協(xié)議的實現(xiàn)
對嵌入式系統(tǒng)來說不需要實現(xiàn)所有的TCP/IP協(xié)議,本系統(tǒng)主要實現(xiàn)TCP/IP協(xié)議的TCP、UDP、IP、ICMP和 ARP等協(xié)議,主要實現(xiàn)的模塊如圖3中TCP/IP 協(xié)議棧的數(shù)據(jù)流向(虛線框的部分)。
ARP協(xié)議主要完成網(wǎng)絡(luò)地址到物理地址的映射,該協(xié)議是網(wǎng)絡(luò)中實現(xiàn)通信的基礎(chǔ)。嵌入式系統(tǒng)中僅響應(yīng)ARP請求,發(fā)送ARP回答包。ICMP協(xié)議負責傳遞差錯報文以及其它需要注意的信息,且由ICMP首部8位的類型字段和8位的代碼字段決定信息的種類。IP是TCP/IP協(xié)議族中最為核心的協(xié)議。IP協(xié)議主要是校驗 IP 報文頭和實現(xiàn)ICMP、TCP協(xié)議之間多路復(fù)用功能。為測試網(wǎng)絡(luò)的連通情況,實現(xiàn)了ICMP中類型號為0、代碼為0的Ping應(yīng)答協(xié)議。傳輸層采用了面向連接的可靠數(shù)據(jù)傳輸協(xié)議TCP,以確保遠程數(shù)據(jù)可靠性要求。UDP協(xié)議是一種面向無連接的不可靠的協(xié)議。該部分實現(xiàn)對輸入包的處理,判斷其端口號、檢驗和是否正確。正確則將其交給相應(yīng)端口的應(yīng)用程序,不正確則丟棄;對從應(yīng)用程序接收到的輸出包,設(shè)置響應(yīng)的源端口號和目的端口號,再交給IP層發(fā)送。TCP協(xié)議提供可靠的面向連接的數(shù)據(jù)傳輸服務(wù)。
4. 2 ENC28J60的驅(qū)動程序本系統(tǒng)采用ENC28J60以太網(wǎng)控制芯片,需要編寫網(wǎng)絡(luò)設(shè)備驅(qū)動程序,以實現(xiàn)低層網(wǎng)絡(luò)接口及硬件函數(shù)驅(qū)動。本文針對ENC28J60芯片的特點,對該程序做一下預(yù)處理以便進行可靠性設(shè)計和應(yīng)用。
對驅(qū)動程序進行預(yù)處理:
#define MAC_TX_BUFFER_SIZE (600) //定義發(fā)送緩沖區(qū)的大小
#define MAC_TX_BUFFER_COUNT (1) //定義發(fā)送緩沖區(qū)的個數(shù)
#define LPC2200_CS_ENC28J60 0x00000800 //ENC28J60的片選信號P0.8
#define LPC2200_RESET_ENC28J60 0x00000200 //ENC28J60的復(fù)位引腳
此驅(qū)動主要完成ENC28J60網(wǎng)絡(luò)芯片的初始化過程,主要函數(shù)void LpcCtlEncCInit(void),完成在LPC2214控制器中加載ENC28J60網(wǎng)卡芯片的配置信息,并實現(xiàn)ENC28J60的自檢功能。其核心流程圖,如圖4所示。注:在設(shè)置ENC28J60的物理地址時應(yīng)該注意的是ENC28J60的地址順序是倒序的。
4. 3 系統(tǒng)主程序說明圖4 MacInit()程序流程圖
圖5 系統(tǒng)主函數(shù)TaskE( )的流程圖
系統(tǒng)主任務(wù)主要完成申請動態(tài)IP地址,建立與遠端中心的連接,以及數(shù)據(jù)的接收和發(fā)送等。首先對該主程序進行預(yù)處理:
定義SEVER服務(wù)器端和CLIENT客戶端
定義協(xié)議特征字:其中包括uC/OS-II的任務(wù)ID號、uC/OS-II的任務(wù)優(yōu)先級的分配和系統(tǒng)的事件操作指針,如:動態(tài)域名解析用到的信號量*DNSFlag;IP動態(tài)更新時用到的信號量*ConnectFlag,以及網(wǎng)絡(luò)傳輸信息*EthNetMsgFlag等等。
系統(tǒng)工作主流程圖,如上圖5所示。
在這個流程圖中主要調(diào)用的函數(shù)有:ModeSetTask()函數(shù),完成系統(tǒng)通信接口的設(shè)置;EthNetTask()函數(shù),完成主機與終端網(wǎng)口的通信任務(wù);NetSetTask()函數(shù),完成主機與終端串口的通信任務(wù)等。
五、結(jié)束語μC/OS-II是近年來發(fā)展迅速的一個開放源碼實時操作系統(tǒng),但它只是一個實時的任務(wù)調(diào)度及通信內(nèi)核,缺少對外圍設(shè)備和接口的支持,如沒有文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議、圖形界面等。而隨著以太網(wǎng)技術(shù)的深入發(fā)展,將嵌入式系統(tǒng)與網(wǎng)絡(luò)結(jié)合,在嵌入式實時操作系統(tǒng)中引入TCP/IP協(xié)議棧,以支持嵌入式設(shè)備接入網(wǎng)絡(luò),成為嵌入式領(lǐng)域重要的研究方向,且對一些基于網(wǎng)絡(luò)接口的數(shù)據(jù)采集系統(tǒng)與遠程監(jiān)控的任務(wù)系統(tǒng)都將具有廣泛的應(yīng)用前景。
本文作者的主要創(chuàng)新點:
1、 提出了在嵌入式系統(tǒng)中運用以太網(wǎng)控制器ENC28J60的硬件及軟件的設(shè)計思路;
2、 將LwIP協(xié)議棧運用于ENC28J60+LPC2212/LPC2214的硬件平臺上,同時該系統(tǒng)已經(jīng)應(yīng)用在LED顯示等遠程控制中,并取得了良好的效果。
參考文獻
【1】 《ARM嵌入式處理器結(jié)構(gòu)與應(yīng)用基礎(chǔ)》.馬忠梅等編著. 北京航空航天大學(xué)出版社.2002年出版
【2】 朱華均. uC/OS-II 操作系統(tǒng)在ARM處理器上的移植 . 計算機工程, (軟件技術(shù)與數(shù)據(jù)庫)2004.12, 增刊 第30卷 64~124
【3】 祁樹勝 SPI接口以太網(wǎng)控制器ENC28J60及其應(yīng)用, 微計算機信息 (嵌入式與SOC)2006 年第22 卷第8-2 期 266~268
【4】 用TCP/IP進行網(wǎng)際互聯(lián)第一卷:原理、協(xié)議與結(jié)構(gòu)(第四版) [美]科默(Comer,D.E.)著;林瑤,蔣慧等 譯 北京:電子工業(yè)出版社