引言
隨著嵌入式系統(tǒng)應(yīng)用的快速發(fā)展,為實(shí)現(xiàn)對其他設(shè)備的控制、監(jiān)視或管理等功能,需要將嵌入式設(shè)備連入互聯(lián)網(wǎng),以便于遠(yuǎn)程控制和監(jiān)測。為將嵌入式設(shè)備連入互聯(lián)網(wǎng),需要有通信模塊實(shí)現(xiàn)通信協(xié)議。目前嵌入式設(shè)備能夠通過主流的TCP/IP 協(xié)議可直接與外網(wǎng)連接。然而隨著網(wǎng)絡(luò)規(guī)模的日益擴(kuò)大、上網(wǎng)設(shè)備和人數(shù)的激增,目前采用的IPv4逐漸接近其自身發(fā)展的極限,其中比較顯著的問題是IP 地址資源的不足。IPv6[1] 采用長度為128 位的地址,地址空間幾乎可以視為無限,IPv6不僅完全地解決了地址短缺問題,還對在IPv4 中解決不好的其他問題(如,端到端IP連接、服務(wù)質(zhì)量、安全性、移動性等方面)進(jìn)行了改進(jìn)。IPv6成為嵌入式設(shè)備進(jìn)行網(wǎng)絡(luò)互連的首選。
1 嵌入式系統(tǒng)中TCP/IPv6 協(xié)議棧的特點(diǎn)與設(shè)計(jì)
1.1 嵌入式系統(tǒng)中TCP/IPv6 協(xié)議棧的特點(diǎn)
嵌入式系統(tǒng)不同于普通系統(tǒng),它在硬件資源的占有量以及處理器的處理能力等方面受到限制,因此TCP/IP 協(xié)議棧在嵌入式系統(tǒng)與其在通用操作系統(tǒng)中的實(shí)現(xiàn)有很大不同。對于嵌入式系統(tǒng)而言,考慮到TCP/IP協(xié)議的復(fù)雜性以及嵌入式系統(tǒng)自身資源的有限,對TCP/IP 的實(shí)現(xiàn)并不是一件容易的事情[2]。因此就需要對原本復(fù)雜的TCP/IPv6 協(xié)議棧的實(shí)現(xiàn)進(jìn)行精簡。嵌入式IPv6 協(xié)議棧獨(dú)立于嵌入式設(shè)備的操作,代碼空間小、移植性好,可以在無法承載操作系統(tǒng)的小存儲空間的嵌入式設(shè)備上實(shí)施,以實(shí)現(xiàn)這些設(shè)備間的基本網(wǎng)絡(luò)功能。
1.2 嵌入式系統(tǒng)中TCP/IPv6 協(xié)議棧的設(shè)計(jì)
芯片采用挪威Chipcon 公司推出的符合2.4GHz IEEE802.15.4 標(biāo)準(zhǔn)的射頻收發(fā)器CC2420[3] 。該協(xié)議棧要實(shí)現(xiàn)TCP/IPv6 協(xié)議棧的基本功能,運(yùn)行于無線網(wǎng)環(huán)境下。底層協(xié)議采用IEEE 802.15 工作組制定的802.15.4 協(xié)議,802.15.4 協(xié)議是一個(gè)短距離的無線通信標(biāo)準(zhǔn)。網(wǎng)絡(luò)層支持TCP、ICMPv6 協(xié)議,不實(shí)現(xiàn)UDP 協(xié)議。
1.2.1 網(wǎng)絡(luò)接口層
網(wǎng)絡(luò)接口層是TCP/IPv6 協(xié)議棧與以太網(wǎng)設(shè)備的驅(qū)動程序之間的接口。一方面,它將從網(wǎng)卡接收到的數(shù)據(jù)提交給上層網(wǎng)絡(luò)層協(xié)議軟件處理;另一方面,它將從網(wǎng)絡(luò)層接收來的數(shù)據(jù)傳送給網(wǎng)卡驅(qū)動。接口函數(shù)介紹如下:
(1)初始化函數(shù)
初始化函數(shù)InitNi()負(fù)責(zé)實(shí)現(xiàn)網(wǎng)絡(luò)接口層以及下層的物理設(shè)備驅(qū)動程序的初始化。主要包括以太網(wǎng)控制器的上電復(fù)位、MAC 地址的配置、收發(fā)緩沖環(huán)首尾地址的配置以及DMA 的初始化和收發(fā)數(shù)據(jù)格式的定義等。
(2)發(fā)送函數(shù)
在發(fā)送數(shù)據(jù)時(shí),網(wǎng)絡(luò)接口層發(fā)送函數(shù)Send_Ethernet_Frame()負(fù)責(zé)接收IP協(xié)議產(chǎn)生的數(shù)據(jù),將其封裝成以太網(wǎng)數(shù)據(jù)幀后,調(diào)用下層的Send_ Packet()函數(shù)實(shí)現(xiàn)發(fā)送。Send_Packet()函數(shù)實(shí)現(xiàn)的是把以太網(wǎng)數(shù)據(jù)幀通過遠(yuǎn)程DMA 通道送到RTL8019AS 中的發(fā)送緩存區(qū),然后再啟動本地DMA,將數(shù)據(jù)發(fā)送網(wǎng)上。
(3)接收函數(shù)
在接收數(shù)據(jù)時(shí),網(wǎng)絡(luò)接口層接收函數(shù)Rec_Ethernet_Packed( )被下層以太網(wǎng)驅(qū)動程序的數(shù)據(jù)接收函數(shù)Rec_Packet()調(diào)用。Rec_Ethernet_Packed()的作用根據(jù)以太類型值,調(diào)用不同的函數(shù),同時(shí)去除以太幀的頭部,將正確的IPv6 數(shù)據(jù)從NIC 的數(shù)據(jù)緩沖區(qū)內(nèi)發(fā)送到ARM 的接收緩沖區(qū)內(nèi)。Rec_Packet()函數(shù)通過讀取RTL8019AS的當(dāng)前寄存器CURR(寫寄存器)和邊界寄存器BNRY(讀寄存器)的值來確定是否有新數(shù)據(jù)的到來,若有新數(shù)據(jù)到來,則設(shè)置數(shù)據(jù)地址和數(shù)據(jù)長度,然后啟動遠(yuǎn)程DMA 將接收緩沖環(huán)中的以太網(wǎng)幀送交給上層。
2 嵌入式TCP/IPv6 協(xié)議棧的實(shí)現(xiàn)
2.1 嵌入式TCP/IPv6 協(xié)議棧處理流程
如圖1 所示,嵌入式TCP/IPv6 協(xié)議接收數(shù)據(jù)包的過程就是解析數(shù)據(jù)包的過程。首先由底層處理函數(shù)解析數(shù)據(jù)包,根據(jù)類型,將去掉幀首部的數(shù)據(jù)包分配到緩沖區(qū)BUF 中,接著由IP 協(xié)議處理程序繼續(xù)解析。IP 協(xié)議處理程序?qū)?shù)據(jù)包解析后,將數(shù)據(jù)交給TCP 或ICMPv6 協(xié)議處理程序。嵌入式TCP/IPv6 協(xié)議棧發(fā)送數(shù)據(jù)包的過程是封裝數(shù)據(jù)包的過程,數(shù)據(jù)經(jīng)過某層協(xié)議的處理,就會在數(shù)據(jù)包首部增加某種格式的首部。
.
作者:應(yīng)明峰,蔡瑞英 來源:微計(jì)算機(jī)信息