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