基于ARM嵌入式系统的Socket通信设计毕业设计.docx

上传人:b****4 文档编号:4261904 上传时间:2022-11-28 格式:DOCX 页数:21 大小:278.23KB
下载 相关 举报
基于ARM嵌入式系统的Socket通信设计毕业设计.docx_第1页
第1页 / 共21页
基于ARM嵌入式系统的Socket通信设计毕业设计.docx_第2页
第2页 / 共21页
基于ARM嵌入式系统的Socket通信设计毕业设计.docx_第3页
第3页 / 共21页
基于ARM嵌入式系统的Socket通信设计毕业设计.docx_第4页
第4页 / 共21页
基于ARM嵌入式系统的Socket通信设计毕业设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于ARM嵌入式系统的Socket通信设计毕业设计.docx

《基于ARM嵌入式系统的Socket通信设计毕业设计.docx》由会员分享,可在线阅读,更多相关《基于ARM嵌入式系统的Socket通信设计毕业设计.docx(21页珍藏版)》请在冰豆网上搜索。

基于ARM嵌入式系统的Socket通信设计毕业设计.docx

基于ARM嵌入式系统的Socket通信设计毕业设计

(此文档为word格式,下载后您可任意编辑修改!

 

毕业论文

 

题目基于ARM嵌入式系统的Socket通信设计

摘  要

嵌入式系统是计算机技术、半导体技术和电子技术的综合体,已经广泛应用于科学研究、工程设计、国防军事、自动化控制等各个领域。

随着网络通讯技术的迅猛发展,生产和生活中广泛要求嵌入式系统终端能够完成网络通讯功能。

论文就是以ARM7TDMI为嵌入式开发平台,开发具有网络通信功能的嵌入式终端。

SOCKET是一个通信链的句柄,通过套接字向网络发出请求或者应答网络请求,用于TCPIP协议的应用程序之间的相互通信。

论文选择了ARM体系结构的嵌入式LPC2200处理器,根据系统的需求,在综合各种设计方案的基础上,选择移植带有TCPIP协议的ucLinux嵌入式操作系统。

裁剪和定制系统后,构建相关的文件系统。

在此基础上,编写应用程序,调用系统的Socket通信函数,实现服务器端和客户端的通信。

描述IP地址和端口,用于在两个

论文成功的实现了嵌入式设备的网络接入功能,各个带有网络通讯功能的嵌入式终端可以相互通讯,扩大了和提高了嵌入式设备的应用范围,对嵌入式系统的发展有较大的意义。

关键词:

嵌入式系统;ARM7TDMI;socket;TCPIP

 

Abstract

Theembeddedsystemisacomplexsystemwiththecomputertechnology,semiconductortechnologyandelectronictechnology.Itwidelyusedinscientificresearch,engineering,nationaldefense,automationandotherfields.Withtherapiddevelopmentofnetworkcommunicationtechnology,ourproductionandliferequirestheterminaltocompletethenetworkcommunicationfunctioninawiderangeofembeddedsystems.ThePaperselecttheARM7TDMIforembeddeddevelopmentplatform,developtheembeddednetworkcommunicationterminal.

Socketisacommunicationchainapplications,.ThepaperselectLPC2200embeddedARMasprocessorarchitecture,withthesystemneed,designtheintegrationbasedontransplantationwithTCPIPprotocolucLinuxembeddedoperatingsystem.Thepaperbuildrelatedfilesystem.aftercuttingandcustomsystems.Onthisbasis,finishedanapplication,andcallthesystemfunctionofSocketCommunications,achieveserverandclientcommunication.

Thepaperachievedthenetworkaccessfunctionsoftheembeddeddevice,theembeddedwithanetworkcommunicationterminalcancommunicatewitheachother,andexpandandimprovetheapplicationrangeofembeddeddevices,and下有:

gcc,arm-elf-gcc,binudls,genromfs,flthdr和elflflt等各种应用工具。

3.1模块化的设计与分析

3.4.1开发板上完成的设计

从项目的整体出发,开发板上应完成的工作包括,移植uClinux到SmartARM2200开发板,移植过程中应配置uClinux,其中包含大部分系统配置,如:

Non-standardserialportsuppor(非标准串口支持)、ftp(文件传输协议)、()侦听连接请求,当远程的客户机使用connect()连接listen()正在监听的端口时,使用accept()处理它。

在accept()处理了连接请求后,将会生成一个新的描述这个连接端口的套接字,利用这个套接字就可以发送和接收数据了。

如果listen()一直没有侦听到连接请求,那么服务器就会在accept()处阻塞,一直到有连接请求到来。

对于客户机任务来说,它也需要先用socket()建立一个通信端口,但是它不必用bind()把他的本地地址绑定到这个端口上,而是直接使用connect()向指定的服务器发送连接请求,如果请求被接受,就可以进行通信了。

1系统详细设计

4.1.uClinux的移植

4.1.1uClinux嵌入式系统的下载

嵌入式系统交叉编译完成后,需要将编译好的嵌入式内核下载到嵌入式开发板上,然后嵌入式开发板才可以运行嵌入式内核。

嵌入式开发板按照以下两种方式进行加载:

(1)直接将编译好的内核下载到嵌入式存贮器中。

由于嵌入式开发板的资源有限,存贮器的容量不够大,这种方式对系统的存贮器要求较高,但是能够带来更高的运行速度,因为系统只直接从嵌入式开发板上启动的,系统直接解压缩内核文件,运行内核。

设计中采用这种方式[23]。

(2)通过地址印象的方式:

由于嵌入式系统的存贮器有限,为了节约资源,在嵌入式存贮器上建立地址印象,内核在执行的时候,首先运行到建立印象的地址,然后通过跳转指令,直接运行存储在嵌入式开发板外围的存贮器上,这样可以节约芯片上的资源,但是带来的问题是,由于跳转,运行的速度会降低,对于运行速度要求不高的开发,可以采取这种方式。

4.1.2根文件系统的建立

内核移植完成后,需要建立嵌入式的根文件系统,根文件是嵌入式系统重要组成部分。

uClinux主要应用于没有MMU单元的嵌入式芯片,主要的目的是节约内存和FLASH。

根据使用场合的不同,根文件系统也有多种选择。

在目前的嵌入式开发过程中,ROMfs是使用最多的文件系统。

ROMfs文件系统比较简单,文功能紧凑,并且是只读的。

在ROMfs中,文件数据是按照顺寻存放的。

uClinux系统可以直接运行,这样做的最大的优势是节约RAM空间,提高运行速度。

因此,根据系统的设计需求,选用ROMfs根文件系统。

当然,为了支持它,在内核的配置中需要内核支持romfs文件系统,并且在内核配置完毕后建立虚拟ram盘,提供用户接口。

4.1.3应用程序库

uClinux运行效率高,是一个小型化的嵌入式Linux系统,这就要求相应的应用程序库具有较高的运行效率。

glibc是gnu发布的libc库,主要是基于C语言的,这个库较大而且比较全面,不适应uClinux。

因此需要进行相应的简化,这就是uClibc应用程序库。

在uClinux中,采取静态连接,目的是为了节约内存和片上资源,满足嵌入式系统的设计需要。

4.2.内核编译

嵌入式系统应用非常专业化,功能模块相对比较单一。

随着uClinux内核版本的升级,内核功能越来越强大,体系结构也越来越复杂。

由于存储空间的限制,为了提高运行性能,必须根据需要对内核进行精简,定制一个符合嵌入式系统的操作平台。

uClinux可以通过裁剪,把不需要的功能模块剪掉,留下应用需要的模块,减少系统运行的复杂想,让系统更加健壮和安全。

同时,嵌入式芯片的资源有限,内存一般都比较小,裁剪后,内核往往会更加简练,所占用的存贮空间也会很小。

由于uClinux的内核采取了模块化的设计方式,设计时可以根据自己的需要,在内核编译的过程中,灵活选择所需要的模块,节约资源,减少代码量,提高内核的运行速度和效率,这也是嵌入式系统的一个明显的优势。

4.2.1uClinux的安装

在.Linux.org上下载版本为2.4的uClinux源码包应的解压缩:

就会看到,在系统的目录盘下,会出现uClinux的源代码目录,也就是uClinux-dist这个文件夹。

由于本系统所用SmartARM2200开发板,这个开发板为ARM7的LPC2200芯片,是philips公司设计制造的。

为了适应这个芯片的特性,登陆philips官方网站,并且查找和下载以下这个文件:

下载后,复制到系统的目录下,输入以下指令,并执行:

执行完成后,在编译uClinux内核是,选择系统的内核配置的时候,可以找到LPC2200的选项。

4.2.2配置uClinux

安装完成后,可以通过makeconfig,makexconfig来配置uClinux,也可以通过makemenuconfig来配置。

各命令使用范围不一样,但效果是相同的,各命令说明如表4.1所示。

表4.1uClinux的配置方式

makeconfig

命令行方式,适用于控制台和图形终端

makemenuconfig

文本菜中方式,适用于控制台和图形终端

makexconfig

-X窗口图形界面方式,仅适用于图形终端

文本菜单这种配置方式,可以在终端控制台上来使用,也可以通过图形终端进行使用。

为了使得配置具有更强的直观性,系统设计采用了文本菜单这种配置方式。

配置uClinux和文件系统具体的操作方法如下[24]:

(1)通过已经建立的终端或者控制台,找到uClinux源代码所在的目录,系统为:

usrsrcuClinux-dist,

执行命令:

cdusrsrcuClinux-dist

(2)如果不是进行第一次编译,需要先清除以前编译产生的辅助文件和目标文件,以保证编译的正确性。

如果是第一次编译则可省略。

执行命令:

makedistclean

(3)通过文本菜单方式配置uClinux

执行命令:

makemenuconfig

执行了makemenuconfig语句后,将会出现如图4.1配置内核界面。

图4.1配置内核界面

界面中有提示使用“↑”“↓”选择配置模块,使用空格键选择或者取消,使用“→”“←”,选择命令,最后使用回车键Enter执行命令。

第一项可进行厂商产品设置,选择第二项则进行内核版本和函数库设置,各选项的含义以及设置如表4.2所示。

表4.2uClinux中各个选项的描述

选项

描述

设置

VendorProduct

厂商产品选择

PHILISLPC2200

Kemel

选择版本

Linux

Libc

选择函数库

uClibc

DefaultallSettings

默认设置

恢复默认设置时选择

UpdataDefault

默认厂商配置

根据需要选择

在设计的时候,根据系统需求,以及所选用的芯片厂商等信息,进行系统的配置,主要是根据以上信息描述,进行设置。

进入Linux内核配内核资源的界面,如图4.2所示。

图4.2内核资源界面

配置完毕后选择Exit,然后在提示下是否保存的时候选择保存,配置完毕后,选择Exit,在对话提示选择保存。

(4)建立源代码文件依赖关系(第一次必须执行)

执行命令:

makedep

(5)编译内核

执行命令:

make

第(4)和第(5)进行内核的编译,执行的时间会比较长。

执行结束后,会得到我们需要的两个目录:

ROMfs文件和images内核文件。

在ROMfs文件中存放嵌入式系统运行所需要的应用程序。

Images内核文件主要存放那个内核目录。

经过以上程序,uClinux的内核编译全部完成。

4.2.3构建文件系统

构建文件系统就是在物理设备上构建文件组织和目录,便于系统进行文件的组织和管理,它是uClinux系统处理数据的基础条件。

uClinux系统的所有有效数据,包括用程序、库、系统文件和用户文件都按照目录存放在文件系统中。

uClinux系统的文件系统,在组织上按照树状结构的方式进行组织,也就是顶部是根目录,从根向下进行分支,通常把文件系统的最顶端成为根目录。

uClinux系统通常只有一个文件树,这个文件树以树根“”作为起点,其它的文件和外部设备按照树的形式,挂结在这个文件树上[25]。

uClinux根目录下可以见到以下结构:

bin

varbootroot

libprocusr

设计中选择的ROMFS文件系统,主要是考虑到系统的存贮结构。

因为这种文件系统的内核比较小,通常情况下只有4000字节左右,可以有效的节约系统的资源。

内核在连接的时候,只需要连接到ROMFS文件系统,后面用模块装载工具把其它相关的模块和文件系统装载进来,而不是所有的文件和模块全部挂接。

ROMFS文件系统的底层结构也是非常的简单,也可以用来进行块设备的操作。

ROMFS文件系统的构成,它的文件系统头由16字节组成,文件系统名由4字节组成,文件系统的大由4字节组成,其次还有4字节的校验和4字节的卷标名。

然后就是文件的头和数据了,文件头也是由16字节组成,开始的是文件模式信息,通常占用4比特的,后面的28比特,是这样分配的:

4字节为下后一个文件的地址偏移量,4字节为文件的链接信息、4字节为文件大小、4字节为文件的校验和。

从后面的第16字节开始,显示的是文件名和相关其数据[26]。

ROMFS是一种只读的文件系统,由于它是只读的,就决定了这个文件系统是非常小的。

如果设计中需要一种可写的文件系统,那么,就需要寻找一种可以在RAM上使用的可写文件系统。

在设计中,根据需要选择了RAMFS文件系统,这种文件系统可以用于RAMDISK文件系统的写操作,它与CRAMFS的结合可以适合大多数嵌入式系统的需求。

制作ramdisk具体步骤如下[27]:

一般在内核编译时,支持ramdisk的内核选项:

CONFIGBLKDEVRAM,CONFIGRDRELEASEBLOCKS,CONFIGBLKDEVIlVITRD:

同时在PC机上按照如下的方法来制作:

(1)制作映象文件

建立虚拟成块的文件init.img

执行命令:

#ddif=devzeroof=init.imgbs=1024count=500

格式化生成的块设备:

init.img文件

执行命令:

#mke2fs–m0–Finit.img

(2)配置根文件系统,将ini.img和fomfs.img加载到主机文件系统

执行命令:

#mountinit.imgram-oloop

执行命令:

#mountromfs.imgrom-oloop

建立在ramfs中需要的目录,也就是在ram目录下建立子目录。

执行命令:

#mkdirrambin

执行命令:

#mkdirramdev

执行命令:

#mkdirrametc

执行命令:

#mkdirramvar

拷贝必须的文件到ramfs中

执行命令:

#cp–arometc*rametc

执行命令:

#cp–arombinshrambin

执行命令:

#cp–arombininitrambinint

创建设备节点:

执行命令:

#mknodramdevttS0c464

执行命令:

#mknodramdevconsolec51

执行指令的说明:

第一条指令创建设备ttyS0,即第0个串口设备,

主设备的号为4,从设备的号为64,第二条指令是建立字符设备console,即控制台,主设备号为5从设备号为1。

最后卸载init.img和romfs.img.确保init.img的修改已经保存。

执行命令:

#umountram

执行命令:

#umountrom

到此RAMDISK制作完毕。

内核编译和文件系统构建完成以后通过网络FTP的方式把Linux.bin和ramdis下载到开发板上,这样完成了uClinux的移植。

4.3.PC机上的程序设计

4.3.1嵌入式TCPIP分析

在目前的网络协议中,TCPIP是应用最广泛的网络协议。

TCPIP的核心是分层的思想,它可以将不同的芯片、系统之间通过一种标准的协议相互连接起来,做到互联互通。

需要传输的数据以数据包的形式进行传输,这也是TCPIP传输的一个基本单位。

通常情况下,在嵌入式系统的应用中,数据的采集和传输是是核心的任务和功能。

对于嵌入式系统来说,需要根据系统的特点以及需要完成的功能,灵活选择相应的协议,因为嵌入式系统的资源毕竟有限,处理器的速度和PC机相比,还是有很大的差距。

同时,存贮的空间也是相对有限,需要的协议可以选择,不需要的协议可以裁减掉,这也是嵌入式系统最大的特点。

选择了相应的协议后,还要根据系统的功能和需求,进行相应的分析,特定问题特定处理,这也是嵌入式系统的一个特点。

根据需要传输的数据的大小,以及传输的速度等问题,可以采取特别的收发方式。

嵌入式系统的TCPIP协议栈主要包含ARP协议IP协议,ICMP协议,TCP协议以及UDP协议等。

ARP主要的功能是进行地址的解析,获取数据传输的物理地址。

因为嵌入式系统中数据是按照地址进行存贮的,当一个嵌入式系统上的IP地址的ARP被上传到网络上,就会收到一个应答,这个应答确认物理地址,找到物理地址后,就会找到相应需要传输的数据,并进行传输。

也就是说,ARP协议解决服务器端和客户端在通信的时候IP地址物理地址转换。

IP协议主要用于网络之间的相互连接,规定了进行网络连接时各个系统之间必须相互遵守的规则。

在IP进行数据传输时,对传输的IP数据包进行定义,进行数据包的封装时,还包括需要传输数据的目的地址,数据协议的版本号等。

最后还要对传输的数据进行校验,以确保数据传输的正确性。

在IP协议中,给每个每台设备一个地址,这个地址是唯一的,在传输过程中,相互传输数据的设备根据IP地址就可以找到对方,同时把IP包解析出来,得到需要的数据。

ICMP是一个报文协议,因为在TCPIP传输过程中需要传输一些控制信息,也就是网络是否堵塞或者畅通,以及路由的相关信息等。

它可以提供一个简单易懂的网络出错的信息,通常使用的PING命令就是基于ICMP协议的。

TCP协议是传输层在连接过程中应用的协议,它是整个TCPIP的核心。

TCP协议一般要通过“三次握手”的方式建立连接。

TCP协议起到承上启下的作用,与底层和高层的协议进行通讯,以确保整个系统能够有效的连接并能够和其它系统可以进行数据传输。

4.3.2嵌入式TCPIP设计

TCPIP协议比较复杂,因为嵌入式设备的资源和效率都是够用就好,因此在嵌入式系统上面来设计一个TCPIP协议要受到相应的限制[28]。

论文在设计的TCPIP框架的时候,考虑到相关的技术要求和需求,设计了一个最有效的框架,它能完成特定的功能,协议框架如下图4.3所示。

图4.3嵌入式TCPIP框架

对于TCP连接,嵌入式系统需要把传递的数据、参数等存入指定的位置中,完成一次简单的数据服务。

TCP服务器端,通过三次握手建立连接,此时,嵌入式系统为被动方,功能是监听服务器的状态,处于被动打开后的listen状态,等待对方发起连接。

收到SYN数据片后,发出SYN+ACK数据片并确认收到对方的SYN,然后,更改状态为SYN_RECEIVED。

最后接收到发送端返回的一个包含ACK的空数据片,至此,完成了三次握手,进入ESTABLISHED状态,发送端和服务器端就可以进行TCP数据通讯。

嵌入式系统在第一次建立连接时,初始化序列号。

随后,系统不会记忆TCP连接的序列号,根据发送端发包中的值来确定序列号,重复报文不能识别,对重复的报文照常回应。

设计中,嵌入式服务器响应客户端的请求时,不考虑失序问题,接收一个发送一个确认回答。

接收到TCP请求后,将存储于发送缓冲存储器中的数据立即发送,只需一个数据报就能完成。

嵌入式系统采用滑动窗口为1的传输方式,即发送一次数据包就等待返回应答,因此当接收不到确认包,就认为自己发送的包丢失,直接发送上次发送的数据。

当TCP的连接中,当客户机异常导致连接崩溃时,嵌入式系统发数据时会接受一个复位信号,回到原始状态。

在TCPIP网络应用中,通信的两个进程间相互作用的主要模式是客户服务器模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。

客户服务器模式在操作过程中采取的是主动请求方式。

首先服务器方要先启动,并根据请求提供相应服务:

(1)打开通信通道并告知本地主机,某一公认地址上接收客户请求;

(2)等待客户请求到达该端口;

(3)接收到重复服务请求,处理该请求并发送应答信号。

接收到并发服务请求,就要激活新进程来处理这个客户请求。

新进程处理此客户请求,但并不需要对其它的请求作出应答。

服务完成后,关闭此新进程与客户的通信链路,并终止;

(4)返回第二步,等待另一客户请求;

(5)关闭服务器。

4.4.编程模型

4.4.1TCP客户端设计

TCP客户端向服务器提出连接请求,ServerSocket收到TCP连接请求后,为这个请求创建一个新的实例Socket,此时,服务器端要同时处理ServerSocket和Socket这两个实例,客户端只使用Socket实例就可以了。

TCP客户端的设计按照如流程图4.4所示:

图4.4客户端程序简单示意图

首先客户端建立自己的自己的socket,如果建立失败,则重新建立;当建立成功后,验证通过后,开始和服务器端进行连接,连接成功后,服务器端给客户端一个连接成功的信息,然后开始进行数据的传输通讯。

此时,可以显示所接受的数据的相关信息,包括字节数、数据属性等信息,从而完成一次连接。

下面为TCP客户端设计的详细说明:

Intmain(intargc,char*argv[])

其中第一个参数表示执行后参数个数,第二个用来存储输入的参数

if(argc!

=3)

printf("thisiserror!

InputtherightIPandPORT!

andtheIPis192.168.0.*4000\n");

IP输入错误的时的提示信息

sendsocket=socket(TCP_net,BUFFER_data,0);

TCP发送端建立一个socket函数

if(sendsocket==-1)

printf("thisiserror,thenewsocketend\n");

printf("OK,thesendsocketiscreatedt\n");

return(0);

socket建立信息提示,建立不成功,结束当前程序,回至初始位置,等候重新建立

connectcheck=connect(mysocket,(structsockaddr*)&addr_remote,sizeof(structsockaddr));

调用connect函数来连远方的服务器端

if(connectcheck==-1)

printf("error!

!

!

sorryyou!

programend");

验证建立的connect是否成功,如过不成功结束当前程序,回到初始的位置

printf

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1