隨著(zhù)計算機網(wǎng)絡(luò )技術(shù)和電子信息技術(shù)的迅猛發(fā)展,Internet的使用越來(lái)越普及,信息家電和智能儀表等能夠接入Iriternet的非PC設備越來(lái)越多,將各類(lèi)電子設備接入Internet的需求也越來(lái)越大。 電子設備接入Internet。有多種解決方案:在51系列單片機上運行經(jīng)過(guò)裁剪的TCP/IP協(xié)議棧;使用一些ASIC實(shí)現TCP/IP的芯片,如Analog Devices推出的Internet Modem;也可使用嵌入式操作系統自帶的TCP/IP協(xié)議棧。在某些對網(wǎng)絡(luò )速度要求不高的領(lǐng)域,可用單片機實(shí)現TCP/IP;在對性能要求高的場(chǎng)合,可選擇后兩種方案。 1 嵌入式TCP/IP的硬件結構 圖1是嵌入式TCP/IP系統的硬件結構。其中CS8900A是Cirrus Logic的網(wǎng)絡(luò )控制器,芯片內部已設置幀過(guò)濾器自動(dòng)拋棄無(wú)效幀,減輕CPU負荷,提高CPU對網(wǎng)絡(luò )的訪(fǎng)問(wèn)效率。CS8900A工作機制主要是通過(guò)設置好其內部各寄存器的值,然后就可以自動(dòng)開(kāi)始工作。在網(wǎng)絡(luò )接口部分,由于是RJ45接口,所以須使用E2023傳輸線(xiàn)變壓器對網(wǎng)絡(luò )中的信號進(jìn)行轉換。 通常TCP/IP協(xié)議棧需要大量的RAM來(lái)存儲需要被應答的TCP包。如果在規定時(shí)間內未被應答,則重發(fā)該TCP包;被應答以后釋放。為了減小RAM的使用量,當數據包需要重新發(fā)送時(shí),如果能夠重新產(chǎn)生數據包所需的數據,則可不存儲需要被應答的TCP包。 因為網(wǎng)絡(luò )中數據非常多,如果把所有的數據都讀到內存中再判斷是否應丟棄幀,則顯然效率不高。所以邊讀取數據邊判斷而沒(méi)有一開(kāi)始就把整個(gè)幀全部讀到內存中。在程序里定義了幀中各部分的相對地址,可以方便地對幀的各字節尋址。這樣的設計是基于提高訪(fǎng)問(wèn)速度考慮的。 在CPU中幀的存放方式,定義PacketRAM變量為存放幀的首地址。圖2給出了CPU中TCP/IP的內存劃分,以及內存中幀的各個(gè)字節的定義和相對位置。 2 嵌入式TCP/IP的優(yōu)化設計 TCP/IP一般采用C語(yǔ)言或混合匯編。使用可重入函數和一般指針(gellerc pointer)使得程序代碼增大,運行速度降低;使用函數指針時(shí),需要手動(dòng)重建調用樹(shù)(calltree),或將函數指針調用的函數設置為可重入函數。 2.1 嵌入式TCP/IP輸入輸出流程 與PC機TCP/IP協(xié)議一樣,嵌入式TCP/IP采用協(xié)議分層的結構:應用層、TCP層、IP層和網(wǎng)絡(luò )設備接口層。圖3描述了輸入和輸出數據包的流程以及需要調用的函數。 輸出時(shí),TCP層先查看unsend隊列,發(fā)現非空,將數據包插入隊列;發(fā)現為空,則查看對方窗口是否夠大(能夠接收這個(gè)數據包)。然后,填寫(xiě)TCP頭部信息。IP層選擇網(wǎng)絡(luò )設備接口,目的IP和該接口的子網(wǎng)掩碼相“與”是否等于子網(wǎng)掩碼,然后調用這個(gè)接口的Output函數來(lái)發(fā)送。 輸入時(shí),Timer()函數調用每個(gè)接口的Input函數。IP層判斷IP版本、IP校驗和,以及是否應轉發(fā)數據包,然后根據IP頭部的protocol字段將包傳給相應的高層處理。TCP層,須判斷TCP校驗和,并在現有的套接字中查找,判斷是否有套接字可接收這個(gè)數據包,判斷TCP序號是否為希望的,然后更新這個(gè)連接的狀態(tài)(包括釋放被應答的數據包和TCP狀態(tài)機的轉化等),調用該套接字的回調函數recv。 2.2 嵌入式TCP/IP的程序結構 Tliner函數功能是調用TCPTimer處理TCP數據包的重發(fā)等功能,調用每個(gè)接口的Input函數接收到達的數據包。Timer函數必須在短時(shí)間(一般為20ms)內被調用一次,否則接收數據包和TCP定時(shí)等功能將停止。 如圖4所示,程序主流程是一個(gè)大循環(huán),在循環(huán)中處理發(fā)送數據包等應用層協(xié)議的同時(shí),查詢(xún)變量bTimeOut,在定時(shí)中斷中將bTimerOut設置為真。應用層在程序流程中反復查詢(xún)bTimerOut是否為真,若為真則調用Timer(),然后設置bTimerOut為假。 在使用嵌入式操作系統時(shí),還要注意網(wǎng)絡(luò )設備驅動(dòng)函數被重入的問(wèn)題。以NE2K的以太網(wǎng)卡為例,拷貝數據包到網(wǎng)卡緩存前要先設置寄存器(如起始地址)。如果設置完寄存器以后中斷發(fā)生且放重入。則寄存器的設置被修改,中斷返回以后拷貝將出錯。 2.3 嵌入式TCP/IP運行速度優(yōu)化 TCP/IP發(fā)送過(guò)程中主要的運算量集中在3部分:應用程序將數據拷貝到RAM;計算TCP校驗和;將RAM中的數據包拷貝到網(wǎng)絡(luò )設備的發(fā)送緩沖區。對于每個(gè)字節數據,兩次拷貝大致共使用12×2=24個(gè)指令周期;計算TCP校驗和使用16個(gè)指令周期。采用12MHz晶振,最高網(wǎng)絡(luò )傳輸速度為25KB/s。 為了提高速度可以采用快速CPU或提高晶振頻率。另外,盡量避免使用Reentrant函數。Reentrant類(lèi)型的函數比一般函數速度要慢很多,但某些時(shí)候為了程序結構的需要必須使用Reentrant,這就需要在速度和結構之間作一個(gè)選擇。選擇的方法有:使用“指定存儲類(lèi)型”的指針(memoryr-specific pointer);精簡(jiǎn)協(xié)議棧去除運算量大但是用處不大的功能,目前TCP定時(shí)重發(fā)時(shí)間是固定的,也沒(méi)有擁塞窗口控制和IP層路由;防止數據包不必要的拷貝;優(yōu)化計算校驗和與內存拷貝函數。 3 TCP/IP的嵌入式實(shí)現 TCP/IP協(xié)議實(shí)現一般以軟件方式嵌人到ROM中,然后通過(guò)網(wǎng)絡(luò )通信技術(shù)與專(zhuān)用嵌入式網(wǎng)關(guān)連接,運行TCP/IP協(xié)議,并提供TCP/IP到用戶(hù)的輕型網(wǎng)絡(luò )的連接和路由功能。 3.1 內存管理方法和無(wú)多余數據包拷貝的實(shí)現 嵌入式TCP/IP的內存管理可用鏈表方法,即根據數據包大小分配相應大小的內存塊。如圖5所示,鏈表將內存塊鏈接起來(lái),used字段表示該內存塊是否正在使用,pStart和pEnd表示數據部分有效數據的開(kāi)始地址和結束地址。 分配時(shí),搜索內存鏈表找到一個(gè)沒(méi)有分配的比所需空間大的內存塊,截取所需的大小。該內存塊被截取以后可能還有較多剩余,這時(shí)將剩余部分從原內存塊中分離出來(lái),成為一個(gè)新的內存塊,并插入鏈表。釋放時(shí),將used置為假。如果pNext或pPre指向的鏈表單元也是空閑的,則將其與自己合并。以防止內存分片。在協(xié)議層之間傳送數據包只要傳送內存塊的起始地址即可。這種內存管理方法空間浪費小,但運算量相對較大。 3.2 整序、重發(fā)與窗口控制的實(shí)現 使用隊列緩存的方式來(lái)實(shí)現整序、重發(fā)和窗口控制。隊列的一個(gè)元素指向一個(gè)數據包,隊列的最大長(cháng)度沒(méi)有限制。 對于整序,使用ooSeq隊列,如果發(fā)現接收的TCP包序號并不是希望的,但序號在接收窗口內,此時(shí)不能立刻接收這個(gè)包也不應丟棄,先將這個(gè)包放入ooSeq隊列。當一個(gè)希望的TCP包被接收以后,再查看ooseq隊列現在是否有TCP包成為了希望的數據包,如果有則將其取出并處理。 對于重發(fā),使用unacked隊列,每個(gè)需要被應答的TCP數據包發(fā)送以后都要放入unacked隊列,直到被應答后才從隊列中刪除。TCP重發(fā)定時(shí)只針對unacked隊列第一個(gè)TCP包。如果定時(shí)超出,則重新發(fā)送;如果重發(fā)次數超出規定值,則報錯。 對于窗口控制,使用unsend隊列,如果發(fā)現對方的窗口過(guò)小無(wú)法接收這個(gè)數據包,則只發(fā)送部分數據,將多余部分放入unsend隊列,等待對方發(fā)來(lái)TCP包通知新的窗口大小時(shí),再次判斷是否可以發(fā)送。在unsend隊列不為空的情況下,須發(fā)送的數據包都應插入unsend隊列。 3.3 捎帶應答的實(shí)現 捎帶應答是指,當對方一個(gè)需要應答的TCP包到達時(shí),不馬上給予應答,而是等待一段較短的時(shí)間。如果在這段時(shí)間內有數據發(fā)送,則會(huì )捎帶給予應答,從而減少了包的發(fā)送數量。 若暫時(shí)沒(méi)有數據須發(fā)給對方或數據還未準備好,則等待一定的時(shí)間;如果在該時(shí)間內準備好了數據,則可使用捎帶應答。使用捎帶應答就不可能對每個(gè)幀都作確認,可用對某個(gè)幀的確認來(lái)代替對該幀之前所有幀的確認。 4 總 結 嵌入式系統中大量存在的是8/16位低速處理器,在進(jìn)行Internet接入時(shí),由于本身資源的限制,很難實(shí)現完整的TCP/IP協(xié)議。本文從既實(shí)現相應的功能又節省系統資源角度出發(fā),對協(xié)議進(jìn)行有針對性的模塊化裁剪和優(yōu)化設計,可以在單片機/ARM上嵌入TCP/IP協(xié)議簇實(shí)現嵌入式Internet接入。 經(jīng)過(guò)優(yōu)化設計的嵌入式TCP/IP,支持套接字形式的多個(gè)TCP連接;支持多個(gè)網(wǎng)絡(luò )設備;支持通過(guò)網(wǎng)關(guān)發(fā)送數據包和數據包轉發(fā)功能,響應ping命令;支持TCP包的整序、重發(fā)和窗口控制流量控制。實(shí)踐證明,這種設計方式靈活,能按用戶(hù)需求實(shí)現很多復雜的功能。 |