當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導讀]摘要:結合工程實例,基于S3C4510B微處理器,構建以DM9161為以太網物理層接口的低功耗、高速硬件電路;在嵌入式操作系統uCLinux上實現網絡通信工程的程序編寫,對于網絡通信

摘要:結合工程實例,基于S3C4510B微處理器,構建以DM9161為以太網物理層接口的低功耗、高速硬件電路;在嵌入式操作系統uCLinux上實現網絡通信工程的程序編寫,對于網絡通信工程在嵌入式設備中的應用有很好的借鑒意義。 關鍵詞:uCLinux S3C4510B 網絡通信 DM9161 嵌入式系統 引言 Linux是一種很受歡迎的操作系統,與UNIX系統兼容,開放源代碼。它原本被設計為桌面系統,現在廣泛應用于嵌入式設備。uCLinux正是在這種氛圍下產生的。在uCLinux這個英文單詞中,u表示Micro,是“小”的意思;C表示Control,是“控制”的意思,所以uCLinux就是 Micro-Control-Linux,字面上的理解就是“針對微控制領域而設計的Linux系統”。它也是針對無MMU(內存管理單元模塊)的微處理器設計的操作系統。S3C4510B就是屬于該類的微處理器。 Samsung公司的S3C4510B是基于以太網應用系統高性價比16/32位RISC微控制器,內含一個由ARM公司設計16/32位ARM7TDMI RISC處理器核。ARM7TDMI為低功耗、高性能的16/32核,最適合用于對價格及功耗敏感的應用場合。除了ARM7TDMI核以外,S3C4510B還有許多重要的片內外圍功能模塊,其中就有1個以太網控制器,用于S3C4510B系統與其它設備的網絡通信工程。在S3C4510B的網絡控制平臺上移植了uCLinux操作系統,并在這個嵌入式平臺上實現網絡控制的各項功能。本文的敘述的網絡通信工程就是其中最主要的功能。 1 基于S3C4510B以太網電路的設計思路與實現 作為一款優(yōu)秀的網絡控制器,基于S3C4510B的系統若沒有以太網接口,其應用價值就會大打折扣,因此,就整個系統而言,以太網接口電路應是必不可少的,但同時也是相對較復雜的。從硬件的角度看,以太網接口電路主要由MAC控制器和物理層接口(Physical Layer,PHY)兩大部分構成。

S3C4510B內嵌一個以太網控制器,支持媒體獨立接口(Media Independent Interface,MII)和帶緩沖DMA接口(Buffered DMA Interface,BDI),可在半雙工或全雙工模式下提供情報0M/100Mbps的以太網接入。在半雙工模式下,控制器支持CSMA/CD協議,在全雙工模式下支持IEEE802.3MAC控制層協議。因此,S3C4510B內部實際上已包含了以太網MAC控制,但并未提供物理層接口,故需外接一片物理層芯片,以提供以太網的接入通道。 常用的單口10M/100Mbps高速以太網物理層接口器件主要有RTL8201、DM9161等,均提供MII接口和傳統7線制網絡接口,可方便地與S3C4510B接口。以太網物理層接口器件主要功能一般包括:物理編碼子層、物理媒體附件、雙絞線物理媒體子層、10BASE-TX編碼/解碼器和雙絞線媒體訪問單元等。 在該設計中,使用DP9161作為以太網的物理層接口。DM9161是一款低功耗、高性能的CMOS芯片,支持10M和100M的以太網傳輸,它起編碼、譯碼輸入和輸出數據的作用。它與S3C4510B的引腳連線如圖圖1所示。 由于S3C4510B片內已民用有帶MII接口的MAC控制器,而DM9161也提供了MII接口,各種信號的定義也很明確,因此DM9161與 S3C4510B的連接時序銜接,可以達到很好的網絡信號傳遞的目的。圖2為DM9161在本系統中的實際應用電路(圖中右下方的1、2、3以及14、 15、16分別與網絡隔離變壓器相應引腳相連)。 S3C4510B的MAC控制器可通過MDC/MDIO管理接口控制多達斡爾1個DM9161,每個DM9161應有不同的PHY地址(可從 00001B~11111B)。當系統復位時,DM9161鎖存引腳9、10、12、13、15的初始狀態(tài)作為與S3C4510B管理接口通信工程的 PHY地址;但該地址不能設為00000B,否則DM9161進入掉電模式。 信號的發(fā)送和接收端應通過網絡隔離變壓器和RJ45接口接入傳輸媒體,實際應用電路如圖書室所示。 圖2 2 Linux下的網絡編程協議分析 Linux下的TCP/IP網絡協議棧的各層之間是通過一系列互相連接層的軟件來實現Internet地址族的,結構層次如圖4所示。 其中BSD socket層由專門用來處理BSD socket的通用套接字管理軟件來處理,它由INET socket層來支持。INET socket為基于IP的協議TCP和UDP管理傳輸端點。UDP(用戶數據報協議)是一個無連接協議,而TCP(傳輸控制協議)是一個可靠的端對端協議。傳輸UDP包的時候,Linux不知道也不關心它們是否安全到達了目的地。TCP則不同。在TCP連接的兩端都需要加上一個編號,以保證傳輸的數據被正確接收。在IP層,實現了Internet協議代碼,這些代碼要給傳輸的數據加上一個IP頭,并且知道如何把傳入的IP包送給TCP或者UDP協議。在 IP層以下,就是網絡設備來支持所有的Linux網絡工作,如PLIP、SLIP和以太網。 3 uClinux環(huán)境下的socket編程 網絡的socket數據b傳輸是一種特殊的I/O,socket也是一種文件描述符,也具有一個類似文件的函數調用socket()。該函數返回一個整型的socket描述符,隨后的連接建立、數據傳輸等操作都是通過該socket函數實現的。常用的socket類型有兩種:流式socket和數據報式 socket。兩者的區(qū)別在于:前者對應于TCP服務,后者對應于UDP服務。 3.1 uCLinux中socket編程中用到的函數 (1) socket函數 為了執(zhí)行I/O,一個進程必須做的第一件事情就是調用socket函數,指定期望的通信協議類型(使用IPv4的TCP、使用IPv6的UDP、Unix 域字節(jié)流協議等),其函數結構如下:int socket(int family,int type,int protocol); /*返回:非負描述字—成功,-1—出錯*/ 代碼中的family指明協議族。套接口的類型type是某個常值。一般來說,函數socket的參數protocol主設置為0,socket函數成功時返回一個小的非負整數值。為了得到這個數值,我們指定協議族(IPv4IP、v6或Unix)和套接口類型(字節(jié)流、數據報或原始套接口)。

(2)connect函數 TCP客戶用connect函數來建立一個與TCP服務器的連接。 Int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);/*返回:0—成功,-1—出錯*/ Sockfd由socket函數返回數值,第二、第三個參數分別是一個批晌套接口地址結構的指針和該結構的大小。套接口葉址結構必須含有服務器的IP地址和端口號。 (3)bind函數 函數bind給套接口分配一個本地協議地址。對于網際協議,協議地址是非顛倒2位IPv4地址16位的TCP或UDP端口號的組合。 Int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen);/*返回:0—成功,-1—出錯*/ 第二個參數量個指向特定于協議地址結構的指針,第三個參數是該地址結構的長度。對于TCP,調用函數bind可以指定一個端口,指定一個IP地址。可以兩者都指定,也可以一個也不指定。 (4)listen函數 函數listen僅被除數TCP服務器調用。它做兩件事件事情,當函數socket創(chuàng)建一個套接口時,被假設為一個主動套接口。也就是說,它是一個將調用 connect發(fā)起連接的客戶套接口,函數listen將未連接的套接口轉換成被動套接口,指示內核應接受指向此套接口的連接請求。根據TCP狀態(tài)轉換調用函數listen導致套接口從CLOSED狀態(tài)轉換到LISEN狀態(tài)。函數的第二個參數規(guī)定了內核為此套接口排隊的最大連接個數。 Int listen(int sockfd,int backlog); /*返回:0—成功,-1—出錯*/ 一般來說,此函數應在調用函數socket和bind之后,調用函數accept之前調用。 (5)accept函數 accept函數由TCP服務器調用,從已完成連接隊列頭返回下一個已完成連接。若已完成連接隊列為空,則進程睡眠。(假定套接口噗缺省的阻塞方式) int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);/*返回非負數值—OK,-1—出錯*/ 參數cliaddr和addrlen用來返回連接對方進程(客戶)的協議地址。Addrlen是結果參數,調用前,將由*addrlen所指示的整數值置為由cliaddr所旨的套接口地址結構的長度,返回時,此整數值即為由內核存在此套接口地址結構內的準確字節(jié)數。

3.2 uClinux中網絡通信編程的實現 在uCLinux中進行socket編程,一般按照圖書資料所示流程編寫網絡應用程序。 除了熟悉前文提出的函數外,還應知道兩個重要的數據結構。因為在計算機中,數據存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。在互聯網上,數據是以高位字節(jié)優(yōu)先順序傳輸的,所以對于在內部以低位字節(jié)優(yōu)先方式存儲的數據,需要進行轉換才能在互聯網上傳輸。 *struct sockaddr:用來保存socket信息 struct sockaddr{unsigned short sa_family;/*地址族,AF_xxx*/ char sa_data[14]; /*14字節(jié)的協議地址*/}; *struct sockaddr_in;和來進行數據類型的轉換 struct sockaddr_in{ short int sin_family; /*地址族*/ unsigned short int sin_port; /*端口號*/ sruct in_addr sin_addr; /*IP地址*/ unsigned cha sin_zero[8]; /*填充0,以保持與struct sockaddr同樣大小*/}; 至此,可經編出uCLinux的網絡通信工程程序。在此給出部分uCLinux下實現網絡通信源代碼及其Makefile文件的編寫實例。 main()函數中部分代碼如下: int sockfd; unsigned int uiip; char szsendbuf[1024]; char head[8]; int*phead=head+4,nsize=1024,allsize=0; struct sockaddr_in servaddr; sockfd=socket(AF_INET,SOCK_STREAM,0);/*創(chuàng)建socket*/ bzero(%26;amp;servaddr,sizeof(struct sockaddr_in)); servaddr.sin_family=AF_INET; servaddr.sin_port=8888;//htons(8888); /*指定通信端口*/將命令行輸入的字符串IP轉換為connect函數可識別的整數uiip。本來在Linux上開發(fā)時可以使用C庫函數 inet_pton(),但在uCLinux的庫中不支持該函數,因此只好自己實現該函數的功能。 aiptoi()如下所示: aiptoi(argv[1],%26;amp;uiip); servaddr.sin_addr.s_addr=uiip; /*指定連接的對端IP*/ connect(sockfd,(struct sockaddr)%26;amp;servaddr,sizeof(struct sockaddr)); /*連接對端接收代碼*/ fp=fopen("kongzhi.htm","r"); /*打開控制頁面*/ while(nsize==1024) {bzero(szsendbuf,1024); /*每次從文件中讀取巧024個字節(jié)發(fā)送出去,若讀出少于1024字節(jié)結束*/ nsize=phead=fread(szsendbuf,1,1024,fp);/*從文件中讀取并填入發(fā)送BUFFER中*/ write(sockfd,head,8);/*發(fā)送協議頭*/

nsize=write(sockfd,szsendbuf,nsize);/*發(fā)送*/} fclose(fp); uCLinux中的Makefile需做的修改如下: CC=gcc COFF2FLAT=/uclinux/coff2flt-0.3/coff2flt CFLAGS=-I/uclinux/uC-libc-pic/include LDFLAGS=/uclinux/uC-libc-pic/libc.a ethernet:Ethernet.o $(CC)-o $@.coff ethernet.c $(CFLAGS)$(LDFLAGS) $(COFF2FLAT)-o Ethernet ethernet.coff cp Ethernet /Ethernet clean: rm -f Ethernet Ethernet.o 需要注意的是:①uCLinux中不帶有pthread庫,在編寫網絡程序要切記;②在uCLinux環(huán)境下,處理器(硬件)和內核黃素(軟件)均不提供內存管理機制,所以程序的地址空間等同于內存的物理地址空間。在程序中可直接對I/O地址進行操作,而不需要申請和釋放I/O空間,但需要用戶自己來檢查所操作的I/O地址的占用情況。 結語 由于網絡通信工程廣泛應用在嵌入式設備中,以往的文章只是泛泛地敘述網絡通信設計的某一個方面。本文結合實際工程項目,從硬件電路的搭建、應用軟件的設計要點。這對于在嵌入式設備中,特別是基于uCLinux的系統中應用網絡通信有重要的參考意義。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉