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)是超低功耗,非常適合于各種功率要求比較低的場(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)頁(yè)瀏覽、文件傳輸?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ù)包的分段和重組,從而代碼得到極大的簡(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)的操作。
圖1 UIP 協(xié)議棧接口
UIP 應(yīng)用接口
UIP 使用基于事件的程序模式,應(yīng)用程序由C 語(yǔ)言函數(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)用程序提供簡(jiǎn)單易用的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ù)的長(zhǎng)度; 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é)束語(yǔ)
本文所設(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)論