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

 

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

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

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

 

<a class=嵌入式以太網硬件系統結構圖" 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 嵌入式以太網硬件系統結構圖

TCP/IP網絡協議棧的引入

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

關于LwIP簡介

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

協議棧的實現

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

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

(2 )sys_mbox_t消息

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

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

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

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

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

(3)sys_arch_timeout函數

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

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

struct sys_timeouts*sys_arch_timeouts(void)

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

(4)sys_thread_new創建新線程

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

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

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

·lib_ arch中庫函數的實現

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

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

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);/內存數據塊之間的互相拷貝

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

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

LAN91C111驅動的實現

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

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

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

初始化

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

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

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

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

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

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

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

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

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

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

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

軟件的調試與驗證

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

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

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

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

結語

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

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美日韩成人在线播放| 国产美女精品在线| 午夜精品久久久久久久蜜桃app| 91久久国产精品91久久性色| 久久激情婷婷| 久久国产主播精品| 欧美在线视频网站| 欧美亚洲一区三区| 欧美一级成年大片在线观看| 亚洲一二三区在线| 亚洲专区一区| 性欧美18~19sex高清播放| 亚洲欧美中文字幕| 亚洲欧美美女| 亚洲欧美日韩国产综合| 亚洲自拍三区| 欧美一区2区视频在线观看 | 久久aⅴ乱码一区二区三区| 午夜激情一区| 欧美在线电影| 91久久精品国产91久久| 日韩视频在线一区二区三区| 99视频精品免费观看| 亚洲社区在线观看| 性欧美大战久久久久久久久| 欧美在线观看视频一区二区| 久久久99爱| 欧美不卡高清| 欧美午夜精品久久久久久久| av成人手机在线| 久久久亚洲精品一区二区三区| 午夜日韩视频| 久久精品国产一区二区电影| 久久精视频免费在线久久完整在线看| 久久人人爽人人爽| 欧美国产日韩精品免费观看| 欧美日韩一区二区国产| 国产精品人人做人人爽人人添| 国产日韩欧美亚洲| 亚洲高清视频一区| 一本久久综合| 午夜精品久久| 亚洲精品资源美女情侣酒店| 宅男噜噜噜66国产日韩在线观看| 香蕉成人啪国产精品视频综合网| 久久久久国产精品www | 国产精品久久九九| 国产综合在线视频| 亚洲欧洲日本一区二区三区| 在线视频你懂得一区| 久久国产精品久久久久久| 亚洲最新在线| 久久精品亚洲一区二区| 欧美日本在线观看| 国产日韩欧美一二三区| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲国产福利在线| 亚洲一区二区三区高清| 久久精品99国产精品| 一区二区三区成人| 久久精品国产96久久久香蕉| 美日韩丰满少妇在线观看| 欧美性猛交99久久久久99按摩| 国内外成人免费激情在线视频网站 | 欧美成人高清| 国产伦理精品不卡| 亚洲欧洲一区二区天堂久久| 亚洲综合日韩在线| 日韩亚洲欧美成人| 久久久蜜臀国产一区二区| 欧美日韩一区二区三区四区在线观看 | 亚洲免费高清视频| 久久av一区| 亚洲天堂成人| 欧美sm视频| 国产一区二区高清不卡| 一本色道久久综合狠狠躁篇怎么玩| 久久国产日韩欧美| 午夜视频一区| 欧美日韩免费高清| 亚洲国产精品www| 欧美在线视频日韩| 午夜精品成人在线视频| 欧美精选一区| 亚洲国产精品黑人久久久| 欧美在线看片a免费观看| 亚洲视频欧美视频| 欧美国产日产韩国视频| 激情久久婷婷| 欧美在线www| 久久福利影视| 国产精品免费看| 一本色道久久综合| 一区二区三区高清| 欧美激情第二页| 精品盗摄一区二区三区| 欧美影院视频| 久久福利影视| 国产农村妇女毛片精品久久麻豆 | 欧美日韩国产三级| 亚洲福利一区| 亚洲第一精品久久忘忧草社区| 欧美一区激情视频在线观看| 欧美午夜影院| 一本色道久久综合亚洲91| 99精品视频免费观看| 欧美第十八页| 亚洲国产精品毛片| 亚洲毛片一区| 欧美成人黑人xx视频免费观看| 极品日韩久久| 亚洲国产高清aⅴ视频| 久久夜色精品国产噜噜av| 国产亚洲免费的视频看| 午夜精品电影| 久久国产欧美精品| 国产一区二区成人| 久久国产精品99久久久久久老狼 | 久久精品亚洲热| 久久综合狠狠综合久久综青草 | 亚洲国产精品电影| 亚洲精品在线观| 欧美激情亚洲视频| 亚洲精品你懂的| 在线亚洲国产精品网站| 欧美性生交xxxxx久久久| 亚洲午夜精品在线| 欧美亚洲专区| 韩国女主播一区| 亚洲激情网站免费观看| 欧美黄色片免费观看| 亚洲激情网站| 亚洲午夜黄色| 国产欧美日韩三级| 欧美影院在线| 欧美成人精品1314www| 亚洲靠逼com| 亚洲欧美国产一区二区三区| 国产精品丝袜91| 欧美综合激情网| 欧美国产高清| 一区二区三区四区国产| 羞羞视频在线观看欧美| 国产亚洲精品aa| 亚洲精品韩国| 国产精品va| 欧美一区二视频在线免费观看| 卡通动漫国产精品| 91久久精品国产91久久| 亚洲一区二区在线看| 国产乱码精品一区二区三区不卡| 欧美一区二区三区的| 免费看av成人| 中文有码久久| 老司机午夜精品视频| 亚洲看片一区| 久久国产精品99国产| 亚洲丰满在线| 亚洲一区二区精品在线观看| 国产欧美日韩亚洲精品| 亚洲第一黄色| 国产精品a级| 亚洲风情亚aⅴ在线发布| 欧美久久一区| 欧美一区免费| 欧美三区在线| 久久精品一区| 欧美午夜一区二区| 亚洲大片一区二区三区| 欧美日韩中文字幕| 久久不射网站| 欧美日韩免费观看一区二区三区 | 国产精品美女一区二区在线观看| 欧美主播一区二区三区| 欧美伦理91| 欧美一区二区在线看| 欧美日韩国产影院| 久久gogo国模啪啪人体图| 欧美日韩日日夜夜| 亚洲国产精品成人| 国产精品久久一卡二卡| 亚洲国产一区二区三区a毛片| 国产精品国产成人国产三级| 亚洲国产专区校园欧美| 国产精品视频九色porn| 亚洲人午夜精品| 国产麻豆日韩| 亚洲视频在线一区| 在线播放日韩| 欧美在线免费一级片| 亚洲美女电影在线| 毛片av中文字幕一区二区| 亚洲欧美日韩国产一区二区三区| 欧美激情综合| 亚洲国产精品一区二区久| 国产美女精品一区二区三区| 亚洲少妇中出一区| 最新国产の精品合集bt伙计| 久久久免费精品视频| 亚洲免费小视频|