《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于μC/OS-Ⅱ的嵌入式以太網(wǎng)通信的設計與實現(xiàn)
基于μC/OS-Ⅱ的嵌入式以太網(wǎng)通信的設計與實現(xiàn)
中電網(wǎng)
摘要: uC/OS-Ⅱ提供的僅僅只是一個實時的調(diào)度及任務間通信的內(nèi)核,沒有集成網(wǎng)絡協(xié)議,。上網(wǎng)是當前嵌入式設備的廣泛需求,,本文討論輕型TCP/IP協(xié)議棧的引入以及相關網(wǎng)絡設備驅(qū)動程序,實現(xiàn)嵌入式系統(tǒng)的網(wǎng)絡功能,。
Abstract:
Key words :

 

uC/OS-Ⅱ是一個源碼開放的搶占式實時操作系統(tǒng),。它內(nèi)核短小精悍、可裁減,、執(zhí)行時間確定,。系統(tǒng)大部分代碼采用C語言編寫,與硬件有關的部分都集中在兩個文件中,,給出了規(guī)范的接口說明,,移植相當方便,可應用于目前大多數(shù)型號的8位,、16位,、32位CPU。

uC/OS-Ⅱ提供的僅僅只是一個實時的調(diào)度及任務間通信的內(nèi)核,,沒有集成網(wǎng)絡協(xié)議,。上網(wǎng)是當前嵌入式設備的廣泛需求,本文討論輕型TCP/IP協(xié)議棧的引入以及相關網(wǎng)絡設備驅(qū)動程序,,實現(xiàn)嵌入式系統(tǒng)的網(wǎng)絡功能,。

本文所用的硬件系統(tǒng)結(jié)構如圖1所示。開發(fā)板基于TMS320LF2407A的含DSP核微處理器和LAN91C111以太網(wǎng)控制器,。在成功移植了μCOS-Ⅱ的基礎上進一步實現(xiàn)了以太網(wǎng)通訊功能,。下面重點介紹TCP/IP協(xié)議棧的引入和LAN91C111驅(qū)動的編寫。

 

<a class=嵌入式以太網(wǎng)硬件系統(tǒng)結(jié)構圖" border="0" height="225" hspace="0" src="http://files.chinaaet.com/images/2013/03/08/290c87db-f9ca-4bce-a705-2fd1fa788757.jpg" style="FILTER: ; WIDTH: 450px; HEIGHT: 225px" width="450" />

 

圖1 嵌入式以太網(wǎng)硬件系統(tǒng)結(jié)構圖

TCP/IP網(wǎng)絡協(xié)議棧的引入

在μCOS-Ⅱ上引入下TCP/IP協(xié)議棧,,由于嵌入式系統(tǒng)的硬件資源有限,,必須使用小型協(xié)議棧。這種協(xié)議棧很多,,LwIP是其中之一,。

關于LwIP簡介

LwIP是瑞士計算機科學院(SCICS)的Adam Dunkels等開發(fā)的一套用于嵌入式系統(tǒng)的開放源碼的輕型TCP/IP協(xié)議棧,但Lwip實現(xiàn)了較為完備的IP,ICMP, UDP, TCP協(xié)議,,具有超時時間估計,、快速恢復和重發(fā)、窗口調(diào)整等功能,。IwIP在保持協(xié)議主要功能的基礎上減少對RAM和ROM的占用,,一般它只需要幾十K的RAM和40K左右的ROM就可以運行,很適合同μCOS-Ⅱ相配合用在嵌入式系統(tǒng)中。LwIP在設計時就考慮到了將來的移植問題,,它把所有與硬件,、操作系統(tǒng)、編譯器相關的部分獨立出來,,放在/src/arch目錄下,,因此LwIP在μCOS-Ⅱ上的實現(xiàn)就是修改這個目錄下的文件,其它的文件一般不需要修改,。下面分別予以說明:

協(xié)議棧的實現(xiàn)

·與CPU及編譯器相關的include文件 /src/arch/include/arch目錄下cc.h,、cpu.h、perf.h中有一些與CPU或編譯器相關的定義,,如數(shù)據(jù)長度,,字的高低位順序等。這應該與用戶實現(xiàn)μCOS-Ⅱ時定義的數(shù)據(jù)長度等參數(shù)一致,。

·與操作系統(tǒng)相關部分 sys_arch.c中的內(nèi)容是與操作系統(tǒng)相關的一些結(jié)構和函數(shù),,主要分四個部分: (1)sys_sem_t信號量LwIP中需用信號量通信,所以在sys_arch中應實現(xiàn)信號量結(jié)構體和處理函數(shù):struct sys_sem_t{ sys_sem_new( )/創(chuàng)建一個信號量結(jié)構 sys_sem_free()/釋放一個信號量結(jié)構sys_sem_signal( )/發(fā)送信號量 sys_arch_sem_wait( )/請求信號量}由于μCOS-Ⅱ已經(jīng)實現(xiàn)了信號量OS_EVENT的各種操作,,并且功能和LwlP上面幾個函數(shù)的目的功能是完全一樣的,所以只要把μCOS-Ⅱ的函數(shù)重新包裝成上面的函數(shù),,就可以直接使用了,。

(2 )sys_mbox_t消息

LwIP使用消息隊列來緩沖、傳遞數(shù)據(jù)報文,,因此要在sys_arch中實現(xiàn)消息隊列結(jié)構sys_mbox_t,,以及相應的操作函數(shù)。

sys_mbox_new()/創(chuàng)建一個消息隊列 sys_mbox_free( ) /釋放一個消息隊列

sys_mbox_post( )/向消息隊列發(fā)送消息

sys_arch_mbox_fetch( )/從消息隊列中獲取消息

μCOS-Ⅱ同樣實現(xiàn)了消息隊列結(jié)構及其操作,,但是μCOS-Ⅱ沒有對消息隊列中的消息進行管理,,因此不能直接使用,必須在μCOS-Ⅱ的基礎上重新實現(xiàn),。

(3)sys_arch_timeout函數(shù)

LwIP中每個與外界網(wǎng)絡連接的線程都有自己的timeout屬性,,即等待超時時間。這個屬性表現(xiàn)為每個線程都對應一個sys_timeout結(jié)構體隊列,,包括這個線程的timeout時間長度

,,以及超時后應調(diào)用的timeout函數(shù),該函數(shù)會做一些釋放連接,,回收資源的工作.timeout結(jié)構體已經(jīng)由LwIP自己在sys.h中定義好了,,而且對結(jié)構體隊列的數(shù)據(jù)操作也由LwIP負責,我們所要實現(xiàn)的是如下函數(shù):

struct sys_timeouts*sys_arch_timeouts(void)

這個函數(shù)的功能是返回目前正處于運行態(tài)的線程所對應的timeout隊列指針,。timeout隊列屬于線程的屬性,,它是OS相關的函數(shù),只能由用戶實現(xiàn)。

(4)sys_thread_new創(chuàng)建新線程

LwIP可以是單線程運行,,也可以多線程運行,。為提高效率并降低編程復雜度,就需要用戶實現(xiàn)創(chuàng)建新線程的函數(shù):

void sys_thread_new(void(*thread)(void*arg), void*arg);

在μCOS-Ⅱ中,,沒有線程(thread)的概念,,只有任務(Task)。它已經(jīng)提供了創(chuàng)建新任務的系統(tǒng)API調(diào)用OSTaskCreate,,因此只要把OSTaskCreate封裝一下,,就可以實現(xiàn)sys_hread_new.

·lib_ arch中庫函數(shù)的實現(xiàn)

LwIP協(xié)議棧中用到了8個外部函數(shù),這些函數(shù)通常與用戶使用的系統(tǒng)或編譯器有關,,因此留給用戶自己實現(xiàn),,有關程序如下:

u16_t htons(u16_t n); /16位數(shù)據(jù)高低字節(jié)交換

u16_t ntohs(u16_t n);

int strlen(const char * str);/返回字符串長度

int strncmp(const char * strl,const char * str2,int len);/字符串比較

void bcopy(const void * src, void * dest, int len);/內(nèi)存數(shù)據(jù)塊之間的互相拷貝

void bzero(void *data, int n); /內(nèi)存中指定長度的數(shù)據(jù)塊清零

類似于操作系統(tǒng)在硬件上的移植,LwIP的移植也是根據(jù)實現(xiàn)的硬件以及操作系統(tǒng)對象,,對相應的文件進行修改,。整個通訊協(xié)議的引入可以很快實現(xiàn)。

LAN91C111驅(qū)動的實現(xiàn)

在上面為μCOS-Ⅱ引入了TCP/IP協(xié)議棧之后,,為了實現(xiàn)以太網(wǎng)通信功能還必須完成相關網(wǎng)絡設備驅(qū)動程序的添加,。LwIP的網(wǎng)絡驅(qū)動有一定的模板,其中src/netif/ethernetif.c文件即為驅(qū)動的模板,,用戶為自己的網(wǎng)絡設備實現(xiàn)驅(qū)動時應參照這個模板,,根據(jù)相應的網(wǎng)絡芯片來實現(xiàn)。本系統(tǒng)選用的網(wǎng)絡芯片是由SMSC公司生產(chǎn)的自適應10M/100M第三代快速以太網(wǎng)控制器芯片LAN91C111,,集成了SMSC/CD協(xié)議的MAC(媒體層)和PHY(物理層),。由于其靈活性和集成度高,具有較高的性價比,。

LAN91C111工作流程比較簡單,,驅(qū)動程序?qū)⒁l(fā)送的數(shù)據(jù)包按指定格式寫入芯片并啟動發(fā)送命令,LAN91C111會自動把數(shù)據(jù)包轉(zhuǎn)換成物理幀格式在物理信道上傳輸;反之芯片收到物理信號后自動將其還原成數(shù)據(jù),,并按指定格式存放在芯片RAM中以便主機程序取用,。簡言之就是LAN91C111完成數(shù)據(jù)包和電信號之間的相

互轉(zhuǎn)換: 數(shù)據(jù)包 電信號。LAN91C111的編程主要包括:初始化,、發(fā)送數(shù)據(jù)包,、接收數(shù)據(jù)包三部分。

初始化

上電后,,LAN91C111內(nèi)部的寄存器的值設置為缺省值,,CPU根據(jù)需要設置它里面的Configuration, Base和Individual Address寄存器,以保證它正確工作,。發(fā)送數(shù)據(jù)包流程

(1) DSP向控制器發(fā)送ALLOCATE MEMORY命令(設置MMUCOM寄存器,,通常設置0x0020),。MMU為待發(fā)送包在控制器內(nèi)部的packet buffer中分配存儲空間。

(2) DSP查詢中斷狀態(tài)寄存器中的ALLOC INT位,,直到該位被置成1,,也可以設置Interrupt Mask中的ALLOC INT位,然后等待硬件中斷,,這時MMU已經(jīng)分配好存儲空間,。而且TX packet number放在Allocation Result寄存器中。

(3)將Allocation Result寄存器中的packet number拷貝到Packet Number:寄存器中,,設置Pointer寄存器(設置為TX,,WR,AUTOINC,即0x4000),。然后將包的數(shù)據(jù)從upper layer發(fā)送隊列傳送到控制器的數(shù)據(jù)寄存器中,。要求依次寫人Status Word, Byte Count, destination address,source address,,packet size,,packet data,control word,。

(4) DSP向控制器發(fā)送"ENQUEUE PACKET NUMBER TO TX FIFO“命令(設置MMUCOM寄存器,,通常設置Ox00C0),這個命令將Packet Number寄存器中的packetnumber拷貝到TX FIFO,,說明發(fā)送的包已經(jīng)放入隊列中,。同時設置Transmit control寄存器中的TXENA位,啟動transmitter,。到目前為止,DSP的設置工作完成,,它可以IDLE,,直到接收到一個控制器產(chǎn)生的發(fā)送中斷。

(5)當控制器傳送完包以后,,memory中的第一個字(16bit)被CSMA/CD寫入相應的Status Word,,然后將TX FIFO中的packet number移到TX completion FIFO,當TX completion FIFO不為空時產(chǎn)生中斷,。

(6) DSP接收到中斷后,,開始執(zhí)行中斷處理程序,它讀入中斷狀態(tài)寄存器,,如果產(chǎn)生發(fā)送中斷,,則從FIFO ports寄存器讀入發(fā)送的包的Packet Number,并將它寫到Packet Number寄存器,。然后從內(nèi)存中讀人狀態(tài)字(包括設置Pointer寄存器為TX,RD,AUTOINC,,即0x6000,,然后從數(shù)據(jù)寄存器中讀入包的狀態(tài)字),它是EPH寄存器的鏡像,,根據(jù)狀態(tài)字判斷包發(fā)送是否成功,。如果成功則DSP向控制器發(fā)布RELEASE命令(設置MMUCOM寄存器,設置為Ox00A0),,控制器將釋放發(fā)送包所使用的存儲空間,,同時設置TX INT Acknowledge寄存器,它將TX completion FIFO中的packet number清除,。

(7)使用“每發(fā)送一個序列的包產(chǎn)生一個中斷”方案:允許TX EMPTY INT和TX INT, AUTORELEASE="1",,當發(fā)送完FIFO中的最后一個包后,產(chǎn)生TX EMPTY INT中斷,。當發(fā)生嚴重的發(fā)送錯誤時,,產(chǎn)生TX INT中斷,同時將發(fā)送失敗的包的packet number保存到FIFO Ports寄存器,,這樣DSP就可以知道發(fā)送過程停止了,。這種方案可以減少DSP的負擔,而且存儲空間的釋放也更迅速,。接收數(shù)據(jù)包流程

(1) DSP設置receive control寄存器中的RXEN位,,允許接收包。

(2)含有正確地址的包被接收到,,從MMU請求存儲空間,,并分派一個packet number,內(nèi)部的DMA邏輯產(chǎn)生連續(xù)的地址,并將接收到的字寫到memory中,,如果超界,,包被丟棄,存儲空間被釋放,。當檢測到包的結(jié)束,,狀態(tài)字被寫到接收包的最前面,byte count寫到第二個字,。如果CRC校驗正確,,packet number被寫到RX FIFO,由于RX FIFO非空,,產(chǎn)生RCV INT中斷;如果CRC校驗不正確,,存儲空間被釋放,而且不產(chǎn)生中斷,。

(3) DSP接收到中斷后開始執(zhí)行中斷處理程序,,它讀入中斷狀態(tài)寄存器,如果產(chǎn)生接收中斷(RCV INT位為1),,則可以從FIFO ports寄存器得到接收的包的packet number,,而且可以從數(shù)據(jù)寄存器將接收包傳送到DSP的內(nèi)存或外存中,。當處理結(jié)束,DSP向處理器發(fā)布REMOVE AND RELEASE FROM TOP OF RX命令(即設置寄存器MMUCOM,,即0x0060),,釋放使用的存儲空間和packet number.

軟件的調(diào)試與驗證

調(diào)試環(huán)境包括我們做的TMS320LF2407A+LAN91C111板、PC機,、仿真器,、網(wǎng)線等。首先,,新建工程,,脫離操作系統(tǒng)和TCP/IP協(xié)議的環(huán)境下,單獨調(diào)試通過LAN91C111的驅(qū)動程序,,初始化,,接收發(fā)送數(shù)據(jù)成功之后,另建工程集合μCOS-Ⅱ和LwIP結(jié)合驅(qū)動程序進行調(diào)試,,在μCOS-Ⅱ中初始化LwlP,,并創(chuàng)建TCP或UDP任務進行測試了。值得注意的是LwIP的初始化必須在μCOS-Ⅱ完全啟動之后也就是在任務中進行,,因為它的初始化用到了信號量等OS相關的操作,。關鍵部份的代碼和說明如下:

main(){OSlnit();OSTaskCreate(Iwip_init_task, Null, &Iwip-init-stk[TASK_STK_SIZE-1 ], 0);OSStart();}

主程序中創(chuàng)建了初始化LwIP任務Lwip_init_task(優(yōu)先級0). Iwip_init_task任務中初始化硬件時鐘和LwIP,還創(chuàng)建了tcpip_thread(優(yōu)先級5)和tcpecho_thread(優(yōu)先級6)兩個任務,。實際上tcpip_thread才是LwIP的主線程,,多線程的Berkley API也是基于這個線程實現(xiàn)的,即上面的tcpecho_thread線程也要依靠tcpip_thread線程來與外界通信,,這樣做的好處是編程簡單,,結(jié)構清晰。

編譯運行后,,用ping IP地址命令可以得到ICMP reply響應,。用telnet IP地址命令可以看到echo server的回顯效果。說明ARP,ICMP,IP,、下CP協(xié)議都已正確運行,調(diào)試通過,。

結(jié)語

按課題的需求,,這套系統(tǒng)用于電力保護系統(tǒng)的現(xiàn)場板卡的管理與和上下位機的通訊,現(xiàn)場采集的數(shù)據(jù)經(jīng)處理后,,通過數(shù)據(jù)線路連接到該板(本文所討論的系統(tǒng)),。由該DSP板集中進行管理并實現(xiàn)和上位機的通訊。該系統(tǒng)目前效果令人滿意,,并且可以根據(jù)課題的需要,,靈活地進行擴展,。還可用于智能家電等領域,具有很好的發(fā)展前景,。

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權禁止轉(zhuǎn)載。