TCP/IP協(xié)議棧在嵌入式芯片上的實現(xiàn)
摘 要:本文介紹了一種在Atmega128芯片上嵌入TCP/IP協(xié)議棧的實現(xiàn)方法,整個協(xié)議棧采用模塊化設計,結構簡單,可以很方便的移植到不同芯片上。
關鍵詞:TCP/IP;嵌入式系統(tǒng);8019AS;Atmega128
引言
對于嵌入式系統(tǒng)而言,考慮到TCP/IP協(xié)議的復雜性以及嵌入式系統(tǒng)自身資源的有限,對TCP/IP的實現(xiàn)并不是一件容易的事情。在一些特殊場合,比如要求實時性或者數(shù)據(jù)的安全性,實現(xiàn)TCP/IP協(xié)議時還需要特別加以考慮。下面以ATMEL公司的mega128芯片為硬件平臺,具體談談TCP/IP協(xié)議的實現(xiàn)。
ATmega128芯片的特點
Atmega128是ATMEL公司推出的一款基于AVR RISC結構的低功耗、高性能的8位微控制器芯片。通過在一個時鐘周期內執(zhí)行一條指令,Atmega128可以取得1MIPS/MHz的性能。此外,該芯片還具有比較豐富的片上資源。而最大可外擴的64K數(shù)據(jù)存儲器可以使得有充裕的空間來處理以太數(shù)據(jù)包。
本方案只外擴32K RAM,剩余的高地址空間留給網卡芯片。網卡芯片主要功能是在物理層進行以太數(shù)據(jù)包的收發(fā),以及在鏈路層進行信號的編/解碼。本方案網卡芯片選用RTL8019AS,它是針對PC機的ISA總線設計的。硬件接口電路圖詳見圖1所示。
硬件接口電路設計
在圖1中,數(shù)據(jù)線與地址線均采用總線方式:8位數(shù)據(jù)線和16位地址線。PA口8位端口為復用AD端口,需要接一個地址鎖存器。讀數(shù)據(jù)時,D[0:7]數(shù)據(jù)直接送到Atmega128;寫數(shù)據(jù)時,D[0:7]送到RTL8019AS。Atmega128與RTL8019AS同時復位,RESET端口經74HC04反相后接RTL8019AS的RSTDRV引腳。IOCS16腳的電平一直為低。8019采用8位數(shù)據(jù)總線寬度(高電平時為16位總線方式)。INT0中斷腳經電平轉換接到Atmega128的IRQ5。在程序中,以I/O方式訪問RTL8019AS。MEMR、MEMW接高電平時關閉其MEMORY方式。
Atmega128對8019AS的驅動主要是通過操縱8019AS內部寄存器來完成的,這些寄存器映射在Atmega128的I/O端口上。因此,對8019AS的操作也既是對Atmega128的I/O端口操作。設計時可以將這些I/O地址定位到300H~31FH。由于Atmega128外擴了32K的RAM,所以這里存在片選的問題??紤]到網卡芯片8019AS地址線的高15位是固定不變的,可以利用Atmega128的地址線的最高位A15來進行片選:當A15=1時,選中8019AS;當A15=0時,選中24C256。
8019AS網絡接口控制器提供了三種與系統(tǒng)主CPU的接口方式:跳線方式、PnP方式,以及RT方式。為了減少硬件資源,更直接地控制芯片,將8019AS的65腳“JP”接高電平,選擇跳線方式。
軟件模塊的設計
網卡芯片8019AS的驅動
在具體設計實現(xiàn)TCP/IP協(xié)議棧之前,還要解決一個問題:對8019AS的驅動。從程序員的角度看,8019AS工作流程并不復雜。簡而言之就是8019AS完成數(shù)據(jù)包和電信號之間的相互轉換,以太網協(xié)議由芯片硬件自動完成。因此,驅動程序需要完成的任務主要是:芯片初始化、收包、發(fā)包。本方案在協(xié)議棧中通過設計三個子函數(shù)來分別完成上述三個任務,8019Init (void)、8019SendProc (unsigned char TaskNo)、8019 ReceiveProc(void)。
如前所述,對8019AS的操作實際上是通過操縱其內部寄存器以及DMA端口來實現(xiàn)的。因此在程序實現(xiàn)中,大量地出現(xiàn)了對8019AS內部寄存器的讀寫操作。所以可以定義2個帶參數(shù)的宏來簡化對8019AS的操作。reg表示8019AS內部寄存器的偏移量,date是將被寫入的數(shù)據(jù),如下所示:
#define nic_read (reg) *(base + (reg) )
#define nic_write (reg, date) *(base + (reg)) = date
TCP/IP協(xié)議棧的實現(xiàn)
TCP/IP協(xié)議族是一組不同層次上的多個協(xié)議的組合。根據(jù)協(xié)議的層次結構,本方案安排四個協(xié)議模塊來分別實現(xiàn)TCP/IP協(xié)議的不同功能。即除了數(shù)據(jù)鏈路層(物理層)的程序模塊,也即前面所述8019AS的驅動模塊之外,還包括ARP層模塊、IP層模塊、ICMP層模塊以及TCP層模塊。當然,還可以多增加一個應用層的模塊,例如HTTP模塊。下面逐一介紹各個協(xié)議模塊的功能。
ARP模塊
ARP模塊完成的主要功能是將一個IP地址與其物理地址關聯(lián)起來。同時,為了提高網絡傳輸速度和效率,避免在每次發(fā)送數(shù)據(jù)時都要發(fā)送ARP請求包來獲得目的MAC地址,還要維護一個常用的ARP高速緩存。這些功能可以由兩個函數(shù)來實現(xiàn)。ARPReceive Proc用于處理來自網絡的ARP請求和ARP響應;ARPSendProc用于發(fā)送ARP請求包來尋找對應于IP地址的物理地址。
IP模塊
IP協(xié)議的主要功能是使數(shù)據(jù)包可以分片發(fā)往任何網絡,而且也能正確接收。分別由兩個函數(shù)完成。IPReceiveProc負責處理收到的IP數(shù)據(jù)包,如果是一個分片的包,它還負責組裝,最后根據(jù)IP包頭字段的內容,將IP數(shù)據(jù)傳遞到上層協(xié)議模塊;IPSendProc負責將上層送下來的、需要發(fā)送的數(shù)據(jù)包添加一個IP包頭,然后重新封裝起來發(fā)送下去。
ICMP模塊
由于IP協(xié)議沒有差錯報告和差錯糾正機制,ICMP協(xié)議與IP協(xié)議配合使用彌補了上述兩個缺點。為了使實現(xiàn)的TCP/IP協(xié)議棧具備一定的差錯診斷功能,ICMP模塊實現(xiàn)了對回送請求消息產生一個回送應答。通過調用Ping命令就可以簡單測試主機的可靠性。上述功能分別由ICMPReceiveProc和ICMPSendProc函數(shù)完成。
TCP模塊
在本設計的協(xié)議棧中,通過一個有限狀態(tài)機來實現(xiàn)TCP協(xié)議,用一個任務控制塊(TCB)來記錄客戶和服務器的連接信息。雖然TCP協(xié)議是整個協(xié)議棧中最復雜的一個協(xié)議,但是對外面的接口還是只有兩個:TCPReceiveProc和TCPSendProc函數(shù)。
TCP/IP協(xié)議棧的任務調度
通過對以上各層協(xié)議任務的分析,可以抽象出它們共同的特點。TCP/IP協(xié)議的每個模塊只完成相應協(xié)議的任務,而任務通常只有兩個:對底層送上來的數(shù)據(jù)包進行處理,以及將上層傳下來的數(shù)據(jù)包再進行本層的封裝,然后繼續(xù)交下去。所以無論ARP、IP、ICMP、TCP哪一個協(xié)議,它們每一層對外都只有兩個接口:收數(shù)據(jù)包、發(fā)數(shù)據(jù)包。
為了最大限度的模塊化程序設計,便于日后的移植,可以采用面向對象的程序設計思路來具體實現(xiàn)TCP/IP協(xié)議??紤]到支持多用戶以及多任務,首先在Atmega128的外部32K RAM內開辟若干個數(shù)據(jù)(任務)緩沖區(qū),緩沖區(qū)的大小以能放入一個最大以太數(shù)據(jù)包為準,即1514個字節(jié)。以后需要處理的所有數(shù)據(jù)包都放在這些緩沖區(qū)內,各個緩沖區(qū)根據(jù)內部存入的不同類型數(shù)據(jù)包來設置緩沖區(qū)的標志。上面各協(xié)議層接口函數(shù)內的參數(shù)TaskNo就表示當前數(shù)據(jù)包所在的緩沖區(qū)號。
整個程序的處理流程如下:收數(shù)據(jù)時,8019AS不斷將以太數(shù)據(jù)包從物理層收上來放入事先開辟好的任一個緩沖區(qū)內,作為一個待處理的任務,并根據(jù)數(shù)據(jù)包的包頭信息標志此任務為ARP收任務或IP收任務。主程序掃描各個緩沖區(qū),如發(fā)現(xiàn)有IP收數(shù)據(jù)包(任務)需要處理,于是根據(jù)任務的類型(IP收)調用相應處理進程IPReceiveProc()。處理完成后,將此數(shù)據(jù)包或任務根據(jù)包頭信息重新標志為ICMP收或TCP收。主程序繼續(xù)掃描,再次調用相應協(xié)議模塊處理緩沖區(qū)內的任務如TCPReceiveProc(),直至將數(shù)據(jù)交到最上層的應用程序。發(fā)數(shù)據(jù)時,流程與收數(shù)據(jù)過程相反。關于任務調度的程序流程見框圖2。
由于整個協(xié)議棧采用了模塊化的設計,在具體使用的時候可以根據(jù)需要,很容易地加載相應的模塊,完成相應的功能。比如可以按照同樣的結構,再加載HTTP模塊,在芯片內實現(xiàn)WEB SERVER。同樣,在一些要求實時性的場合,由于發(fā)送的數(shù)據(jù)包是作為一個任務來管理的,因此可以很容易地給這些數(shù)據(jù)包(或任務)賦予一個較高的優(yōu)先級,在進行任務調度時,優(yōu)先處理這些任務。這樣,在多用戶情況下,對實時性也可以有一定改善。
結語
實現(xiàn)電子設備或者系統(tǒng)的網絡化,使之具備網絡功能,目前的解決方案通常有兩種。除了直接在系統(tǒng)內部實現(xiàn)TCP/IP協(xié)議之外,還可以考慮使用專用芯片來完成單片機與網關間的協(xié)議轉換。比如武漢力源公司開發(fā)的Webchip網絡接口芯片PS-2000。但是專用芯片的使用,不但增加了系統(tǒng)的成本,而且不靈活。當然,如果在系統(tǒng)內部直接實現(xiàn)TCP/IP協(xié)議,也有自身的缺點。一是需要較大容量的程序存儲器。二是對應用系統(tǒng)的設計工程師也具有更高的要求,如必須熟悉TCP/IP協(xié)議及其相關的接口。且軟件設計的工作量也較大。所以在實際應用中,具體選擇哪一種方案還需要根據(jù)具體情況做出不同的選擇?!?/p>
參考文獻
1 謝希仁譯. Behrouz A. Forouzan & Sophia Chung Fegan. TCP/IP Protocol Suite, 清華大學出版社,2001.9
2 AVR: Atmega128 DATA SHEET. Atmel Corporation, 2000
3 方捷磊,朱杰.在嵌入式網絡應用中實現(xiàn)TCP/IP協(xié)議.微電子學與計算機. 2002.5
tcp/ip相關文章:tcp/ip是什么
評論