您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

基于uCLinux和S3C4510B的网络通讯筹划

发布日期:2011-05-08


    小序 

   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以太网电路的筹划思路与实现 

   作为一款精良的网络控制器,基于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的初始状态作为与S3C4510B办理接口通讯工程的PHY地点;但该地点不克不及设为00000B,不然DM9161进入失电模式。 

   信号的发送和汲取端应通过网络断绝变压器和RJ45接口接入传输媒体,实际应用电路如图书室所示。 

   2 Linux下的网络编程协议阐发 

   Linux下的TCP/IP网络协议栈的各层之间是通过一系列相互连接层的软件来实现Internet地点族的。 

   此中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环境下的socket编程 

   网络的socket数据b传输是一种分外的I/O,socket也是一种文件形貌符,也具有一个雷同文件的函数调用socket()。该函数返回一个整型的socket形貌符,随后的连接创建、数据传输等利用都是通过该socket函数实现的。常用的socket典范有两种:流式socket和数据报式socket。两者的区别在于:前者映射于TCP办事,后者映射于UDP办事。 

   3.1 uCLinux中socket编程中用到的函数 

   (1) socket函数 

   为了实行I/O,一个进程必须做的第一件变乱便是调用socket函数,指定渴望的通讯协议典范(利用IPv4的TCP、利用IPv6的UDP、Unix域字节流协议等),其函数布局如下:int socket(int family,int type,int protocol); 

   /*返回:非负形貌字—告成,-1—堕落*/ 

   代码中的family指明协议族。套接口的典范type是某个常值。一样通常来说,函数socket的参数protocol主设置为0,socket函数告成时返回一个小的非负整数值。为了得到这个数值,我们指定协议族(IPv4IP、v6或Unix)和套接口典范(字节流、数据报或原始套接口)。 

   (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创建一个套接口时,被假设为一个主动套接口。也便是说,它是一个将调用connect提倡连接的客户套接口,函数listen将未连接的套接口转换成被动套接口,指示内核答允继指向此套接口的连接恳求。根据TCP状态转换调用函数listen导致套接口从CLOSED状态转换到LISEN状态。函数的第二个参数规定了内核为此套接口列队的最大连接个数。 

   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所旨的套接口地点布局的长度,返回时,此整数值即为由内核存在此套接口地点布局内的精确字节数。 

   3.2 uClinux中网络通讯编程的实现 

   在uCLinux中举行socket编程,一样通常根据图书数据所示流程编写网络应用步调。 

   除了熟习前文提出的函数外,还应知道两个告急的数据布局。由于在谋略机中,数据存储有两种字节优先序次:高位字节优先和低位字节优先。在互联网上,数据因此高位字节优先序次传输的,以是敷衍在内部以低位字节优先要领存储的数据,须要举行转换才华在互联网上传输。 

   *struct sockaddr:用来生存socket信息 

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

   char sa_data[14]; /*14字节的协议地点*/}; 

   *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);/*创建socket*/ 

   bzero(&servaddr,sizeof(struct sockaddr_in)); 

   servaddr.sin_family=AF_INET; 

   servaddr.sin_port=8888;//htons(8888); /*指定通讯端口*/将下令行输入的字符串IP转换为connect函数可辨认的整数uiip。原来在Linux上开辟时可以利用C库函数inet_pton(),但在uCLinux的库中不支持该函数,因此只好本身实现该函数的结果。 

   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"); /*打开控制页面*/ 

   while(nsize==1024) 

   {bzero(szsendbuf,1024); /*每次从文件中读取巧024个字节发送出去,若读出少于1024字节结束*/ 

   nsize=phead=fread(szsendbuf,1,1024,fp);/*从文件中读取并填入发送BUFFER中*/ 

   write(sockfd,head,8);/*发送协议头*/ 

   nsize=write(sockfd,szsendbuf,nsize);/*发送*/} 

   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环境下,处理惩罚处罚器(硬件)和内核黄素(软件)均不提供内存办理机制,以是步调的地点空间等同于内存的物理地点空间。在步调中可直接对I/O地点举行利用,而不须要申请和开释I/O空间,但须要用户本身来查抄所利用的I/O地点的占用环境。 

   结语 

   由于网络通讯工程广泛应用在嵌入式配置中,以往的文章只是通常地叙述网络通讯筹划的某一个方面。本文连合实际工程项目,从硬件电路的搭建、应用软件的筹划要点。这敷衍在嵌入式配置中,分外是基于uCLinux的体系中应用网络通讯有告急的参考意义。