TCP/IP協(xié)議棧在MSP430單片機(jī)上的實(shí)現(xiàn)
摘 要:該文首先對(duì)嵌入式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ā)展,以及人們對(duì)日常生活舒適度、方便度要求的提高,信息家電、智能儀表等產(chǎn)品越來越頻繁的出現(xiàn)在我們的生活當(dāng)中;人們也越來越熱衷于把家電、儀表等設(shè)備連接到internet 中,從而可以方便、及時(shí)的對(duì)它們進(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)是超低功耗,非常適合于各種功率要求比較低的場(chǎng)合,該系列已經(jīng)應(yīng)用在智能儀表、醫(yī)療設(shè)備和保安系統(tǒng)等方面。本文給出了在msp430f149 硬件平臺(tái)上移植tcp/ip 協(xié)議的方案,實(shí)現(xiàn)了終端設(shè)備到internet 的接入。 嵌入式tcp/ip 協(xié)議棧uip tcp/ip 是一個(gè)協(xié)議族,它是一個(gè)四層網(wǎng)絡(luò)協(xié)議模型,分別包含應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、網(wǎng)絡(luò)接口層。應(yīng)用層定義清晰的會(huì)話過程,平常所用的協(xié)議如http、ftp、smtp、telnet 等都屬于應(yīng)用層。傳輸層提供端對(duì)端的通信,該層協(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)行無差錯(cuò)的傳送數(shù)據(jù),并且具有流量控制等功能。 在嵌入式系統(tǒng)中,應(yīng)用tcp/ip 協(xié)議是主要為了完成數(shù)據(jù)采集和數(shù)據(jù)傳輸,不需要實(shí)現(xiàn)網(wǎng)頁瀏覽、文件傳輸?shù)裙δ埽瑫r(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é)議組的四個(gè)基本協(xié)議:arp(地址解析協(xié)議) ,ip(網(wǎng)際協(xié)議) ,icmp(因特網(wǎng)信息控制協(xié)議) 和tcp(傳輸控制協(xié)議) 。鏈路層協(xié)議例如ppp 等可以由uip 下面的設(shè)備驅(qū)動(dòng)實(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)一個(gè)ip 包要在以太網(wǎng)上發(fā)出時(shí),先查詢arp 表,找出包要發(fā)送去的mac 地址。如果在表里找不到對(duì)應(yīng)的ip 地址,就會(huì)廣播arp 請(qǐng)求包,以獲取給出ip 地址所對(duì)應(yīng)的mac地址。目的主機(jī)收到請(qǐng)求包后發(fā)出一個(gè)arp 回應(yīng)包,給出自己的mac 地址和ip 地址。 當(dāng)arp 表中沒有對(duì)應(yīng)的地址條目時(shí),就會(huì)發(fā)送arp 請(qǐng)求包時(shí),同時(shí)該請(qǐng)求包會(huì)覆蓋掉發(fā)出請(qǐng)求的ip 包,以節(jié)省儲(chǔ)存器。arp 表每十秒更新一次。 ip 協(xié)議 uip 的ip 協(xié)議主要負(fù)責(zé)驗(yàn)證輸入包的ip 頭的正確性,以及在icmp 和tcp 之間復(fù)用數(shù)據(jù)包。ip 層沒有實(shí)現(xiàn)數(shù)據(jù)包的分段和重組,從而代碼得到極大的簡(jiǎn)化。 icmp 協(xié)議 icmp 中echo 和echo reply 信息常常用在ping 程序里,以檢查目的主機(jī)能否連通。在uip 只實(shí)現(xiàn)echo 。在處理收到的echo 信息時(shí),只需要把icmp 類型字段從“echo”類型改變到“echo reply”類型,調(diào)整icmp 校驗(yàn)和,并互掉ip 數(shù)據(jù)包頭里的目的地址和源地址,把包發(fā)回到發(fā)送方。 tcp 為了減少儲(chǔ)存器的使用,在uip 里,tcp 不再實(shí)現(xiàn)發(fā)送和接收數(shù)據(jù)的窗口調(diào)整;不會(huì)緩存剛剛收到的tcp 段,而是立即由應(yīng)用程序處理,應(yīng)用程序可以自己緩沖數(shù)據(jù);在輸出數(shù)據(jù)時(shí),在每個(gè)連接只能有一個(gè)正在傳輸?shù)膖cp 段。 以上四個(gè)協(xié)議實(shí)現(xiàn)的過程中,極大的簡(jiǎn)化了代碼和處理過程,節(jié)省了存儲(chǔ)空間和緩存空間。 uip 協(xié)議棧的接口
uip 協(xié)議通過一系列接口函數(shù)與底層系統(tǒng)和上層應(yīng)用通信,它內(nèi)部的協(xié)議集合對(duì)外部系統(tǒng)來說是透明的,從而增強(qiáng)了該協(xié)議的通用性和獨(dú)立性,可以非常方便地移植到不同系統(tǒng)和應(yīng)用平臺(tái)。 圖1 描述了uip、底層系統(tǒng)和應(yīng)用程序三者之間的調(diào)用關(guān)系。其中uip 提供了三個(gè)函數(shù)給底層系統(tǒng):uip_init ( ) ,uip_input ( ) ,uip_periodic ( ) 。應(yīng)用程序向uip 提供一個(gè)調(diào)用函數(shù)uip_ appcall( ) ,在網(wǎng)絡(luò)事件或計(jì)時(shí)事件發(fā)生時(shí)進(jìn)行調(diào)用;同時(shí),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ù)需要重新傳輸時(shí),uip 都會(huì)調(diào)用應(yīng)用程序。同時(shí),應(yīng)用程序還要周期查詢是否有新的數(shù)據(jù)收發(fā)。因?yàn)閼?yīng)用