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