<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于μC/OS-Ⅱ的嵌入式以太網(wǎng)通信的設計與實(shí)現

基于μC/OS-Ⅱ的嵌入式以太網(wǎng)通信的設計與實(shí)現

作者: 時(shí)間:2013-01-22 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/148124.htm

uⅡ提供的僅僅只是一個(gè)實(shí)時(shí)的調度及任務(wù)間的內核,沒(méi)有集成網(wǎng)絡(luò )協(xié)議。上網(wǎng)是當前設備的廣泛需求,本文討論輕型TCP/IP協(xié)議棧的引入以及相關(guān)網(wǎng)絡(luò )設備驅動(dòng)程序,系統的網(wǎng)絡(luò )功能。

本文所用的硬件系統結構如圖1所示。開(kāi)發(fā)板TMS320LF2407A的含DSP核微處理器和LAN91C111控制器。在成功移植了μCOS-Ⅱ的基礎上進(jìn)一步通訊功能。下面重點(diǎn)介紹TCP/IP協(xié)議棧的引入和LAN91C111驅動(dòng)的編寫(xiě)。

微博桌面截圖_20130122105925.jpg

圖1 硬件系統結構圖

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

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

關(guān)于LwIP簡(jiǎn)介

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

協(xié)議棧的實(shí)現

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

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

(2 )sys_mbox_t消息

LwIP使用消息隊列來(lái)緩沖、傳遞數據報文,因此要在sys_arch中實(shí)現消息隊列結構sys_mbox_t,以及相應的操作函數。

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

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

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

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

(3)sys_arch_timeout函數

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

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

struct sys_timeouts*sys_arch_timeouts(void)

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

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

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

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

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

·lib_ arch中庫函數的實(shí)現

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

u16_t htons(u16_t n); /16位數據高低字節交換

u16_t ntohs(u16_t n);

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

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

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

void bzero(void *data, int n); /內存中指定長(cháng)度的數據塊清零

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

LAN91C111驅動(dòng)的實(shí)現

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

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

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

初始化

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

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

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

(3)將Allocation Result寄存器中的packet number拷貝到Packet Number:寄存器中,設置Pointer寄存器(設置為T(mén)X,WR,AUTOINC,即0x4000)。然后將包的數據從upper layer發(fā)送隊列傳送到控制器的數據寄存器中。要求依次寫(xiě)人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),這個(gè)命令將Packet Number寄存器中的packetnumber拷貝到TX FIFO,說(shuō)明發(fā)送的包已經(jīng)放入隊列中。同時(shí)設置Transmit control寄存器中的TXENA位,啟動(dòng)transmitter。到目前為止,DSP的設置工作完成,它可以IDLE,直到接收到一個(gè)控制器產(chǎn)生的發(fā)送中斷。

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

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

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

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

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

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

軟件的調試與驗證

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

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

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

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

結語(yǔ)

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

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


數字通信相關(guān)文章:數字通信原理


通信相關(guān)文章:通信原理




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>