<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于uCLinux和S3C4510B的網(wǎng)絡(luò )通信設計

基于uCLinux和S3C4510B的網(wǎng)絡(luò )通信設計

作者: 時(shí)間:2004-12-11 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:結合工程實(shí)例,微處理器,構建以DM9161為以太網(wǎng)物理層接口的低功耗、高速硬件電路;在嵌入式操作系統上實(shí)現工程的程序編寫(xiě),對于工程在嵌入式設備中的應用有很好的借鑒意義。

關(guān)鍵詞: DM9161 嵌入式系統

引言

Linux是一種很受歡迎的操作系統,與UNIX系統兼容,開(kāi)放源代碼。它原本被為桌面系統,現在廣泛應用于嵌入式設備。正是在這種氛圍下產(chǎn)生的。在uCLinux這個(gè)英文單詞中,u表示Micro,是“小”的意思;C表示Control,是“控制”的意思,所以uCLinux就是Micro-Control-Linux,字面上的理解就是“針對微控制領(lǐng)域而的Linux系統”。它也是針對無(wú)MMU(內存管理單元模塊)的微處理器的操作系統。就是屬于該類(lèi)的微處理器。

Samsung公司的S3C4510B是以太網(wǎng)應用系統高性?xún)r(jià)比16/32位RISC微控制器,內含一個(gè)由ARM公司設計16/32位ARM7TDMI RISC處理器核。ARM7TDMI為低功耗、高性能的16/32核,最適合用于對價(jià)格及功耗敏感的應用場(chǎng)合。除了ARM7TDMI核以外,S3C4510B還有許多重要的片內外圍功能模塊,其中就有1個(gè)以太網(wǎng)控制器,用于S3C4510B系統與其它設備的網(wǎng)絡(luò )通信工程。在S3C4510B的網(wǎng)絡(luò )控制平臺上移植了uCLinux操作系統,并在這個(gè)嵌入式平臺上實(shí)現網(wǎng)絡(luò )控制的各項功能。本文的敘述的網(wǎng)絡(luò )通信工程就是其中最主要的功能。

1 S3C4510B以太網(wǎng)電路的設計思路與實(shí)現

作為一款優(yōu)秀的網(wǎng)絡(luò )控制器,基于S3C4510B的系統若沒(méi)有以太網(wǎng)接口,其應用價(jià)值就會(huì )大打折扣,因此,就整個(gè)系統而言,以太網(wǎng)接口電路應是必不可少的,但同時(shí)也是相對較復雜的。從硬件的角度看,以太網(wǎng)接口電路主要由MAC控制器和物理層接口(Physical Layer,PHY)兩大部分構成。

S3C4510B內嵌一個(gè)以太網(wǎng)控制器,支持媒體獨立接口(Media Independent Interface,MII)和帶緩沖DMA接口(Buffered DMA Interface,BDI),可在半雙工或全雙工模式下提供情報0M/100Mbps的以太網(wǎng)接入。在半雙工模式下,控制器支持CSMA/CD協(xié)議,在全雙工模式下支持IEEE802.3MAC控制層協(xié)議。因此,S3C4510B內部實(shí)際上已包含了以太網(wǎng)MAC控制,但并未提供物理層接口,故需外接一片物理層芯片,以提供以太網(wǎng)的接入通道。

常用的單口10M/100Mbps高速以太網(wǎng)物理層接口器件主要有RTL8201、DM9161等,均提供MII接口和傳統7線(xiàn)制網(wǎng)絡(luò )接口,可方便地與S3C4510B接口。以太網(wǎng)物理層接口器件主要功能一般包括:物理編碼子層、物理媒體附件、雙絞線(xiàn)物理媒體子層、10BASE-TX編碼/解碼器和雙絞線(xiàn)媒體訪(fǎng)問(wèn)單元等。

在該設計中,使用DP9161作為以太網(wǎng)的物理層接口。DM9161是一款低功耗、高性能的CMOS芯片,支持10M和100M的以太網(wǎng)傳輸,它起編碼、譯碼輸入和輸出數據的作用。它與S3C4510B的引腳連線(xiàn)如圖圖1所示。

由于S3C4510B片內已民用有帶MII接口的MAC控制器,而DM9161也提供了MII接口,各種信號的定義也很明確,因此DM9161與S3C4510B的連接時(shí)序銜接,可以達到很好的網(wǎng)絡(luò )信號傳遞的目的。圖2為DM9161在本系統中的實(shí)際應用電路(圖中右下方的1、2、3以及14、15、16分別與網(wǎng)絡(luò )隔離變壓器相應引腳相連)。

S3C4510B的MAC控制器可通過(guò)MDC/MDIO管理接口控制多達斡爾1個(gè)DM9161,每個(gè)DM9161應有不同的PHY地址(可從00001B~11111B)。當系統復位時(shí),DM9161鎖存引腳9、10、12、13、15的初始狀態(tài)作為與S3C4510B管理接口通信工程的PHY地址;但該地址不能設為00000B,否則DM9161進(jìn)入掉電模式。

信號的發(fā)送和接收端應通過(guò)網(wǎng)絡(luò )隔離變壓器和RJ45接口接入傳輸媒體,實(shí)際應用電路如圖書(shū)室所示。

圖2

2 Linux下的網(wǎng)絡(luò )編程協(xié)議分析

Linux下的TCP/IP網(wǎng)絡(luò )協(xié)議棧的各層之間是通過(guò)一系列互相連接層的軟件來(lái)實(shí)現Internet地址族的,結構層次如圖4所示。

其中BSD socket層由專(zhuān)門(mén)用來(lái)處理BSD socket的通用套接字管理軟件來(lái)處理,它由INET socket層來(lái)支持。INET socket為基于IP的協(xié)議TCP和UDP管理傳輸端點(diǎn)。UDP(用戶(hù)數據報協(xié)議)是一個(gè)無(wú)連接協(xié)議,而TCP(傳輸控制協(xié)議)是一個(gè)可靠的端對端協(xié)議。傳輸UDP包的時(shí)候,Linux不知道也不關(guān)心它們是否安全到達了目的地。TCP則不同。在TCP連接的兩端都需要加上一個(gè)編號,以保證傳輸的數據被正確接收。在IP層,實(shí)現了Internet協(xié)議代碼,這些代碼要給傳輸的數據加上一個(gè)IP頭,并且知道如何把傳入的IP包送給TCP或者UDP協(xié)議。在IP層以下,就是網(wǎng)絡(luò )設備來(lái)支持所有的Linux網(wǎng)絡(luò )工作,如PLIP、SLIP和以太網(wǎng)。

3 uClinux環(huán)境下的socket編程

網(wǎng)絡(luò )的socket數據b傳輸是一種特殊的I/O,socket也是一種文件描述符,也具有一個(gè)類(lèi)似文件的函數調用socket()。該函數返回一個(gè)整型的socket描述符,隨后的連接建立、數據傳輸等操作都是通過(guò)該socket函數實(shí)現的。常用的socket類(lèi)型有兩種:流式socket和數據報式socket。兩者的區別在于:前者對應于TCP服務(wù),后者對應于UDP服務(wù)。

3.1 uCLinux中socket編程中用到的函數

(1) socket函數

為了執行I/O,一個(gè)進(jìn)程必須做的第一件事情就是調用socket函數,指定期望的通信協(xié)議類(lèi)型(使用IPv4的TCP、使用IPv6的UDP、Unix域字節流協(xié)議等),其函數結構如下:int socket(int family,int type,int protocol);

/*返回:非負描述字―成功,-1―出錯*/

代碼中的family指明協(xié)議族。套接口的類(lèi)型type是某個(gè)常值。一般來(lái)說(shuō),函數socket的參數protocol主設置為0,socket函數成功時(shí)返回一個(gè)小的非負整數值。為了得到這個(gè)數值,我們指定協(xié)議族(IPv4IP、v6或Unix)和套接口類(lèi)型(字節流、數據報或原始套接口)。

(2)connect函數

TCP客戶(hù)用connect函數來(lái)建立一個(gè)與TCP服務(wù)器的連接。

Int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);/*返回:0―成功,-1―出錯*/

Sockfd由socket函數返回數值,第二、第三個(gè)參數分別是一個(gè)批晌套接口地址結構的指針和該結構的大小。套接口葉址結構必須含有服務(wù)器的IP地址和端口號。

(3)bind函數

函數bind給套接口分配一個(gè)本地協(xié)議地址。對于網(wǎng)際協(xié)議,協(xié)議地址是非顛倒2位IPv4地址16位的TCP或UDP端口號的組合。

Int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen);/*返回:0―成功,-1―出錯*/

第二個(gè)參數量個(gè)指向特定于協(xié)議地址結構的指針,第三個(gè)參數是該地址結構的長(cháng)度。對于TCP,調用函數bind可以指定一個(gè)端口,指定一個(gè)IP地址??梢?xún)烧叨贾付?,也可以一個(gè)也不指定。

(4)listen函數

函數listen僅被除數TCP服務(wù)器調用。它做兩件事件事情,當函數socket創(chuàng )建一個(gè)套接口時(shí),被假設為一個(gè)主動(dòng)套接口。也就是說(shuō),它是一個(gè)將調用connect發(fā)起連接的客戶(hù)套接口,函數listen將未連接的套接口轉換成被動(dòng)套接口,指示內核應接受指向此套接口的連接請求。根據TCP狀態(tài)轉換調用函數listen導致套接口從CLOSED狀態(tài)轉換到LISEN狀態(tài)。函數的第二個(gè)參數規定了內核為此套接口排隊的最大連接個(gè)數。

Int listen(int sockfd,int backlog);

/*返回:0―成功,-1―出錯*/

一般來(lái)說(shuō),此函數應在調用函數socket和bind之后,調用函數accept之前調用。

(5)accept函數

accept函數由TCP服務(wù)器調用,從已完成連接隊列頭返回下一個(gè)已完成連接。若已完成連接隊列為空,則進(jìn)程睡眠。(假定套接口噗缺省的阻塞方式)

int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);/*返回非負數值―OK,-1―出錯*/

參數cliaddr和addrlen用來(lái)返回連接對方進(jìn)程(客戶(hù))的協(xié)議地址。Addrlen是結果參數,調用前,將由*addrlen所指示的整數值置為由cliaddr所旨的套接口地址結構的長(cháng)度,返回時(shí),此整數值即為由內核存在此套接口地址結構內的準確字節數。

3.2 uClinux中網(wǎng)絡(luò )通信編程的實(shí)現

在uCLinux中進(jìn)行socket編程,一般按照圖書(shū)資料所示流程編寫(xiě)網(wǎng)絡(luò )應用程序。

除了熟悉前文提出的函數外,還應知道兩個(gè)重要的數據結構。因為在計算機中,數據存儲有兩種字節優(yōu)先順序:高位字節優(yōu)先和低位字節優(yōu)先。在互聯(lián)網(wǎng)上,數據是以高位字節優(yōu)先順序傳輸的,所以對于在內部以低位字節優(yōu)先方式存儲的數據,需要進(jìn)行轉換才能在互聯(lián)網(wǎng)上傳輸。

*struct sockaddr:用來(lái)保存socket信息

struct sockaddr{unsigned short sa_family;/*地址族,AF_xxx*/

char sa_data[14]; /*14字節的協(xié)議地址*/};

*struct sockaddr_in;和來(lái)進(jìn)行數據類(lèi)型的轉換

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同樣大小*/};

至此,可經(jīng)編出uCLinux的網(wǎng)絡(luò )通信工程程序。在此給出部分uCLinux下實(shí)現網(wǎng)絡(luò )通信源代碼及其Makefile文件的編寫(xiě)實(shí)例。

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(servaddr,sizeof(struct sockaddr_in));

servaddr.sin_family=AF_INET;

servaddr.sin_port=8888;//htons(8888); /*指定通信端口*/將命令行輸入的字符串IP轉換為connect函數可識別的整數uiip。本來(lái)在Linux上開(kāi)發(fā)時(shí)可以使用C庫函數inet_pton(),但在uCLinux的庫中不支持該函數,因此只好自己實(shí)現該函數的功能。

aiptoi()如下所示:

aiptoi(argv[1],uiip);

servaddr.sin_addr.s_addr=uiip; /*指定連接的對端IP*/

connect(sockfd,(struct sockaddr)servaddr,sizeof(struct sockaddr));

/*連接對端接收代碼*/

fp=fopen("kongzhi.htm","r"); /*打開(kāi)控制頁(yè)面*/

while(nsize==1024)

{bzero(szsendbuf,1024); /*每次從文件中讀取巧024個(gè)字節發(fā)送出去,若讀出少于1024字節結束*/

nsize=phead=fread(szsendbuf,1,1024,fp);/*從文件中讀取并填入發(fā)送BUFFER中*/

write(sockfd,head,8);/*發(fā)送協(xié)議頭*/

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

需要注意的是:①u(mài)CLinux中不帶有pthread庫,在編寫(xiě)網(wǎng)絡(luò )程序要切記;②在uCLinux環(huán)境下,處理器(硬件)和內核黃素(軟件)均不提供內存管理機制,所以程序的地址空間等同于內存的物理地址空間。在程序中可直接對I/O地址進(jìn)行操作,而不需要申請和釋放I/O空間,但需要用戶(hù)自己來(lái)檢查所操作的I/O地址的占用情況。

結語(yǔ)

由于網(wǎng)絡(luò )通信工程廣泛應用在嵌入式設備中,以往的文章只是泛泛地敘述網(wǎng)絡(luò )通信設計的某一個(gè)方面。本文結合實(shí)際工程項目,從硬件電路的搭建、應用軟件的設計要點(diǎn)。這對于在嵌入式設備中,特別是基于uCLinux的系統中應用網(wǎng)絡(luò )通信有重要的參考意義。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>