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