當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]摘要:結(jié)合工程實(shí)例,基于S3C4510B微處理器,構(gòu)建以DM9161為以太網(wǎng)物理層接口的低功耗、高速硬件電路;在嵌入式操作系統(tǒng)uCLinux上實(shí)現(xiàn)網(wǎng)絡(luò)通信工程的程序編寫(xiě),對(duì)于網(wǎng)絡(luò)通信

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

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

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

3.2 uClinux中網(wǎng)絡(luò)通信編程的實(shí)現(xiàn) 在uCLinux中進(jìn)行socket編程,一般按照?qǐng)D書(shū)資料所示流程編寫(xiě)網(wǎng)絡(luò)應(yīng)用程序。 除了熟悉前文提出的函數(shù)外,還應(yīng)知道兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu)。因?yàn)樵谟?jì)算機(jī)中,數(shù)據(jù)存儲(chǔ)有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。在互聯(lián)網(wǎng)上,數(shù)據(jù)是以高位字節(jié)優(yōu)先順序傳輸?shù)模詫?duì)于在內(nèi)部以低位字節(jié)優(yōu)先方式存儲(chǔ)的數(shù)據(jù),需要進(jìn)行轉(zhuǎn)換才能在互聯(lián)網(wǎng)上傳輸。 *struct sockaddr:用來(lái)保存socket信息 struct sockaddr{unsigned short sa_family;/*地址族,AF_xxx*/ char sa_data[14]; /*14字節(jié)的協(xié)議地址*/}; *struct sockaddr_in;和來(lái)進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換 struct sockaddr_in{ short int sin_family; /*地址族*/ unsigned short int sin_port; /*端口號(hào)*/ sruct in_addr sin_addr; /*IP地址*/ unsigned cha sin_zero[8]; /*填充0,以保持與struct sockaddr同樣大小*/}; 至此,可經(jīng)編出uCLinux的網(wǎng)絡(luò)通信工程程序。在此給出部分uCLinux下實(shí)現(xiàn)網(wǎng)絡(luò)通信源代碼及其Makefile文件的編寫(xiě)實(shí)例。 main()函數(shù)中部分代碼如下: 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轉(zhuǎn)換為connect函數(shù)可識(shí)別的整數(shù)uiip。本來(lái)在Linux上開(kāi)發(fā)時(shí)可以使用C庫(kù)函數(shù) inet_pton(),但在uCLinux的庫(kù)中不支持該函數(shù),因此只好自己實(shí)現(xiàn)該函數(shù)的功能。 aiptoi()如下所示: aiptoi(argv[1],%26;amp;uiip); servaddr.sin_addr.s_addr=uiip; /*指定連接的對(duì)端IP*/ connect(sockfd,(struct sockaddr)%26;amp;servaddr,sizeof(struct sockaddr)); /*連接對(duì)端接收代碼*/ fp=fopen("kongzhi.htm","r"); /*打開(kāi)控制頁(yè)面*/ while(nsize==1024) {bzero(szsendbuf,1024); /*每次從文件中讀取巧024個(gè)字節(jié)發(fā)送出去,若讀出少于1024字節(jié)結(jié)束*/ 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庫(kù),在編寫(xiě)網(wǎng)絡(luò)程序要切記;②在uCLinux環(huán)境下,處理器(硬件)和內(nèi)核黃素(軟件)均不提供內(nèi)存管理機(jī)制,所以程序的地址空間等同于內(nèi)存的物理地址空間。在程序中可直接對(duì)I/O地址進(jìn)行操作,而不需要申請(qǐng)和釋放I/O空間,但需要用戶自己來(lái)檢查所操作的I/O地址的占用情況。 結(jié)語(yǔ) 由于網(wǎng)絡(luò)通信工程廣泛應(yīng)用在嵌入式設(shè)備中,以往的文章只是泛泛地?cái)⑹鼍W(wǎng)絡(luò)通信設(shè)計(jì)的某一個(gè)方面。本文結(jié)合實(shí)際工程項(xiàng)目,從硬件電路的搭建、應(yīng)用軟件的設(shè)計(jì)要點(diǎn)。這對(duì)于在嵌入式設(shè)備中,特別是基于uCLinux的系統(tǒng)中應(yīng)用網(wǎng)絡(luò)通信有重要的參考意義。

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

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

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

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

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

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

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

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

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

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

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

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

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

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉