0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于S3C4510B微處理器和操作系統(tǒng)實現(xiàn)網(wǎng)絡(luò)通信工程的編寫設(shè)計

牽手一起夢 ? 來源:單片機與嵌入式系統(tǒng)應(yīng)用 ? 作者:馬學(xué)文,朱名日, ? 2020-10-04 17:37 ? 次閱讀

作者:馬學(xué)文,朱名日,程小輝

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

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

1 基于S3C4510B以太網(wǎng)電路的設(shè)計思路與實現(xiàn)

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

基于S3C4510B微處理器和操作系統(tǒng)實現(xiàn)網(wǎng)絡(luò)通信工程的編寫設(shè)計

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

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

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

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

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

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

圖2

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

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

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

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

網(wǎng)絡(luò)的socket數(shù)據(jù)b傳輸是一種特殊的I/O,socket也是一種文件描述符,也具有一個類似文件的函數(shù)調(diào)用socket()。該函數(shù)返回一個整型的socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該socket函數(shù)實現(xiàn)的。常用的socket類型有兩種:流式socket和數(shù)據(jù)報式socket。兩者的區(qū)別在于:前者對應(yīng)于TCP服務(wù),后者對應(yīng)于UDP服務(wù)。

3.1 uCLinux中socket編程中用到的函數(shù)

(1) socket函數(shù)

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

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

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

(2)connect函數(shù)

TCP客戶用connect函數(shù)來建立一個與TCP服務(wù)器的連接。

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

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

(3)bind函數(shù)

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

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

第二個參數(shù)量個指向特定于協(xié)議地址結(jié)構(gòu)的指針,第三個參數(shù)是該地址結(jié)構(gòu)的長度。對于TCP,調(diào)用函數(shù)bind可以指定一個端口,指定一個IP地址??梢詢烧叨贾付ǎ部梢砸粋€也不指定。

(4)listen函數(shù)

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

Int listen(int sockfd,int backlog);

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

一般來說,此函數(shù)應(yīng)在調(diào)用函數(shù)socket和bind之后,調(diào)用函數(shù)accept之前調(diào)用。

(5)accept函數(shù)

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

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

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

3.2 uClinux中網(wǎng)絡(luò)通信編程的實現(xiàn)

在uCLinux中進行socket編程,一般按照圖書資料所示流程編寫網(wǎng)絡(luò)應(yīng)用程序。

除了熟悉前文提出的函數(shù)外,還應(yīng)知道兩個重要的數(shù)據(jù)結(jié)構(gòu)。因為在計算機中,數(shù)據(jù)存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。在互聯(lián)網(wǎng)上,數(shù)據(jù)是以高位字節(jié)優(yōu)先順序傳輸?shù)模詫τ谠趦?nèi)部以低位字節(jié)優(yōu)先方式存儲的數(shù)據(jù),需要進行轉(zhuǎn)換才能在互聯(lián)網(wǎng)上傳輸。

*struct sockaddr:用來保存socket信息

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

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

*struct sockaddr_in;和來進行數(shù)據(jù)類型的轉(zhuǎn)換

struct sockaddr_in{

short int sin_family; /*地址族*/

unsigned short int sin_port; /*端口號*/

sruct in_addr sin_addr; /*IP地址*/

unsigned cha sin_zero; /*填充0,以保持與struct sockaddr同樣大小*/};

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

main()函數(shù)中部分代碼如下:

int sockfd;

unsigned int uiip;

char szsendbuf[1024];

char head;

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ù)uiip。本來在Linux上開發(fā)時可以使用C庫函數(shù)inet_pton(),但在uCLinux的庫中不支持該函數(shù),因此只好自己實現(xiàn)該函數(shù)的功能。

aiptoi()如下所示:

aiptoi(argv,%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é)結(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

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

結(jié)語

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

責(zé)任編輯:gt

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5046

    文章

    18817

    瀏覽量

    298537
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6545

    瀏覽量

    122743
  • 微處理器
    +關(guān)注

    關(guān)注

    11

    文章

    2221

    瀏覽量

    81980
收藏 人收藏

    評論

    相關(guān)推薦

    基于S3C4510B微處理器和uClinux實現(xiàn)存儲系統(tǒng)的設(shè)計

    、FLASH、Normal DRAM和Sync.DRAM等。本文所采用的存儲包括有SDRAM和FLASH。S3C4510B(以下簡稱4510微處理器是構(gòu)建在ARM核ARM7TDMI
    發(fā)表于 06-28 08:28 ?802次閱讀
    基于<b class='flag-5'>S3C4510B</b><b class='flag-5'>微處理器</b>和uClinux<b class='flag-5'>實現(xiàn)存儲系統(tǒng)</b>的設(shè)計

    μClinux在S3C4510B上的移植

    Linux是一種支持多種體系結(jié)構(gòu)處理器操作系統(tǒng).有很強的移植性。描述了將UClinux移植到基于S3C4510B處理器目標板上的方法與過程。首先介紹了
    發(fā)表于 03-28 13:18

    s3c4510b中文手冊,s3c4510b用戶手冊

    s3c4510b中文手冊,s3c4510b用戶手冊:ARM(Advanced RISC Machines),既可以認為是一個公司的名字,也可以認為是對一類微處理器的通稱,還可以認為是一種技術(shù)的名字。1991年ARM公司成立
    發(fā)表于 10-14 10:54 ?421次下載

    s3c4510b中文資料

    本書所討論的S3C4510B即為一款不帶MMU的ARM微處理器,可在其上運行uCLinux操作系統(tǒng)。系統(tǒng)的工作頻率系統(tǒng)的工作頻率在很大程度上
    發(fā)表于 10-14 11:11 ?8次下載

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

    基于uCLinux和S3C4510B網(wǎng)絡(luò)通信設(shè)計
    發(fā)表于 03-28 09:49 ?17次下載

    μClinux在S3C4510B上的移植

    Linux是一種支持多種體系結(jié)構(gòu)處理器操作系統(tǒng).有很強的移植性。描述了將UClinux移植到基于S3C4510B處理器目標板上的方法與過程。首先介紹了
    發(fā)表于 03-28 09:51 ?16次下載

    網(wǎng)絡(luò)通信處理器S3C4510B的網(wǎng)口驅(qū)動設(shè)計

    嵌入式處理器S3C4510B網(wǎng)絡(luò)控制和通信領(lǐng)域有著相當(dāng)廣泛的應(yīng)用。本文簡要描述該處理器內(nèi)嵌的以太網(wǎng)控制
    發(fā)表于 05-15 16:24 ?18次下載

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

    結(jié)合工程實例, 基于S3C4510B 微處理器, 構(gòu)建以DM9161 為以太網(wǎng)物理層接口的低功耗、高速硬件電路;在嵌入式操作系統(tǒng)uCLinux 上
    發(fā)表于 05-16 13:29 ?16次下載

    基于uCLinux和S3C4510B網(wǎng)絡(luò)通信的設(shè)計與實現(xiàn)

    文章結(jié)合工程實例,基于S3C4510B 微處理器構(gòu)建了以DM9161 為以太網(wǎng)物理層接口的低功耗、高速硬件電路。并且在嵌入式操作系統(tǒng)uCLinux 上
    發(fā)表于 08-14 12:07 ?34次下載

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

    結(jié)合工程實例, 基于S 3 C 4 5 1 0 B微處理器, 構(gòu)建以D M 9 1 6 1為以太
    發(fā)表于 12-05 16:25 ?25次下載

    基于S3C4510B的HDLC協(xié)議實現(xiàn)

    使用嵌入式微處理器S3C4510B內(nèi)部包含的HDLC控制封裝和解析HDLC協(xié)議,微處理器既可實現(xiàn)系統(tǒng)
    發(fā)表于 07-08 15:26 ?46次下載

    基于S3C4510B系統(tǒng)設(shè)計

    基于S3C4510B系統(tǒng)設(shè)計   arm開發(fā)詳解全集 1991 年ARM 公司成立于英
    發(fā)表于 02-09 14:22 ?821次閱讀

    S3C4510B型ARM微處理器最小系統(tǒng)構(gòu)建

    本文介紹S3C4510B型ARM微處理器最小系統(tǒng)的構(gòu)建,并給出系統(tǒng)外圍相關(guān)器件的選型。
    發(fā)表于 08-19 14:33 ?2982次閱讀
    <b class='flag-5'>S3C4510B</b>型ARM<b class='flag-5'>微處理器</b>最小<b class='flag-5'>系統(tǒng)</b>構(gòu)建

    三星ARM處理器S3C4510B的HDLC通道使用及編程

    三星16/32位ARM處理器S3C4510B是目前在國內(nèi)應(yīng)用非常廣泛的一種性價比很高的ARM處理器,本文在介紹S3C4510B中HDLC通道結(jié)構(gòu)特點的基礎(chǔ)上,詳細說明了
    發(fā)表于 04-05 11:44 ?1238次閱讀
    三星ARM<b class='flag-5'>處理器</b><b class='flag-5'>S3C4510B</b>的HDLC通道使用及編程

    基于S3C4510B微處理器的最小系統(tǒng)設(shè)計

    介紹S3C4510B型ARM微處理器和基于該處理器設(shè)計的最小系統(tǒng),概述該系統(tǒng)外圍應(yīng)用電路的選型,以便使用者自行設(shè)計開發(fā)。
    的頭像 發(fā)表于 07-23 15:17 ?727次閱讀
    基于<b class='flag-5'>S3C4510B</b>型<b class='flag-5'>微處理器</b>的最小<b class='flag-5'>系統(tǒng)</b>設(shè)計