TCP/IP協(xié)議棧在MSP430單片機(jī)上的實(shí)現(xiàn)
引言
隨著信息技術(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)是超低功耗,非常適合于各種功率要求比較低的場合,該系列已經(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ù)裙δ?,同時(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ù)包的分段和重組,從而代碼得到極大的簡化。
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é)省了存儲(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)的操作。
圖1 UIP 協(xié)議棧接口
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)用程序只提供了一個(gè)回調(diào)函數(shù),所以應(yīng)用程序還要把不同的網(wǎng)絡(luò)服務(wù)映射到不同的端口和連接。
UIP 在接受到底層傳來的數(shù)據(jù)包后,如果需要送上層應(yīng)用程序處理,就調(diào)用UIP_APPCALL( ) 。同時(shí),UIP 設(shè)置結(jié)構(gòu)體UIP_conn 指針指向當(dāng)前連接。UIP_conn 記錄一條TCP 連接的所有相關(guān)信息,它是維持uIP 運(yùn)行的關(guān)鍵結(jié)構(gòu),定義如下:
struct uip_conn {
u8_t tcpstateflags ; PPTCP 的狀態(tài)和標(biāo)志
u16_t lport , rport ; PP當(dāng)?shù)睾瓦h(yuǎn)端端口
u16_t ripaddr[2] ; PP遠(yuǎn)端的IP 地址
u8_t rcv- nxt [4] ; PP下一個(gè)要接收的序列號(hào)
u8_t snd- nxt [4] ; PP上一個(gè)已發(fā)送的序列號(hào)
u8_t ack- nxt [4] ; PP對(duì)端下一個(gè)應(yīng)答序列號(hào)
u8_t timer ; PP重傳時(shí)間
u8_t nrtx ; PP計(jì)算特殊段的重發(fā)數(shù)量
u8_t mss ; PP連接中最大分段的大小
u8_t appstate[UIP_APPSTATE_SIZE] ;
} ;
UIP 提供給應(yīng)用程序的接口函數(shù)如: uip_listen ( ) 、uip_connect ( ) 、uip_send( ) 、uip_datalen( ) 、uip_close ( ) 、uip_abort ( ) 、uip_stop ( ) 、uip_stopped( ) 、uip_restart ( ) 等,實(shí)現(xiàn)了TCP/IP 協(xié)議棧的基本功能。
UIP 系統(tǒng)接口
從系統(tǒng)的角度來分析,UIP 包含3 個(gè)C 函數(shù):uip_init ( ) ,uip_input ( ) ,和uip_periodic ( ) 。uip_init ( ) 函數(shù)初始化uIP協(xié)議棧,在系統(tǒng)啟動(dòng)期間調(diào)用。其中uIP_input ( ) 和uIP_periodic ( ) 實(shí)質(zhì)上都是使用uIP_process ( ) ,但它們調(diào)用的參數(shù)和使用情況不一樣。當(dāng)網(wǎng)絡(luò)設(shè)備接收到新數(shù)據(jù)時(shí)調(diào)用函數(shù)uip_input ( ) ;uip_periodic ( ) 周期性運(yùn)行,通常一秒調(diào)用一次。當(dāng)設(shè)備驅(qū)動(dòng)程序發(fā)數(shù)據(jù)包到緩存(uip_buf) 時(shí),系統(tǒng)應(yīng)該調(diào)用uip_input ( ) 函數(shù)。函數(shù)將會(huì)處理這個(gè)包,并在需要時(shí)調(diào)用應(yīng)用程序。當(dāng)uip_input ( ) 返回時(shí),會(huì)有一個(gè)輸出包放在包緩存里。包的大小由全局變量uip_len 約束,如果uip_len 是0 ,說明沒有數(shù)據(jù)包要發(fā)送。
周期時(shí)鐘函數(shù)用于驅(qū)動(dòng)UIP 內(nèi)部時(shí)鐘事件。當(dāng)周期計(jì)時(shí)被激活時(shí),uip_periodic ( ) 函數(shù)被調(diào)用。連接號(hào)作為參數(shù)傳遞給uip_periodic ( ) 函數(shù)。如果有數(shù)據(jù)輸出,則輸出的IP 包放在包緩存里。下面是察看輸出包的一小段代碼,它調(diào)用了uip_periodic( ) 函數(shù)。其中netdev- send ( ) 是網(wǎng)絡(luò)驅(qū)動(dòng)部分,負(fù)責(zé)將uip_buf 數(shù)組的內(nèi)容發(fā)出到網(wǎng)上。
for ( i = 0 ;i UIP- CONNS; ++i) {
uip_periodic (i) ;
if (uip_len > 0)
netdev_send() ;
}
UIP 協(xié)議移植到MSP430F149
基于MSP430 F149 的嵌入式TCP/IP 網(wǎng)絡(luò)通信系統(tǒng)硬件部分主要包括MSP430 芯片、以太網(wǎng)控制器CS8900A 和以太網(wǎng)接口,軟件部分包括設(shè)備驅(qū)動(dòng)程序、嵌入式TCP/IP 協(xié)議棧等部分。
圖2 方案的硬件實(shí)現(xiàn)
硬件的實(shí)現(xiàn)
本方案的單片機(jī)選擇MSP430F149 完成TCP/IP 協(xié)議的解釋和執(zhí)行, 以太網(wǎng)控制器芯片CS89200A 實(shí)現(xiàn)遵循的IEEE802.3 協(xié)議的CSMAPCD 和CRC 校驗(yàn)等功能,以太網(wǎng)隔離變壓器HR601627 轉(zhuǎn)換電平抑制高頻干擾接入以太網(wǎng),最后通過RJ245接口實(shí)現(xiàn)終端設(shè)備接入Internet 。MSP430F149 是一款16 位超低功耗單片機(jī),具有強(qiáng)大的處理能力,RISC結(jié)構(gòu),125ns 的指令周期,具有豐富的片內(nèi)外設(shè),如硬件乘法器、ADC、定時(shí)器、看門狗等。它內(nèi)部具有2KB的RAM和60KB 的FLASH ,尋址空間達(dá)64K。它適用于工業(yè)控制領(lǐng)域,同樣也適用于處理復(fù)雜的TCP/IP 協(xié)議。CS8900A是CIRRUS LOGIC 公司的一種低價(jià)格、高集成度、單芯片、全雙工的以太網(wǎng)控制器,也是專門為嵌入式系統(tǒng)設(shè)計(jì)優(yōu)化的以太網(wǎng)控制器。CS8900A 有三種工作方式: IPO 方式、存儲(chǔ)器方式和DMA 方式。我們選擇IPO 方式,以便利用8-bit 數(shù)據(jù)總線,該總線連接到MSP430 的IPO-port 5。IOR 和IOW是控制線,指示進(jìn)程是否有讀P寫訪問。
軟件的實(shí)現(xiàn)
軟件部分包括以太驅(qū)動(dòng)、TCP/IP 協(xié)議實(shí)現(xiàn)等部分。在CS8900A 驅(qū)動(dòng)程序中,以太模塊cs8900. c 中包含有很多C 函數(shù),如Init8900( ) 、Write8900( ) 、Read8900( ) 等,完成初始化控制器、讀寫數(shù)據(jù)等功能;在頭文件cs8900.h 中,配置網(wǎng)絡(luò)接口的MAC 地址,用戶自己設(shè)置,注意不要與現(xiàn)有的MAC地址沖突。
TCP/IP 協(xié)議棧完成大部分網(wǎng)絡(luò)功能,一方面它利用以太模塊的函數(shù)收發(fā)數(shù)據(jù),另一方面為上層應(yīng)用程序提供簡單易用的API 接口。uip.c 完成ip 、tcp 協(xié)議以及基本的ICMP 功能,它還定義了兩個(gè)前面提及過的重要參數(shù): uip_buf 和uip_len ,uip_buf存儲(chǔ)需要收發(fā)的數(shù)據(jù), uip_len 存儲(chǔ)收發(fā)數(shù)據(jù)的長度; uip -arp.c 完成地址解析;uip_arch.c 完成檢驗(yàn)和uIP的設(shè)置包含在一個(gè)叫uipopt.h 的頭文件里,以宏的形式定義,便于修改。用戶根據(jù)自己的需要,設(shè)置本地的物理地址、IP 地址、網(wǎng)關(guān)地址、數(shù)據(jù)緩沖區(qū)尺寸、ARP表大小等選項(xiàng)。在正確配置UIP后,用戶根據(jù)自己的應(yīng)用需要,編寫主程序。主程序流程如圖(圖3)。
圖3 主程序流程如圖
初始化包括定時(shí)器初始化、網(wǎng)卡芯片初始化、UIP 協(xié)議棧初始化、用戶應(yīng)用程序初始化等等,在主程序初始化完畢后,不停查詢,如果有新的數(shù)據(jù)包到來,則由uip_input ( ) 處理數(shù)據(jù),如果沒有,則調(diào)用uip_periodic ( ) 處理定時(shí)事件。為了將用戶的應(yīng)用程序掛接到UIP 中,可以將UIP_APPCALL( ) 定義成實(shí)際的應(yīng)用程序函數(shù)名,這樣每當(dāng)某個(gè)UIP 事件發(fā)生時(shí),內(nèi)核就會(huì)調(diào)用該應(yīng)用程序進(jìn)行處理。
結(jié)束語
本文所設(shè)計(jì)的方案已經(jīng)成功地應(yīng)用在遠(yuǎn)程自動(dòng)抄表系統(tǒng)中,UIP 協(xié)議棧在MSP430F149 上運(yùn)行良好,達(dá)到預(yù)期效果。同時(shí),該方案成本低、運(yùn)行穩(wěn)定可靠、傳輸速度快、開發(fā)周期短,適用于現(xiàn)有的局域網(wǎng)和Internet ,可以實(shí)現(xiàn)對(duì)信息家電類產(chǎn)品的遠(yuǎn)程訪問控制,特別是數(shù)據(jù)采集、傳輸?shù)冗h(yuǎn)程監(jiān)控,具有廣泛的應(yīng)用前景。
tcp/ip相關(guān)文章:tcp/ip是什么
評(píng)論