基于uCLinux和ARM7的网络通信设计

发布者:老王古玩店最新更新时间:2013-04-12 来源: dzsc关键字:uCLinux  S3C4510B  网络通信 手机看文章 扫描二维码
随时随地手机看文章

引言

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地址族的,结构层次如图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环境下的socket编程

网络的socket数据b传输是一种特殊的I/O,socket也是一种文件描述符,也具有一个类似文件的函数调用socket()。该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket函数实现的。常用的socket类型有两种:流式socket和数据报式socket。两者的区别在于:前者对应于TCP服务,后者对应于UDP服务。[page]

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编程,一般按照图书资料所示流程编写网络应用程序。

除了熟悉前文提出的函数外,还应知道两个重要的数据结构。因为在计算机中,数据存储有两种字节优先顺序:高位字节优先和低位字节优先。在互联网上,数据是以高位字节优先顺序传输的,所以对于在内部以低位字节优先方式存储的数据,需要进行转换才能在互联网上传输。[page]

*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的系统中应用网络通信有重要的参考意义。


参考文献:
[1]. S3C4510B datasheet http://www.dzsc.com/datasheet/S3C4510B_589499.html.
[2]. DM9161 datasheet http://www.dzsc.com/datasheet/DM9161_264516.html.
[3]. RISC datasheet http://www.dzsc.com/datasheet/RISC_1189725.html.
[4]. ARM7TDMI datasheet http://www.dzsc.com/datasheet/ARM7TDMI_139812.html.
[5]. RTL8201 datasheet http://www.dzsc.com/datasheet/RTL8201_586322.html.
[6]. 100M datasheet http://www.dzsc.com/datasheet/100M_2509927.html.

关键字:uCLinux  S3C4510B  网络通信 引用地址:基于uCLinux和ARM7的网络通信设计

上一篇:S3c2410的触摸屏及模数转换
下一篇:WindowsCE环境下无线网卡的自动安装

推荐阅读最新更新时间:2024-03-16 13:21

S3C44B0X键盘的uClinux驱动程序设计
  用三星公司的嵌入式微处理器S3C44B0X设计的嵌入式开发板大多采用1×4按键键盘,在移植uClinux到这类开发板上时,必须设计键盘驱动程序。1×4键盘驱动程序通过修改uClinux源代码中PC键盘的驱动程序得到。   根据实际电路,对键盘的初始化、键盘中断处理程序进行了处理,用户可根据需要决定各键的扫描码。此驱动程序利用操作系统计时器解决了键盘的抖动问题。1×4键盘驱动程序可用于其他类似的嵌入式系统。    引言   三星公司的ARM7系列微处理器得到了广泛使用,其中S3C44B0X是制作手持式设备的良好选择。目前以S3C44B0X为核心制作的开发板大多采用1×4按键键盘,其电路简单,容易实现。在移植uClinux到
[工业控制]
S3C44B0X键盘的<font color='red'>uClinux</font>驱动程序设计
基于uClinux的嵌入式多功能信息交互终端
信息交互终端是一种以信息交流为主要目的,为个性化用户提供信息处理、存储和查询等功能的嵌入式设备。与个人电脑机相比,该设备结构简单、功能专一、操作简单。目前,信息交互终端主要应用于银行、移动通信和视频会议等领域。 1) 银行金融终端。银行金融终端是一种以通过网络进行金融交易为主要功能的低端设备,能24 小时为客户提供服务,即客户能够随时通过该终端实现存取款、转帐、查询等操作。目前该类型终端已经走入我国的大中型城市,但其应用功能较少。 2) 移动通信终端。移动通信终端主要以手机和掌上电脑( PDA) 为主要代表。其中手机以语音传输为主,兼有收发短消息、WAP (无线应用协议) 上网的功能;PDA 具有个人数据管理、网络通讯等功能,
[单片机]
基于<font color='red'>uClinux</font>的嵌入式多功能信息交互终端
基于蓝牙的家庭监控报警系统
引言     市场上现有的监控设备也往往不能满足用户的远程查询要求,而且误报率也比较高。基于蓝牙技术的家庭监控报警系统,能够实时监控终端探测设备的数据,并在有突发事件时及时报警;同时该系统还能满足用户随时通过控制中心来统筹管理家居的要求。    系统硬件电路结构     ROK101007蓝牙模块     ROK 101007是Ericsson公司生产的一种在电子设备中实现蓝牙功能的短距离通信模块。该蓝牙模块是由基带控制器、快闪式存储器、PBA313 01/2无线电收发器3个芯片组成。其同时支持数据和语音的传递,通过一个符合USB2.0规格的USB接口或一个UART/PCM接口来实现模块和主机控制器之间的通信。它的VC
[单片机]
基于蓝牙的家庭监控报警系统
一文解析什么是物联网智能家居
  随着物联网的发展,物联网技术被应用于各个领域,其中与我们最为密切的应当智能家居。智能家居就是通过互联网和物联网使一个家实现智能化、自动化。给用户一种轻松、愉悦、便捷的生活环境。物联网技术属于智能家居应用技术的核心部分,智能家居也是物联网技术在现代智能家庭中的实际应用体现。通过网络技术和物联网技术的高效融合,赋予了智能家居这一新兴产业巨大的市场发展潜力,智能家居将会获得更加广泛的商业市场,将成为21世纪物联网产业的龙头行业。   智能家居是在互联网影响之下物联化的体现。智能家居通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供
[嵌入式]
一种基于DSP的网络通信接口设计
DSP芯片是专门为实现各种数字信号处理算法而设计的、具有特殊结构的微处理器,其卓越的性能、不断上升的性价比、日渐完善的开发方式使它的应用越来越广泛。将计算机网络技术引入以DSP为核心的嵌入式系统,使其成为数字化、网络化相结合,集通信、计算机和视听功能于一体的电子产品,必须大大提升DSP系统的应用价值和市场前景。将DSP技术与网络技术相结合,必须解决两个关键问题:一是实现DSP与网卡的硬件接口技术,二是基于DSP的网络通信程序设计。DSP与网卡的硬件接口技术参考文献 有比较详尽的论述,以下主要讨论基于DSP的网络通信程序设计。   1 通信协议的制定   协议是用来管理通信的法规,是网络系统功能实现的基础。由于DSP可以实现对网卡的
[嵌入式]
一种基于DSP的<font color='red'>网络通信</font>接口设计
我国新网络通信标准获国际电信联盟立项
记者7月24日从国网智能电网研究院获悉,近日,由国网智能电网研究院牵头提交的标准提案 “基于IPv6转发平面的分段路由(SRv6)网络性能监测方法”正式获得瑞士日内瓦国际电信联盟批准立项。 据了解,基于IPv6转发平面的分段路由是当前国际网络通信领域的热点技术,也是算力网络的关键技术之一,可为新型电力系统中海量分布式资源云边端协同聚合调控提供确定性承载,为未来能量流与信息流联合调度提供技术支撑。 据国网智能电网研究院电网数字化技术研究所所长吴军民介绍,基于IPv6转发平面的分段路由技术,结合了IPv6简洁易扩展的特质和软件定义网络优势,通过灵活的IPv6头部字段扩展实现承载业务服务质量的智能识别;通过软件定义网络控制/转发平面的分
[网络通信]
视频多媒体集中控制系统实现的关键技术研究
1 引 言   随着数字技术和网络技术的迅猛发展,嵌入式系统进入了一个新的发展时期。32位高性能专用微处理器的出现,使嵌入式系统已经能够适应十分复杂的控制需求,进行多任务,尤其是嵌入式视频的处理,大大扩展了嵌入式系统的应用范畴,正成为我国教育现代化对数字化、网络化的教学设备进入全新的发展时期的强大技术支撑。32位高性能专用微处理器需要嵌入式操作系统,而μClinux操作系统是针对32位微处理器设计的嵌入式Linux操作系统。   μClinux是控制领域的嵌入式操作系统,其内核功能结构与Linux基本相同,且可移植和裁剪;用户通过重新配置、编译内核,可方便移植到多种处理器平台上。   本文主要介绍基于嵌入式视频的多媒体
[嵌入式]
基于S3C4510B的存储系统原理与设计
   1. 引言   对于嵌入式系统的开发人员来说,深刻地理解其存储系统的寻址原理和有效的管理存储系统对正确高效地设计嵌入式系统的硬件和底层软件编程具有重要的意义。目前嵌入式系统中最常用的存储器包括有EEPROM、FLASH、Normal DRAM和Sync.DRAM等。本文所采用的存储器包括有SDRAM和FLASH。S3C4510B(以下简称4510)微处理器是构建在ARM核ARM7TDMI之上的,ARM7TDMI的地址总线为32位的,4510的内部系统总线却是26bit:SA ,它的外部地址总线却是22bit:ADDR ,它们之间是如何译码的,而仅用14根外部地址总线为什么能够访问多达16MB的内存地址空间,本文就试图回答这
[缓冲存储]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved