TCP/IP協議棧在MSP430單片機上的實現
引言
隨著信息技術的不斷發展,以及人們對日常生活舒適度、方便度要求的提高,信息家電、智能儀表等產品越來越頻繁的出現在我們的生活當中;人們也越來越熱衷于把家電、儀表等設備連接到Internet 中,從而可以方便、及時的對它們進行遠程察看、遠程控制。把這些設備接入Internet ,就需要考慮TCP/IP 網絡協議的實現。
MSP430 系列單片機是由TI 公司開發的16 位單片機,其突出特點是超低功耗,非常適合于各種功率要求比較低的場合,該系列已經應用在智能儀表、醫療設備和保安系統等方面。本文給出了在 MSP430F149 硬件平臺上移植TCP/IP 協議的方案,實現了終端設備到Internet 的接入。
嵌入式TCP/IP 協議棧uIP
TCP/IP 是一個協議族,它是一個四層網絡協議模型,分別包含應用層、傳輸層、網絡層、網絡接口層。應用層定義清晰的會話過程,平常所用的協議如HTTP、FTP、 SMTP、Telnet 等都屬于應用層。傳輸層提供端對端的通信,該層協議有傳輸控制協議(TCP) 和用戶數據協議(UDP) 。網絡層負責數據打包和邏輯尋址,這一層的協議有IP、ICMP、ARP 等協議。網絡接口層負責在源和目的節點間的線路上進行無差錯的傳送數據,并且具有流量控制等功能。
在嵌入式系統中,應用TCP/IP 協議是主要為了完成數據采集和數據傳輸,不需要實現網頁瀏覽、文件傳輸等功能,同時,MSP430 芯片也沒有足夠的空間資源實現所有的TCP/IP協議,所以在本文的方案中,采用了UIP TCP/IP 棧。它是瑞士計算機科學院的Adam Dunkels 等開發的一種免費公開源代碼的小型TCP/IP 協議棧,它專門為8 位和16 位MCU 編寫。uIP 代碼的大小和RAM的需求比其它一般的TCP/IP 棧要小得多。
UIP實現了TCP/IP 協議組的四個基本協議:ARP(地址解析協議) ,IP(網際協議) ,ICMP(因特網信息控制協議) 和TCP(傳輸控制協議) 。鏈路層協議例如PPP 等可以由UIP 下面的設備驅動實現;應用層協議例如HTTP、FTP、SMTP、Telnet 等可以由uIP 之上的應用程序實現。
ARP 協議
ARP 協議把目標IP 地址解析為相應的以太網MAC 地址。當一個IP 包要在以太網上發出時,先查詢ARP 表,找出包要發送去的MAC 地址。如果在表里找不到對應的IP 地址,就會廣播ARP 請求包,以獲取給出IP 地址所對應的MAC地址。目的主機收到請求包后發出一個ARP 回應包,給出自己的MAC 地址和IP 地址。
當ARP 表中沒有對應的地址條目時,就會發送ARP 請求包時,同時該請求包會覆蓋掉發出請求的IP 包,以節省儲存器。ARP 表每十秒更新一次。
IP 協議
UIP 的IP 協議主要負責驗證輸入包的IP 頭的正確性,以及在ICMP 和TCP 之間復用數據包。IP 層沒有實現數據包的分段和重組,從而代碼得到極大的簡化。
ICMP 協議
ICMP 中echo 和echo reply 信息常常用在ping 程序里,以檢查目的主機能否連通。在uIP 只實現echo 。在處理收到的echo 信息時,只需要把ICMP 類型字段從“echo”類型改變到“echo reply”類型,調整ICMP 校驗和,并互掉IP 數據包頭里的目的地址和源地址,把包發回到發送方。
TCP
為了減少儲存器的使用,在UIP 里,TCP 不再實現發送和接收數據的窗口調整;不會緩存剛剛收到的TCP 段,而是立即由應用程序處理,應用程序可以自己緩沖數據;在輸出數據時,在每個連接只能有一個正在傳輸的TCP 段。
以上四個協議實現的過程中,極大的簡化了代碼和處理過程,節省了存儲空間和緩存空間。
UIP 協議棧的接口
UIP 協議通過一系列接口函數與底層系統和上層應用通信,它內部的協議集合對外部系統來說是透明的,從而增強了該協議的通用性和獨立性,可以非常方便地移植到不同系統和應用平臺。
圖 1 描述了UIP、底層系統和應用程序三者之間的調用關系。其中UIP 提供了三個函數給底層系統:UIP_init ( ) ,UIP_input ( ) ,UIP_periodic ( ) 。應用程序向UIP 提供一個調用函數UIP_ APPCALL( ) ,在網絡事件或計時事件發生時進行調用;同時,UIP 也要向應用程序提供一些與協議棧的接口函數,應用程序根據接口函數提供的信息或者狀態,執行相應的操作。
圖1 UIP 協議棧接口
UIP 應用接口
UIP 使用基于事件的程序模式,應用程序由C 語言函數實現。當收發數據、新連接建立或者數據需要重新傳輸時,UIP 都會調用應用程序。同時,應用程序還要周期查詢是否有新的數據收發。因為應用程序只提供了一個回調函數,所以應用程序還要把不同的網絡服務映射到不同的端口和連接。
UIP 在接受到底層傳來的數據包后,如果需要送上層應用程序處理,就調用UIP_APPCALL( ) 。同時,UIP 設置結構體UIP_conn 指針指向當前連接。UIP_conn 記錄一條TCP 連接的所有相關信息,它是維持uIP 運行的關鍵結構,定義如下:
struct uip_conn {
u8_t tcpstateflags ; PPTCP 的狀態和標志
u16_t lport , rport ; PP當地和遠端端口
u16_t ripaddr[2] ; PP遠端的IP 地址
u8_t rcv- nxt [4] ; PP下一個要接收的序列號
u8_t snd- nxt [4] ; PP上一個已發送的序列號
u8_t ack- nxt [4] ; PP對端下一個應答序列號
u8_t timer ; PP重傳時間
u8_t nrtx ; PP計算特殊段的重發數量
u8_t mss ; PP連接中最大分段的大小
u8_t appstate[UIP_APPSTATE_SIZE] ;
} ;
UIP 提供給應用程序的接口函數如: uip_listen ( ) 、uip_connect ( ) 、uip_send( ) 、uip_datalen( ) 、uip_close ( ) 、uip_abort ( ) 、uip_stop ( ) 、uip_stopped( ) 、uip_restart ( ) 等,實現了TCP/IP 協議棧的基本功能。
UIP 系統接口
從系統的角度來分析,UIP 包含3 個C 函數:uip_init ( ) ,uip_input ( ) ,和uip_periodic ( ) 。uip_init ( ) 函數初始化uIP協議棧,在系統啟動期間調用。其中uIP_input ( ) 和uIP_periodic ( ) 實質上都是使用uIP_process ( ) ,但它們調用的參數和使用情況不一樣。當網絡設備接收到新數據時調用函數uip_input ( ) ;uip_periodic ( ) 周期性運行,通常一秒調用一次。當設備驅動程序發數據包到緩存(uip_buf) 時,系統應該調用uip_input ( ) 函數。函數將會處理這個包,并在需要時調用應用程序。當uip_input ( ) 返回時,會有一個輸出包放在包緩存里。包的大小由全局變量uip_len 約束,如果uip_len 是0 ,說明沒有數據包要發送。
周期時鐘函數用于驅動UIP 內部時鐘事件。當周期計時被激活時,uip_periodic ( ) 函數被調用。連接號作為參數傳遞給uip_periodic ( ) 函數。如果有數據輸出,則輸出的IP 包放在包緩存里。下面是察看輸出包的一小段代碼,它調用了uip_periodic( ) 函數。其中netdev- send ( ) 是網絡驅動部分,負責將uip_buf 數組的內容發出到網上。
for ( i = 0 ;i UIP- CONNS; ++i) {
uip_periodic (i) ;
if (uip_len > 0)
netdev_send() ;
}
UIP 協議移植到MSP430F149
基于MSP430 F149 的嵌入式TCP/IP 網絡通信系統硬件部分主要包括MSP430 芯片、以太網控制器CS8900A 和以太網接口,軟件部分包括設備驅動程序、嵌入式TCP/IP 協議棧等部分。
圖2 方案的硬件實現
硬件的實現
本方案的單片機選擇MSP430F149 完成TCP/IP 協議的解釋和執行, 以太網控制器芯片CS89200A 實現遵循的IEEE802.3 協議的CSMAPCD 和CRC 校驗等功能,以太網隔離變壓器HR601627 轉換電平抑制高頻干擾接入以太網,最后通過RJ245接口實現終端設備接入Internet 。MSP430F149 是一款16 位超低功耗單片機,具有強大的處理能力,RISC結構,125ns 的指令周期,具有豐富的片內外設,如硬件乘法器、ADC、定時器、看門狗等。它內部具有2KB的RAM和60KB 的FLASH ,尋址空間達64K。它適用于工業控制領域,同樣也適用于處理復雜的TCP/IP 協議。CS8900A是CIRRUS LOGIC 公司的一種低價格、高集成度、單芯片、全雙工的以太網控制器,也是專門為嵌入式系統設計優化的以太網控制器。CS8900A 有三種工作方式: IPO 方式、存儲器方式和DMA 方式。我們選擇IPO 方式,以便利用8-bit 數據總線,該總線連接到MSP430 的IPO-port 5。IOR 和IOW是控制線,指示進程是否有讀P寫訪問。
軟件的實現
軟件部分包括以太驅動、TCP/IP 協議實現等部分。在CS8900A 驅動程序中,以太模塊cs8900. c 中包含有很多C 函數,如Init8900( ) 、Write8900( ) 、Read8900( ) 等,完成初始化控制器、讀寫數據等功能;在頭文件cs8900.h 中,配置網絡接口的MAC 地址,用戶自己設置,注意不要與現有的MAC地址沖突。
TCP/IP 協議棧完成大部分網絡功能,一方面它利用以太模塊的函數收發數據,另一方面為上層應用程序提供簡單易用的API 接口。uip.c 完成ip 、tcp 協議以及基本的ICMP 功能,它還定義了兩個前面提及過的重要參數: uip_buf 和uip_len ,uip_buf存儲需要收發的數據, uip_len 存儲收發數據的長度; uip -arp.c 完成地址解析;uip_arch.c 完成檢驗和uIP的設置包含在一個叫uipopt.h 的頭文件里,以宏的形式定義,便于修改。用戶根據自己的需要,設置本地的物理地址、IP 地址、網關地址、數據緩沖區尺寸、ARP表大小等選項。在正確配置UIP后,用戶根據自己的應用需要,編寫主程序。主程序流程如圖(圖3)。
圖3 主程序流程如圖
初始化包括定時器初始化、網卡芯片初始化、UIP 協議棧初始化、用戶應用程序初始化等等,在主程序初始化完畢后,不停查詢,如果有新的數據包到來,則由uip_input ( ) 處理數據,如果沒有,則調用uip_periodic ( ) 處理定時事件。為了將用戶的應用程序掛接到UIP 中,可以將UIP_APPCALL( ) 定義成實際的應用程序函數名,這樣每當某個UIP 事件發生時,內核就會調用該應用程序進行處理。
結束語
本文所設計的方案已經成功地應用在遠程自動抄表系統中,UIP 協議棧在MSP430F149 上運行良好,達到預期效果。同時,該方案成本低、運行穩定可靠、傳輸速度快、開發周期短,適用于現有的局域網和Internet ,可以實現對信息家電類產品的遠程訪問控制,特別是數據采集、傳輸等遠程監控,具有廣泛的應用前景。
tcp/ip相關文章:tcp/ip是什么
評論