久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機的TCP/IP的實現與UNIX的不同

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年01月01日   【字體:

TCP/IP最先是在UNIX系統里實現的,后來的LINUX、DOS、WINDOWS也實現了TCP/IP,隨后TCP/IP協議也被移植到其它嵌入式的處理器上,例如8位的MCS51單片機、AVR單片機,16位的ARM、C166以及32位的MIPS、ARM等芯片上。 TCP/IP協議的最底層IP層,很多定義都是16位或32位的,例如源IP地址(32位)目的IP地址(32位),校驗值(16位),特別是較驗值,是以16位為單位進行計算的,這樣使得能夠處理16位、32位運算的CPU,比如80286、80386……,ARM、MIPS、DSP,就有很大的速度上的優勢。而8位機MCS51處理則會慢很多。
  由于指令的原因,以及資源上的原因,在UNIX上實現的TCP/IP協議的原代碼并不能夠直接移植到8位的單片機上。最早期的LINUX1.0版的內核是最小的實現TCP/IP的操作系統,它的程序的大小大概在1兆字節。而現在的紅旗LINUX,紅帽子LINUX,內核多達幾十兆,整個系統要幾張光盤來裝。早期的LINIX因為小,而被移植到掌上電腦,PDA等產品中。 單片機的程序空間是極為有限的,直接尋址的空間僅64K字節,這跟電腦的存儲空間相比要差幾個數量級。除了程序空間小之外,可用的內存RAM也是非常小的,最多只能擴64K的RAM,而電腦的RAM至少在1兆以上。單片機的運算速度也極為有限,一般只有2MIPS,而電腦上的處理能力在100MIPS以上。
  有些人提到有沒有必要在單片機上實現TCP/IP的問題。因為TCP/IP是一種標準,以太網也成為局域網的標準。在很多情況下運用以太網和TCP/IP,能夠簡化結構。比如目前較熱的智能小區,因為布線的原因,不能為每個家庭布很多線,而以太網的8芯雙絞是一定有的。例如寬帶上網,是直接通過以太網的,如果你制造的設備,比如安全產品,遠程抄表產品,家居智能產品能夠走以太網的話,可以利用現成的以太網絡。但如果走其它網絡,比如RS485、CAN單線、LONWORKS等,那么需要另外布線。布線是復雜的,還涉及到消防安全等。從成本看,用以太網實現聯網要比CAN、LONWORKS等更為便宜,集線器、交換機現在都非常便宜,而且將來有三網合一的趨勢,電話、電視、計算機三網合一。將來的趨勢可能是高速的以太網的天下,電話信號、電視信號、聯網都在以太網上跑。盡管目前還未能實現,但是這種趨勢是不可避免的。
   有網友提到就算要利用以太網,也沒有必要跑TCP/IP。那么為什么要跑TCP/IP呢? TCP/IP是一標準,這個標準使得數據傳輸不一定是要局域網,而可以在互聯網、跨地區跨國界。例如你在某一區域安裝了很多監控產品,但數據中心可能不設在那個區域,而設在其他地區。TCP/IP有兩種協議TCP和UDP;TCP保證了數據傳輸的正確性,(如果你的數據只跑以及網層,那么你的數據完整性是要你的編程來保證的,校驗的計算。數據包的丟失需要你手工處理,而TCP把這些所有你要處理細節都幫你處理了。UDP可以面向廣播的、視頻的、音頻的等方面的應用。實現TCP/IP的協議的好處是可以統一平臺,比如智能小區的產品,如果大家都遵守TCP/IP的協議,那么大家的產品才能兼容,假設一個大型的智能社區,這個社區可能由多家設備供應商進行建設,可能有某些廠商做平臺、做軟件,一些廠商做硬件。如果大家遵守TCP/IP協議,各自的遠程抄表產品,智能防盜產品就有可能兼容,對地產開發商來說,可以選擇多個供應商,有利于競爭,也避免某個廠家倒閉造成重大影響。
   題外話說的多了,還是回到本章要談的內容吧。由于單片機與電腦的差別很大,兩者的實現有很大的不同。在電腦里編寫TCP/IP程序,你可以不考慮代碼大小、代碼速度,但在單片機上這些都是你要考慮的問題。 綜合來說,單片機實現與UNIX實現TCP/IP有如下區別:   (1)、操作系統。不論是WINDOWS、UNIX、LINUX,它們都有一個多任務操作系統,這使得代碼編寫簡單化,而在單片機上,因為資源的原因而無法使用多任務操作系統,這使得代碼結構變為順序執行+硬件中斷的方式,而在電腦里卻可以并發地執行。對程序執行結構,單片機要考慮更多。
   (2)、內存分配。WINDOWS或UNIX的內存分配是動態的,根據需要隨時分配,隨時撤消 。我們閱讀一些關于LINUX、UNIX的書,它們都是mbuf的存儲結構。mbuf是一個存儲鏈,這個鏈可以動態地增加和減小。比如在數據包很少的情況下,UNIX分配一個2K字節的緩沖區可能就夠用了,但如果數據包很多,就有可能要分配64K甚至更多的緩沖區,可分配的內存要根據CPU的可用內存來調整。 但是在單片機卻不能夠這樣做。一個最大的以太網數據包有1500多個字節,分配一包的緩沖區就要1.5K字節,而一般實現TCP/IP的單片機只外接一塊32K字節的RAM。而這32K字節的RAM要被各個協議所用,而不僅僅是存放收到的數據包。一般的做法是分配一個256×6=1536個字節的RAM來存放收到的以太網數據包。收到一包就處理一包。而UNIX卻可以收很多包才處理。在單片機里,存放收到的以太網數據包的RAM是固定的,而不是動態分配的。所有UNIX關于內存管理、內存分配、mbuf的結構在單片機里并不適用。這些代碼對單片機是無用的。
   (3)、指針。在電腦里,指針只有一種,就是指向某一地址的RAM,而在單片機里指針有幾種:
   1、 指向外部RAM的指針 例uchar xdata *p 使用指令 movx @dptr 占二個字節
   2、 指向程序ROM的指針 例uchar code *p 使用指令 movc 占二個字節
   3、 指向內部的RAM的指針 例uchar data *p 使用指令 mov @ri 占一個字節
   4、 指向外部RAM的分頁指針 例uchar pdata *p 使用指令 movx @ri 占一個字節
   5、 一般指針,可以指向以上的任何一種 占三個字節
   6. 還有其它用于分組切換的指針。
  在電腦里,所有程序都必須先放在RAM里才能運行,所以它的指針只有一種情況,就是指向RAM。而單片機的結構和電腦的結構有很大差別,指針類型很多,對指針運算的速度也不一樣,由于第5種指針"一般指針"運算很慢,同時又需要占用很多程序空間,這使得指針運算不能從UNIX源代碼直接移植到單片機上,而UNIX實現TCP/IP的源代碼中,用的最多的就是指針,而在單片機里一般要求少用指針,或使用特定類型的指針。這使用UNIX的源代碼需要作很多的改動。
  (4)、參數傳遞。在UNIX實現的TCP/IP源代碼中,一般有很多的參數傳遞,而在單片機里允許傳遞的參數是有限的(因為受到內部RAM的限制),同時參數傳遞的過程要浪費程序代碼空間,也降低單片機執行速度。所以在單片機的實現里,一般不要做太多的參數傳遞,而多使用公共的全局變量來實現調用的過程。這種情況下,UNIX的一般源程序是相對獨立的,受其它函數或變量的影響很小,而單片機里各程序的相互依賴程度要大。因為在單片機里往往共享某一數據、某一變量。
  (5)變量定義。UNIX和KEIL C51雖然都是C語言,但兩者又有所不同,對于一些變量的定義,兩者卻不能通用。例如,單片機的特殊寄存器定義,sfr sfr16 sbit等,在標準C里是沒有的。在標準C里支持的結構,在KEIL C里也有可能不支持,比如一些C++的語法。在處理上的特殊性,也可能不一樣,比如IP地址類型,在UNIX里一般將IP地址定義為數組:
uchar ip[4]; 而在單片機里,我的定義是
union IP_address_type{uchar bytes[4];
uint words[2];
ulong dwords;}
IP 被定義為共用體,而不是簡單的一個數組。為什么要這樣做,是因為單片機處理的特殊性,例如比較兩個IP地址IP1,IP2是否相等,如果使用數組,比較是麻煩的: 要寫成 if(IP1[0]==IP2[1])**IP1[1]=IP2[1]**…… 用共用體可以簡化為
if(IP1.dwords==IP2.dwords)…… 有時候,我們又要把IP地址按16位來計算,比如較驗和計算,那么IP地址按16位加可以寫成: IP.dwords[0]+ IP.dwords[1], 有時,我們又要對IP地址按字節賦值,比如IP地址從24C02里讀出來,需要按字節賦值:可以為 IP.bytes[0]=×× IP.bytes[1]=×× IP.bytes[2]=×× IP.bytes[3]=××
如果不作這樣的定義,運算將復雜很多。而且一些編譯會認為類型混亂而無法編譯。 在單片機里使用共用體會簡化很多。而在UNIX里要對這些值作改變,一般是利用指針進行的。在電腦里,用指針運算是方便的,而且速度也快,但在單片機里,卻不能夠方便地使用指針。 在UNIX里的一些結構類型的定義都要被改寫。這樣也使得UNIX的源代碼不能直接用在單片機上。
   (6)、協議支持。在UNIX里可支持比較完整的TCP/IP協議,但在單片機里無法做到,這是因為單片機根本沒有足夠的代碼空間來支持這些協議。一般在單片機里實現與需要有關的部分,而不使用的協議則一概不支持。例如文件共享SMB協議,在UNIX、WINDOWS都支持,但單片機上卻沒有必要。一般只能在單片機中實現:ARP、IP,ICMP、TCP、UDP這些協議,而更高層的協議,http、smtp、ftp一般是不需要支持的。雖然有些單片機例如AVR上網方案實現了http、smtp、ftp協議,但我們認為實用性不太,因為AVR上網方案用的是MEGA103,而該芯片要150元左右,高昂的造價使得AVR上網方案沒有得到廣泛的應用。單片機應用的TCP/IP協議大多是為了完成數據采集和數據傳輸,而不是網頁瀏覽、文件傳輸這些功能。就對某一協議而言,例如ARP協議,UNIX系統支持以太網、令牌環等網絡的ARP,但單片機里只支持以太網,也就是說,對于某一協議,也有可能要作簡化。IP包最大可以為65K,可以分段傳輸,而在單片機里根本無法容納如此大的數據包,因此一般是不支持分段的。單片機一般采用發送小數據包的方式,以避免分段。
   (7)、硬件接口。在UNIX或WINDOWS里,對網卡驅動無一例外都是采用中斷方式。而在單片機的應用中,大部份的方案都是查詢式的。因為電腦的處理速度快,一次中斷的處理時間也很短,不會影響系統內的其它中斷。但在單片機里就不行了,處理一次中斷,收取一個數據包一般要幾毫秒的時間,這將封鎖其它中斷的產生(只有高優先級的中斷可以執行),而單片機往往還存在其它一些中斷,比如串口按收中斷,A/D條件中斷、鍵盤中斷等需要被執行,這就使得消耗時間長的網卡中斷改為查詢式執行。在電腦里,對網卡的驅動相對簡單,而在單片機里需要處理的事情更多。比如緩沖區溢出,閱讀一些驅動程序源代碼,你可能發現在電腦里的一些程序根本沒有處理溢出的代碼。因為電腦執行快,網卡緩沖區的溢出幾乎是不會發生的,不要說10M網卡,就是100M網卡,電腦也能夠很快處理。電腦往往采用即插即用方式來驅動網卡,而單片機卻不能這樣做,因為即插即用要很多代碼來實現,而使用跳線方式,電腦里驅動NE2000的網卡,一般都是用16位DMA的方式,而在單片機里卻只能用8位DMA方式。這也使用UNIX對網卡驅動的代碼不能直接移植。

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲一区二区在线播放 | 亚洲在线成人 | 超碰人人91 | 亚洲精品乱码久久久久久按摩观 | 视频一区二区中文字幕 | 亚洲精品在线看 | www.日日夜夜 | 成人欧美一区二区三区黑人孕妇 | 国偷自产av一区二区三区 | 日韩一级 | 亚洲一区久久 | 欧美精品福利 | 国产亚洲精品精品国产亚洲综合 | www.天天操.com | 久久噜噜噜精品国产亚洲综合 | 男女网站免费 | 久久久久国产精品一区二区 | 国产在线a视频 | 国产精品亚洲精品 | 黄色国产| 最新中文字幕在线 | 97伦理影院| 国产乱码精品一区二区三区五月婷 | av在线一区二区三区 | 久久久久久国模大尺度人体 | 日本成人中文字幕 | 国产91av视频在线观看 | 色成人免费网站 | 天天操天天摸天天干 | 91资源在线 | 国产日韩精品一区 | 伊人春色在线观看 | 亚洲区一区二 | 天天干成人网 | 麻豆av网| 亚洲二区视频 | 国产线视频精品免费观看视频 | 日韩在线视频播放 | 久久国产精品久久久久久久久久 | 成人精品一区 | 亚洲福利一区 |