TCP/IP協(xié)議棧在MSP430單片機(jī)上的實(shí)現(xiàn)
摘 要:該文首先對嵌入式tcp/ip 協(xié)議棧進(jìn)行了分析,接著詳細(xì)剖析了嵌入式tcp/ip 協(xié)議棧移植到msp430f149芯片的過程,最后提出了嵌入式tcp/ip 系統(tǒng)的整體實(shí)現(xiàn)方案。 關(guān)鍵詞:嵌入式系統(tǒng);uip;移植;msp430f149 引言 隨著信息技術(shù)的不斷發(fā)展,以及人們對日常生活舒適度、方便度要求的提高,信息家電、智能儀表等產(chǎn)品越來越頻繁的出現(xiàn)在我們的生活當(dāng)中;人們也越來越熱衷于把家電、儀表等設(shè)備連接到internet 中,從而可以方便、及時的對它們進(jìn)行遠(yuǎn)程察看、遠(yuǎn)程控制。把這些設(shè)備接入internet ,就需要考慮tcp/ip 網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)。 msp430 系列單片機(jī)是由ti 公司開發(fā)的16 位單片機(jī),其突出特點(diǎn)是超低功耗,非常適合于各種功率要求比較低的場合,該系列已經(jīng)應(yīng)用在智能儀表、醫(yī)療設(shè)備和保安系統(tǒng)等方面。本文給出了在msp430f149 硬件平臺上移植tcp/ip 協(xié)議的方案,實(shí)現(xiàn)了終端設(shè)備到internet 的接入。 嵌入式tcp/ip 協(xié)議棧uip tcp/ip 是一個協(xié)議族,它是一個四層網(wǎng)絡(luò)協(xié)議模型,分別包含應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、網(wǎng)絡(luò)接口層。應(yīng)用層定義清晰的會話過程,平常所用的協(xié)議如http、ftp、smtp、telnet 等都屬于應(yīng)用層。傳輸層提供端對端的通信,該層協(xié)議有傳輸控制協(xié)議(tcp) 和用戶數(shù)據(jù)協(xié)議(udp) 。網(wǎng)絡(luò)層負(fù)責(zé)數(shù)據(jù)打包和邏輯尋址,這一層的協(xié)議有ip、icmp、arp 等協(xié)議。網(wǎng)絡(luò)接口層負(fù)責(zé)在源和目的節(jié)點(diǎn)間的線路上進(jìn)行無差錯的傳送數(shù)據(jù),并且具有流量控制等功能。 在嵌入式系統(tǒng)中,應(yīng)用tcp/ip 協(xié)議是主要為了完成數(shù)據(jù)采集和數(shù)據(jù)傳輸,不需要實(shí)現(xiàn)網(wǎng)頁瀏覽、文件傳輸?shù)裙δ?,同時,msp430 芯片也沒有足夠的空間資源實(shí)現(xiàn)所有的tcp/ip協(xié)議,所以在本文的方案中,采用了uip tcp/ip 棧。它是瑞士計(jì)算機(jī)科學(xué)院的adam dunkels 等開發(fā)的一種免費(fèi)公開源代碼的小型tcp/ip 協(xié)議棧,它專門為8 位和16 位mcu 編寫。uip 代碼的大小和ram的需求比其它一般的tcp/ip 棧要小得多。 uip實(shí)現(xiàn)了tcp/ip 協(xié)議組的四個基本協(xié)議:arp(地址解析協(xié)議) ,ip(網(wǎng)際協(xié)議) ,icmp(因特網(wǎng)信息控制協(xié)議) 和tcp(傳輸控制協(xié)議) 。鏈路層協(xié)議例如ppp 等可以由uip 下面的設(shè)備驅(qū)動實(shí)現(xiàn);應(yīng)用層協(xié)議例如http、ftp、smtp、telnet 等可以由uip 之上的應(yīng)用程序?qū)崿F(xiàn)。 arp 協(xié)議 arp 協(xié)議把目標(biāo)ip 地址解析為相應(yīng)的以太網(wǎng)mac 地址。當(dāng)一個ip 包要在以太網(wǎng)上發(fā)出時,先查詢arp 表,找出包要發(fā)送去的mac 地址。如果在表里找不到對應(yīng)的ip 地址,就會廣播arp 請求包,以獲取給出ip 地址所對應(yīng)的mac地址。目的主機(jī)收到請求包后發(fā)出一個arp 回應(yīng)包,給出自己的mac 地址和ip 地址。 當(dāng)arp 表中沒有對應(yīng)的地址條目時,就會發(fā)送arp 請求包時,同時該請求包會覆蓋掉發(fā)出請求的ip 包,以節(jié)省儲存器。arp 表每十秒更新一次。 ip 協(xié)議 uip 的ip 協(xié)議主要負(fù)責(zé)驗(yàn)證輸入包的ip 頭的正確性,以及在icmp 和tcp 之間復(fù)用數(shù)據(jù)包。ip 層沒有實(shí)現(xiàn)數(shù)據(jù)包的分段和重組,從而代碼得到極大的簡化。 icmp 協(xié)議 icmp 中echo 和echo reply 信息常常用在ping 程序里,以檢查目的主機(jī)能否連通。在uip 只實(shí)現(xiàn)echo 。在處理收到的echo 信息時,只需要把icmp 類型字段從“echo”類型改變到“echo reply”類型,調(diào)整icmp 校驗(yàn)和,并互掉ip 數(shù)據(jù)包頭里的目的地址和源地址,把包發(fā)回到發(fā)送方。 tcp 為了減少儲存器的使用,在uip 里,tcp 不再實(shí)現(xiàn)發(fā)送和接收數(shù)據(jù)的窗口調(diào)整;不會緩存剛剛收到的tcp 段,而是立即由應(yīng)用程序處理,應(yīng)用程序可以自己緩沖數(shù)據(jù);在輸出數(shù)據(jù)時,在每個連接只能有一個正在傳輸?shù)膖cp 段。 以上四個協(xié)議實(shí)現(xiàn)的過程中,極大的簡化了代碼和處理過程,節(jié)省了存儲空間和緩存空間。 uip 協(xié)議棧的接口
uip 協(xié)議通過一系列接口函數(shù)與底層系統(tǒng)和上層應(yīng)用通信,它內(nèi)部的協(xié)議集合對外部系統(tǒng)來說是透明的,從而增強(qiáng)了該協(xié)議的通用性和獨(dú)立性,可以非常方便地移植到不同系統(tǒng)和應(yīng)用平臺。 圖1 描述了uip、底層系統(tǒng)和應(yīng)用程序三者之間的調(diào)用關(guān)系。其中uip 提供了三個函數(shù)給底層系統(tǒng):uip_init ( ) ,uip_input ( ) ,uip_periodic ( ) 。應(yīng)用程序向uip 提供一個調(diào)用函數(shù)uip_ appcall( ) ,在網(wǎng)絡(luò)事件或計(jì)時事件發(fā)生時進(jìn)行調(diào)用;同時,uip 也要向應(yīng)用程序提供一些與協(xié)議棧的接口函數(shù),應(yīng)用程序根據(jù)接口函數(shù)提供的信息或者狀態(tài),執(zhí)行相應(yīng)的操作。 uip 應(yīng)用接口 uip 使用基于事件的程序模式,應(yīng)用程序由c 語言函數(shù)實(shí)現(xiàn)。當(dāng)收發(fā)數(shù)據(jù)、新連接建立或者數(shù)據(jù)需要重新傳輸時,uip 都會調(diào)用應(yīng)用程序。同時,應(yīng)用程序還要周期查詢是否有新的數(shù)據(jù)收發(fā)。因?yàn)閼?yīng)用