一種uIP TCP/IP協(xié)議棧在51系列單片機上的實(shí)現
一 引言
本文引用地址:http://dyxdggzs.com/article/172581.htm隨著(zhù)信息技術(shù)的不斷發(fā)展,以及人們對日常生活舒適度、方便度要求的提高,信息家電、智能儀表等產(chǎn)品越來(lái)越頻繁的出現在我們的生活當中;人們也越來(lái)越熱衷于把家電、儀表等設備連接到Internet 中,從而可以方便、及時(shí)的對它們進(jìn)行遠程察看、遠程控制。把這些設備接入Internet ,就需要考慮TCP/IP 網(wǎng)絡(luò )協(xié)議的實(shí)現。
51單片機是對目前所有兼容Intel 8031指令系統的單片機的統稱(chēng)。該系列單片機的始祖是Intel的8031單片機,后來(lái)隨著(zhù)Flash rom技術(shù)的發(fā)展,8031單片機取得了長(cháng)足的進(jìn)展,成為目前應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用于工業(yè)測控系統之中。目前很多公司都有51系列的兼容機型推出,在目前乃至今后很長(cháng)的一段時(shí)間內將占有大量市場(chǎng)。51單片機是基礎入門(mén)的一個(gè)單片機,還是應用最廣泛的一種。需要注意的是52系列的單片機一般不具備自編程能力。本文將簡(jiǎn)要描述uIP的實(shí)現方法,分析uIP協(xié)議棧的應用接口,并討論如何將其應用到51系列單片機上。
二 uIP協(xié)議棧的實(shí)現方法簡(jiǎn)述
uIP協(xié)議棧主要提供了三個(gè)函數供系統底層調用。即uip_init(), uip_input() 和uip_periodic()。其與應用程序的主要接口是UIP_APPCALL( )。ip_init()是系統初始化時(shí)調用的,主要初始化協(xié)議棧的偵聽(tīng)端口和默認所有連接是封閉的。當網(wǎng)卡驅動(dòng)收到一個(gè)輸進(jìn)包時(shí),將放進(jìn)全局緩沖區uip_buf中,包的大小由全局變量uip_len約束。同時(shí)將調用uip_input()函數,這個(gè)函數將會(huì )根據包首部的協(xié)議處理這個(gè)包和需要時(shí)調用應用程序。當uip_input()返回時(shí),一個(gè)輸出包同樣放在全局緩沖區uip_buf里,大小賦給uip_len.假如uip_len是0,則說(shuō)明沒(méi)有包要發(fā)送。否則調用底層系統的發(fā)包函數將包發(fā)送到網(wǎng)絡(luò )上。uIP周期計時(shí)是用于驅動(dòng)所有的uIP內部時(shí)鐘事件。當周期計時(shí)激發(fā),每一個(gè)TCP連接都會(huì )調用uIP函數uip_periodic()。類(lèi)似于uip_input()函數。uip_periodic()函數返回時(shí),輸出的IP包要放到uip_buf中,供底層系統查詢(xún)uip_len的大小發(fā)送。
uIP實(shí)現了TCP/IP協(xié)議集的四個(gè)基本協(xié)議:ARP地址解析協(xié)議,IP網(wǎng)際互聯(lián)協(xié)議, ICMP網(wǎng)絡(luò )控制報文協(xié)議和TCP傳輸控制協(xié)議。為了在8位16位處理器上應用,uIP協(xié)議棧在各層協(xié)議實(shí)現時(shí)采用有針對性的方法,保持代碼大小和存儲器使用量最小。
1 實(shí)現ARP地址解析協(xié)議時(shí)為了節省存儲器,ARP應答包直接覆蓋ARP請求包。
2 實(shí)現IP網(wǎng)絡(luò )協(xié)議時(shí)對原協(xié)議進(jìn)行了極大的簡(jiǎn)化,它沒(méi)有實(shí)現分片和重組。
3 實(shí)現ICMP網(wǎng)絡(luò )控制報文協(xié)議時(shí),只實(shí)現echo(回響)服務(wù)。uIP在生成回響報文時(shí)并不重新分配存儲器空間,而是直接修改echo請求報文來(lái)生成回響報文。將ICMP類(lèi)型字段從echo類(lèi)型改變成 echo reply類(lèi)型,重新計算校驗和修改校驗和字段。
4 uIP里的TCP沒(méi)有實(shí)現發(fā)送和接收數據的滑動(dòng)窗口。每個(gè)TCP連接的狀態(tài)由uip_conn結構保存,uip_conn結構包括當地和遠端的TCP端口編號,遠程主機的IP地址,重發(fā)時(shí)間值,上一段重發(fā)的編號,和連接的段的最大尺寸等信息。一個(gè)uip_conn結構數組用于保存所有的連接,數組的大小為支持的同時(shí)連接的最大數量。為了減少儲存器的使用量,在處理重發(fā)時(shí)uIP并不緩存發(fā)送的數據包,而是由應用程序在需要重發(fā)時(shí)重新生成發(fā)送的數據。
三 uIP協(xié)議棧的接口
uIP協(xié)議棧為了具有最大的通用性,在實(shí)現時(shí)將底層硬件驅動(dòng)和頂層應用層之外的所有協(xié)議集打包在一個(gè)庫里。協(xié)議棧通過(guò)接口與底層硬件和頂層應用通信.通過(guò)這種方式,uIP具有極高的通用性和獨立性,移植到不同系統和實(shí)現不同的應用都很方便,很好的體現了TCP/IP協(xié)議平臺無(wú)關(guān)性的特點(diǎn)。uIP協(xié)議棧與系統底層和應用程序之間的接口關(guān)系如圖(一)所示:
1 uIP協(xié)議棧與系統底層的接口
uIP與系統底層的接口包括與設備驅動(dòng)的接口和與系統定時(shí)器的接口兩類(lèi)。
1.1 uIP與設備驅動(dòng)接口
uIP通過(guò)函數uip_input()和全局變量uip_buf、uip_len來(lái)實(shí)現與設備驅動(dòng)的接口。uip_buf用于存放接收到的和要發(fā)送的數據包,為了減少存儲器的使用,接收數據包和發(fā)送數據包使用相同的緩沖區。uip_len表明接收發(fā)送緩沖區里的數據長(cháng)度,通過(guò)判斷uip_len的值是否為0來(lái)判斷是否接收到新的數據,是否有數據要發(fā)送。當設備驅動(dòng)接收到一個(gè)IP包并放到輸入包緩存里(uip_buf)后,應該調用uip_input()函數。uip_input()函數是uIP協(xié)議棧的底層入口,由它處理收到的IP包。當uip_input()返回,若有數據要發(fā)送,則發(fā)送數據包放在包緩沖區里。包的大小由全局變量uip_len指明。如果uip_len是0,沒(méi)有包要發(fā)送;如果uip_len大于0則調用網(wǎng)絡(luò )設備驅動(dòng)發(fā)送數據包。
tcp/ip相關(guān)文章:tcp/ip是什么
評論