




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 第 67 页 共 68 页本科毕业设计说明书(论文) 目次1 绪论21.1 课题研究背景及意义21.2 嵌入式系统的现状和发展趋势21.3 嵌入式网络的关键问题41.4 本论文的主要工作42 ARM嵌入式系统62.1 系统开发环境62.2 ARM嵌入式硬件平台72.3 搭建ARM嵌入式开发环境92.4 PC机Linux开发环境的建立232.5 本章小结233 ARM嵌入式以太网通信的开发253.1 OSI网络模型253.2 TCP/IP协议栈的基本概念253.3 TCP协议基本概念263.4 UDP协议293.5 本章小结314 ARM嵌入式的以太网通信程序设计324.1 TCP通信程序设
2、计324.2 TCP网络程序设计流程344.3 TCP服务器/客户端网络程序的实现434.4 UDP通信程序设计484.5 UDP服务器/客户端网络程序的实现534.6 本章小结56结论57致谢58参考文献59附录 160附录 263附录 3661 绪论随着信息技术的迅猛发展,在我们的生活工作中,对于网络通信的要求逐年增高,且随着移动互联网络的发展与需求,嵌入式系统与通信网络,日日夜夜伴随着我们。嵌入式系统与网络技术融合已经是必然的发展趋势,当嵌入式设备具有网络功能时,人们可以在任何地方、任何时间、任何平台随时浏览设备的信息,并进行操作和测试。这是在嵌入式系统在其网络性和开放性的发展趋势。1.
3、1 课题研究背景及意义如今,我们的生活与工作中已经无法离开网络。人们进行信息的传送和交流,之所可以实时且效地,恰是因为有“信息高速公路”,而“信息高速公路”的重要支撑网就是以太网1。“以太(Ether)”这个词,是来源自十九世纪的物理学家们假设出的某种媒介,用以传播电磁波的辐射。在下,他们认为“以太”充斥于世界各处,因此,到后来将“以太”这个假说引入到计算机局域网中,从而用来表现它在通信领域也是无处不在,就像“以太”充斥于世界中那样普遍存在。以太网可以方便的接入网络,以太网使用的通信协议也因为适用性,有着十分优异的兼容性。当前,在嵌入式系统接入因特网的所有技术中,被使用最多的局域网通信技术即是
4、以太网通信。通过以太网可以十分方便地搭建局域网,因而能与因特网链接。嵌入式系统的开发与设计有了前所未有的空间与机遇,对于嵌入式系统的发展应用,任何时候都有机会跨入嵌入式以太网时代,这些都是需要两者技术上的完美融合。只要完成了嵌入式系统与以太网的链接,使嵌入式系统发展成为以太网中单独的一个节点,用户在节点可以通过网络,便捷且低代价地进行数据传输。所以为了实现整个系统的数据的传输功能,而在嵌入式系统与以太网链接的方法上做相应的研究,是具有十分重要的经济价值和现实意义的。在这种背景下,本文对基于ARM的以太网通信的这一问题,进行研究与应用,具有充分的实际意义。1.2 嵌入式系统的现状和发展趋势几乎电
5、子设备所有新的生机都与嵌入式系统的发展关系紧密,在电子通信、医疗卫生、轻工业产品、监控安防、消费类电子、工业自动化系统等行业都有重要的嵌入式相关产品。 尤其是在消费电子相关产业,占有最高的嵌入式系统的产品的市场比重,监控安防、电子通信、医疗卫生以及其他领域紧随其后。近十几年来,嵌入式系统得到了根本性的发展。微处理器、微控制器大量在产品中使用,CPU 也从当初8 位的单片机发展到现在的16位、32位甚至64 位的高端微处理器;从仅具备单一内核发展到提供丰富外设及接口功能;从几兆的频率发展到现在几百兆甚至12G 的处理速度。伴随着CPU性能的不断攀升,嵌人式系统也具备了文件系统、网络系统、图形界面
6、系统等功能,并形成了以嵌入式操作系统为核心的嵌入式软件体系。跟随应用程度的不断加深扩大的嵌入式系统,全新领域应用以及商品化的需求在嵌入式系统软硬件上面表现出了更高的需求。嵌入式系统不仅仅具有微小性、低功耗、高可靠性的特点,还要向高实时性、高自适应性、易于操作和棋块化的方向发展2。总的说来,嵌入式系统在以下几个方面将会有更大的发展:1. 嵌入式操作系统:嵌入式系统刚刚发展的时候,软件系统还是前后台方式的系统开发,这种开发方式也被大多数人比喻为“裸奔”。前后台方式下的软件系统的实时性差、功能单一、代码不易于维护等缺点越来越不适应嵌入式系统的高速发展,为此嵌入式操作系统被引人。嵌入式操作系统的使用能
7、够更加丰富嵌人式系统的功能,使得产品更加稳定可靠,多任务并发的处理方式也让系统的实时性要求得到满足,模块化的编程方式让产品的可定制性进一步增强。当前普遍使用的嵌入式的操作系统有Windows CE、C/OS-II、Linux、VxWorks等。这些嵌入式操作系统中当属Linux具有最高的人气和应用潜力,原因是其源代码公开且具有很好的定制性和可利用性,支持硬件广泛、安全可靠、拥有众多的开发者,另外有一重要原由便是产品生产商们在研发基于Linux系统的相关产品时,通常不必为发行软件或者生产产品而支付Linux的许可费用。目前广泛应用在手机、PAD等消费电子产品上的安卓操作系统,便是由Linux的内
8、核所开发出来的。由此可见嵌入式操作系统,特别是嵌入式Linux系统应用潜力巨大。2.网络互连:网络技术已经深入到我们生活和工业生产的各个领域,由互联网引发的物联网技术正在快速发展中,网络也使得人与人、设备与设备之间的联系更加紧密,嵌人式设备为了适应网络技术的发展,必然要求在硬件上提供各种网络通信接口。传统单片机的系统对于网络连接有很大欠缺,然而现在的嵌入式处理器,却拥有了内置的网络端口,不仅拥有对TCP/IP协议的支持外,对于USB、总线、IEEE1394、蓝牙、或红外通信接口的支持,拥有上述通信接口中的一项或者多项,而且还对物理层提供其驱动的软件,以及对应的通讯网的协议脚本。3.易于操作的人
9、机界面:嵌入式产品是为人们的生产生活服务的,如果目前的嵌入式设备还像以前DOS系统那样使用命令行操作方式的话,就不会便于人们使用和操作,那些给我们生产生活带来方便和事受的电子高科技产品也不会产生,嵌人式产品被大家使用和接受的程度也将大大降低。嵌入式系统的普及和应用离不开亿万大众,嵌入式产品的亲和力和人机互动性起着决定性的作用。我们都希望在一套图形漂亮、直观简洁的界面下,仅仅通过手指点击就完成我们的操作。苹果产品的热卖,平板电脑、智能手机的普及就充分说明了这点。1.3 嵌入式网络的关键问题 在嵌入式网络上面,主要关心如下2部分的问题1. 嵌入式本身的内存大小以及其运算速度,这些硬件问题需要被考虑
10、,虽然AT91SAM9G20有着较高的主频,但也要尽量的减少系统开支,达到最大的效率。2. 搭建合适的平台以完成通信,选择合适的平台将大大降低网络搭建的工作量,所以依照所需要的功能搭建通信平台。1.4 本论文的主要工作本课题通过对基于ARM嵌入式的以太网通信的研究,主要采用由Atmel公司推出的AT91SAM9G20芯片、DM9161AEP网络芯片、Nand Flash等形成设计基础,在ARM嵌入式平台中移植Linux内核,通过Linux操作系统完成TCP/IP、UDP/IP通信的功能,最终在YL-9G20开发板上进行硬件测试。本文第2章介绍了基于ARM的嵌入式系统硬件平台,介绍了基于ARM的
11、嵌入式系统硬件平台的组成以及开发平台的组建,重要硬件实现部分的构成,囊括相关芯片的问题进行依次进行叙述,且对核心处理器芯片、网络控制芯片的内部结构、实现功能以及其工作的原理,分别做了相关简介;以及论述服务器端的开发环境搭建,以及基于ARM的AT91Bootstrap的移植,U-Boot的移植,Linux内核配置与根文件系统的移植。本文第3章介绍了以太网通信的基本理论,通过Linux系统实现TCP/IP、UDP通信协议,体现了Linux操作系统实现网络通信的技术优势,分别讲述协议栈中ARP、IP、ICMP、TCP、UDP协议的实现过程,同时也介绍了协议栈与底层设备及应用层的接口设计。最后介绍了运
12、用socket套接字接口进行网络程序编写的流程。本文第4章介绍了基于ARM嵌入式的以太网通信程序的设计。论述了TCP、UDP网络编程,且在服务器和客户端测试TCP、UDP通信,实现基于ARM嵌入式的以太网通信功能,完成通信程序的编写。2 ARM嵌入式系统目前,嵌入式系统相关技术已经在工业系统、个人消费电子产品、工业系统、智能家居等领域有着良好发展,其中多数伴随嵌入式系统产品的就是其嵌入式网络系统的开发,ARM嵌入式微处理器一般具有如下特点:体积小、低功耗、低成本、高性能;支持Thumb(16位)/ARM(32位)双指令集,能很好地兼容8位/16位器件3。本章,主要讲述嵌入式系统的硬件平台模块以
13、及发开环境。2.1 系统开发环境系统开发环境主要由硬件部分包括计算机、ARM9开发板、网络设备;软件中包含:嵌入式Linux的开发环境以及相关设备驱动、SecureCRT组成。软件部分的工作均在计算机PC(Personal Computer)上完成,嵌入式Linux开发环境负责程序的开发和调试,SecureCRT可以打印串口输出的数据,以及通过串口向开发板发送数据。ARM嵌入式系统的开发环境如下图 2.1 所示。图2.1 系统开发环境图PC机提供了程序编写开发和调试的平台,搭载了Linux操作系统的开发环境和SecureCRT串口调试工具,完成嵌入式Linux系统的移植以及相关环境的搭建、程序
14、的编写以及调试的功能。通过串口和USB接口连接开发板,在PC机上进行对开发板的相关操作,通过以太网口完成PC机与开发板中的网络芯片的以太网通信的硬件连接,实现以太网通信。2.2 ARM嵌入式硬件平台硬件系统是ARM嵌入式系统一切的根本,实现产品的基础就是硬件平台,实现产品的附加服务,则需要软件的帮助。为了实现本文的目标 - 基于ARM嵌入式的以太网通信程序设计,我第一步要做的就是进行对ARM嵌入式系统硬件的学习和了解,所以在下面几节对于ARM嵌入式系统的硬件平台结构以及关键器件芯片进行介绍。2.2.1 嵌入式硬件平台结构由上一节图2.1可以看出,ARM嵌入式平台需要通过以太网网络芯片和以太网口
15、完成网络的联通;以及需要USB和串口对程序和内核等进行下载烧写以及调试;同时,我们还需要存储部分以及实时时钟来提供支持,当然电源模块为整个ARM嵌入式开发平台提供运行的保障 。如图2.2 所示为本文所需的ARM嵌入式系统的硬件结构。图 2.2 ARM嵌入式平台硬件结构通过RJ45连接到PC机,在完成前期工作后,通过设置端口,运行服务器端(PC机)和客户端(ARM嵌入式平台)中的网络程序即可实现TCP或UDP协议的通信。2.2.2 嵌入式处理器在嵌入式系统中,处理器依照其性能高低分别为嵌入式微控制器以及嵌入式微处理器。在一些低端如:简单运算处理、逻辑控制、IO控制等场合中,通常使用微控制器,这些
16、微控制器大多是16位或8位的。而在应用一些复杂运算、有处理速度需求且实时性要求的场合中,使用的处理器多是32位甚是64位的微处理器。从2.1.1节的硬件结构可以看出,我们需要完成通信和数据处理的相关任务,要求处理器具有较快的处理速度,然而处理器的系统时钟对处理速度起决定性作用。本文使用的ARM嵌入式硬件平台使用的处理器AT91SAM9G20,Atmel公司的AT91SAM9G20芯片主频达400MHz,完全满足应用需求4。AT91SAM9G20微处理器基于ARM926EJ-S处理器核心内核,包含3个32位并行的I/O控制器,可控制SDRAM以及包括Nand Flash在内的静态存储器。如图2.
17、3为该处理器的结构图。图2.3 AT91SAM9G20结构图2.2.3 网络芯片时今网络硬、软件技术的快速发展使得网络设备的应用呈现大幅增长的态势。控制各类仪器仪表、智能家电、消费电子产品、工业生产中的设备,以及它们相关数据采集的设备都开始了网络化,在Internet中共享及获取资源,从而进一步方便我们的工作和生活。以太网通信,顾名思义,我们需要实现网络连接,也就离不开网络控制芯片。在我完成设计的过程中,必要解决的就是硬件平台同以太网的通信问题。本文中使用的ARM嵌入式平台采用了DM9161系列的网络控制芯片DM9161AEP,DM9161AEP的结构图如图2.4所示。DM9161AEP的芯片
18、特点如下所示:1.48pin LQFP封装2.工艺:0.25m,输入输出供电电压3.3V,模拟部分2.5V3.支持MII和RMII连接方式(推荐使用MII)4.支持双绞线自适应(AUTO-mix)5.支持TCP/IP硬加速6.与大部分厂家的微控制器是完全兼容。使用的单口PHY。图 2.4 DM9161AEP 结构图 2.3 搭建ARM嵌入式开发环境在上面介绍完ARM嵌入式系统的硬件平台,展开了软件方面的工作。对于嵌入式系统的软件开发来说,需要完成建立交叉编译工具;由于嵌入式系统所使用的芯片型号多种多样,很多芯片和硬件接口不能直接兼容6,我们需要完成移植的工作:AT91Bootstarp移植,U
19、-Boot移植与烧写,Linux内核移植与烧写,根文件系统移植与烧写,PC机上开发环境的建立等任务。2.3.1 嵌入式Linux简介Linux最早是由Linus Torvalds所创建的,经过20年时间的发展,Linux已经成为一个有着强大功能且稳定可靠的OS。经过对原有的Linux操作系统进行调整和剪裁,形成了可在嵌入式平台运行的嵌入式Linux操作系统。嵌入式Linux操作系统拥有嵌入式操作系统的全部特征,同时保留了十分丰富的开放的源代码,所以应用在嵌入式系统中是越来越普遍。嵌入式Linux操作系统与其它嵌入式操作系统相比具有以下特点:1. 开放源代码。Linux最大的特点就是源代码公开并
20、且执行GPL协议,嵌入式Linux开发人员根据自己产品的需求可以更改内核源码来满足功能使用;不存在黑箱技术,遍布全球的众多Linux爱好者又是Linux开发的强大技术后盾5。2. 可裁剪、高效率的微小内核。Linux小内核、高效率,内核的更新速度快而且可以被定制。它的系统内核最小可以到134KB,这么优秀的内核设计可以使系统的仅仅占据更小的资源便可以可靠且稳定的运行。独特的模块机制可以将用户的驱动或者应用程序模块动态的从内核中插入或卸载。3. 免费。产品制造生产商在开发完基于嵌入式Linux的产品以后无需为产品的发布支付相关的许可费。4. 支持众多硬件。嵌入式Linux操作系统可以支持多种处理
21、器和多种硬件体系,是一种可以跨越平台的操作系统。5. 安全、可靠。嵌入式Linux十分可靠,可以毫无故障的运行数年,一直广泛被数据中心所应用。与此同时,嵌入式Linux的开发人员还可以使用systrace或者grsecurity此类的工具来加强其安全性,这是Windows操作系统开发者无法想象的。6. 优秀的网路功能。嵌入式Linux在网络方面有着十分完整的内核结构,Linux对网络中最常用的网络协议,如TCP/IP网络通信协议有着整体的支持。并且提供包括了10兆、100兆、1000兆的以太网络的支持。因此嵌入式Linux十分适用于网络相关产品的开发。嵌入式Linux的应用,主要在数字电话、机
22、顶盒、视频通信、数据网络、以太网交换机、Hub、远程通信、网桥、医疗电子、信息家电、PDA、工业等领域。可以说嵌入式Linux在民用还是工用范畴都有着普遍应用,当前很多平板电脑和智能手机采用的安卓也是采用Linux的内核。2.3.2 ARM嵌入式系统一般的开发方法与多数常见的桌面软件的开发所不同,当嵌入式软件开发人员开发一个基于嵌入式系统的应用时,首先会在PC机上选择合适的嵌入式开发环境并且进行软件开发,然后在实验板或者开发平台上对其代码进行测试,最后PC机编译生成正确的映像文件或者可执行的文件,并且烧写到最终的目标产品中,如图2.5所示。图 2.5 ARM嵌入式系统开发的一般方法对于ARM嵌
23、入式平台的Linux软件开发一般步骤如下:1. PC机的开发环境选择。这里本文选择的是Fedora 14 系统。通过在Windows系统中的虚拟机来安装Fedora 14操作系统,便于调试。2. 建立交叉编译工具:Fedora 14自带的GCC都是针对x86架构的,为了可以让编写的代码在开发板或者最终产品上良好运行,建立交叉编译工具是所必须条件。3. 开发、移植Bootloader。4. 配置、烧写U-Boot。5. 配置、移植Linux内核。6. 建立根文件系统。7. 开发程序。2.3.3 嵌入式Linux交叉编译环境的建立嵌入式系统的硬件性能和其存储空间有限,因此,在对程序进行开发的时候都
24、是在PC机上进行操作,首先建立一个用于开发板的交叉编译工具,用其在PC机上编译程序用于开发板。可以看出,可以在一个系统平台中编译出能够运行在不同的体系架构上的代码,这就是交叉编译。比如在处理器架构为x86的微机中编译出可以运行在ARM嵌入式中的代码。若使用桌面级编译环境,则无法生成在ARM平台上运行的程序代码。在PC机Linux系统下利用GCC编译程序,这样的编译方法称之为本地编译,本地编译的代码只能够在本地运行。与本地编译相对应的,即是上面所介绍的交叉编译,通过交叉编译器可以编译出这种跨平台程序。采用arm-linux-gcc-4.3.2版本的交叉编译工具,通过网络下载到的文件解压到个人目录
25、中。随后由终端进入解压后生成的/usr/local/目录中,将目录下的arm目录整体复制到系统文件根目录/usr/local/下面。然后所有交叉编译工具都存储在其中,如图2.6所示。图2.6 交叉编译工具 arm-linux-gcc-4.3.2然后更改环境变量PATH的函数,将统一存储的交叉编译工具的路径目录添加到其中。在终端中对PATH进行修改,键入:#export PATH = /usr/local/arm/4.3.2/bin: $PATH继而检查是否正确添加路径到PATH中,键入:#echo $PATH如图2.7所示,可以看到,有显示包含有交叉编译工具的路径,说明已完成添加新路径至PAT
26、H。至此,已经完成交叉编译环境的搭建。图2.7 添加交叉编译工具环境变量2.3.4 开发、移植AT91Bootstrap在AT91SAM9G20芯片内部含有一个BootRom代码。当没有烧写任何Bootloader和内核文件的情况之下给芯片上电启动,通过串口调试工具(本文使用SecureCRT)可以看到串口是有打印消息的,显示的内容为“RomBoot”,此RomBoot代码是Atmel厂商定制在芯片中的,人为不能对其作修改。作为ARM嵌入式开发人员,在启动代码的编写、修改和学习中,AT91Bootstrap是最先面对的环节。AT91Bootstrap它的主要作用即是对SDRAM初始化以及相关的
27、存储器(Nand Flash)初始化,然后加载U-Boot到SDRAM中的指定字节并开始运行U-Boot。AT91Bootstrap源代码由公共的硬件驱动、头文件以及库文件等组成。首先,解压下载的AT91Bootstrap,在终端中输入:#unzip AT91Boostrap1.13.zip解压后,在当前目录下生成AT91Bootstrap目录。进入相应9g20源码区,修改编译工具的路径,打开其文件夹,使用vi进行函数修改此时,可以直接编译,在源目录下执行“make”指令。编译过后可在该目录下看到nandflash_at91sam9g20ek.bin文件,如图2.8所示。#cd /home/d
28、ietrich/Bootstrap-v1.13/board/at91sam9g20ek/nandflash#make图2.8 make编译后生成bin文件在这里就完成了ARM嵌入式系统的Bootstrap编译,接下来使用SAM-BA2.8烧写生成的.bin文件至Nand Flash内存的起始地址处,即0x0,也就是处理器启动以后首先要从NandFlash上的)0x0地址位上读取AT91Bootstrap且开始运行,这也说明在启动代码中,AT91Bootstrap是第一部分。2.3.5 U-Boot移植与烧写U-Boot的编译形式、源码目录都喝Linux的内很很相似。实际上,很多U-Boot源代
29、码就是通过对应的Linux系统内核弱化而来,特别是很多设备驱动程序。可以在U-Boot源代码的注释行中有很多表现。随着U-Boot版本不断的升级,其所支持的硬件资源和系统资源也是越来越丰富。U-Boot有着诸多优点:源代码开放、对很多系列的处理器支持、对很多嵌入式OS内核支持、十分灵活的功能设置、优异的稳定以及可靠性、多种设备的驱动源代码以及对网络的强大支持。正是因为这些特点使得U-Boot被越来越多的嵌入式操作系统所应用,也有着更好的使用前景。U-Boot启动并且引导Linux内核这一过程可以分为两个阶段,第一个阶段即为实现设备的初始化,绝大多数是采用汇编语言所编写来达到目的的;第二个阶段则
30、是采用C语言编写,可读性强,并可实现相对复杂的功能。两个阶段实现的功能如下:1.第一阶段功能:设置异常项和异常处理函数;- 设置控制寄存器地址;- 关闭着门狗和屏蔽中断;- 配置PLLCO飞等寄存器,确定系统的主频;- 关闭MMU功能;- 初始化RAM控制寄存器;- 拷贝数据至SDRAM;- 设置堆拢;- 消除BSS段;- 跳转到第二阶段代码人口。2.第二阶段功能:- 初始化本阶段所涉及的硬件设备;- 设置SDRAM的起始地址和大小;- 读取内核到RAM 中;- 为内核设置启动参数;- 调用内核。可以从网络上下载U-Boot。本文采用的版本是1.3.4。在终端中使用解压命令将U-Boot-1.
31、3.4.tar.bz2压缩文件在个人文件夹内进行解压操作,然后进入生成的u-boot-1.3.4目录对Makefile文件进行修改,将CROSS_COMPILE变量修改为编译器所在目录(本文2.2.3节)。保存退出vi后对U-Boot进行make编译,即可在文件目录下生成我们需要的二进制.bin文件。图2.9 编译后生成的bin文件烧写U-Boot的方法仍然与上一节烧写AT91SAM9G20相同,如图2.10所示,也是通过SAM-BA软件。不过需要注意的是烧写起始地址应为NandFlash的0x200000地址处,然后Send File开始烧写u-boot.bin。图2.10 烧写U-Boot
32、.bin2.3.6 嵌入式Linux内核的移植及烧写嵌入式Linux内核在本文中选择Linux-2.6.27这个一个版本,解压Linux-2.6.27.tar.bz2压缩文件,可以观察到源码包内有相当多的文件和目录,为了掌握Linux内核的移植方法,了解其结构很有必要的。Linux-2.6.27内核包中一共有20个文件夹,有很多都与本文无关,不做介绍,下面只介绍最为重要的7个文件目录:1. arch目录。arch子目录包括了和硬件体系相关的核心代码。它的每一个子目录都是代表一种可以支持的硬件体系结构,例如i386 就是关于Intel CPU 及与之相兼容体系结构的子目录(PC 机一般都基于此目
33、录)。其中的arm 目录是我们需要特别关心的,里面包含的是基于ARM处理器的体系结构,是本文对Linux 进行移植所需用到的目录。2. drivers目录。drivers 子目录里面是Linux系统所支持的硬件设备驱动程序;每种驱动程序各占用一个下级子目录,如/usb目录下为通用串行总线USB设备驱动程序。对drivers/block/这个目录下的genhd.c文件进行查看,其中的device_setup()函数可以了解设备初始化的过程。3. fs目录。fs子目录包含的是所有文件系统和各种类型的文件操作代码,此目录包含用于配置核心的脚本文件等。4. kenerl目录。此目录内为核心代码,包含了
34、进程通信、进程调度、内存管理、虚拟文件系统等在内的Linux系统大多数的内核函数。5. include 目录。include 子目录包括编译核心所需要的大部分头文件。6. init 目录。这个目录内包含初始化代码。7. lib 目录。lib 子目录里面包含Linux 内核库函数代码。在Linux 内核源码的根目录下还有一个文件需要特别注意,就是“Makefile文件”。它是Linux内核里面的第一个Makefile文件,其主要用来联系内核的各个模块,保存各种模块互相间的承接关系以及连接,在进行内核编译的时候需要修改这个文件。对Linux内核的配置修改,是移植Linux内核的流程中所做的第一步,
35、亦是相当重要且十分繁杂的一步。内核配置相当繁杂,有3000条左右需要配置,掌握一些方法可以降低工作的难度。在内核源代码/arch/arm/configs目录中的配置文件可以看出Linux内核所支持的硬件都有哪些,在这里本文使用的ARM嵌入式硬件平台与Linux内核中提供的AT91SAM9G20EK很匹配,所以在配置内核的过程中可以直接加载AT91SAM9G20EK这个配置文件,然后在这个配置文件的基础上再做修改就可以了。这样大大的提高了内核的配置效率和准确度。在Linux内核的配置上,需要对文件系统、杂项、网络设备支持、设备驱动等进行设置,第一次设置之前需要在终端里清除设置,以免出错。通过ma
36、ke menuconfig。如图2.11所示进入配置菜单界面。图2.11 Linux内核配置界面进入File systems文件系统选项,如图2.12所示,从杂项文件系统中查看是否支持cramfs文件系统(本文使用的文件系统)。图2.12 cramfs文件系统支持然后进入Device Drivers选项中的网络设备支持。如图2.13所示然后进入图 2.13 网络芯片驱动支持Ethernet(10 or 100Mbit)选项,选择需要的网络芯片的驱动,进行添加。最后退出配置界面并且保存设置,即完成Linux内核的配置。然后在终端进入Linux内核源码的目录下,为了防止编译报错,执行make cl
37、ean 清除之前生成的过程文件。然后执行make uImage,如图2.14所示生成zImage镜像文件。图2.14 编译生成的内核镜像文件然而,还需要使用mkimage工具去编译内核文件,可以将其放在/usr/bin文件夹中,这样可以直接编译生成uImage。然后烧写内核文件,同之前一样,也是利用SAM-BA软件。在烧写完成AT91Bootstrap以及U-Boot后继续烧写uImage内核。但是还要注意烧写的目的地址为0xA0000。然后开始下载内核镜像文件uImage到Nand Flash中。2.3.7 根文件系统的移植Linux必须在硬件的一个分区上存放系统启动所必需的一些文件7,即根
38、文件系统,它是嵌入式Linux组成中一个特别重要的组成,它是嵌入式Linux运行里所必须的,Linux内核运行以后,会自动寻找并且挂载自己的根文件系统,然后执行根文件系统中的可执行文件或启动脚本,嵌入式Linux的应用程序在经过交叉编译后,生成的可执行文件也是需要放在根文件系统里的。CramFS是本文所采用的根文件系统,它是一个压缩式的、十分小且简单的文件系统。首先在用户文件夹创立一个名为cramfs的目录,并且将根文件挂载到目录下,将根文件系统和cramfs相对应。然后通过mkcramfs工具再次打包,形成新的根文件。如图2.15所示。图2.15 生成根文件系统烧写根文件系统与前面的Linu
39、x内核、U-Boot、AT91Bootstrap不同,本文使用tftp的方式烧写根文件系统,因为根文件系统可以做到很大,采用串口或并口传输会很慢,通过网线使用tftp的方式烧写要快捷很多。如图2.16所示,windows下的tftp界面。设置configure中的Home Directory为当前存放根文件映象的目录,网线连接开发板,上电,点击软件中的Start可以看到左下角显示Server is running,表示tftp服务器运行正常,设置完毕。图2.16 tftp启动界面启动串口调试终端软件SecureCRT,接下来重新给开发板上电,在等待进入U-Boot倒计时的时候按住空格键,直接进
40、入Boot界面,在这个U-Boot中设置tftp的服务器(PC虚拟机上Fedora)及客户端(开发板)的IP地址。如图2.17所示。图2.17 设置TFTP服务器及客户端的IP通过U-Boot命令下载根文件系统镜像到目标板内存中,如图2.18所示,烧写根文件到内存地址0x20000000处。同时把内存中的根文件系统镜像复制至Nand Flash,从而完成对ARM嵌入式的根文件系统的烧写。图2.18 在boot通过tftp烧写根文件系统2.4 PC机Linux开发环境的建立在之前,已经安装了交叉编译的环境,本应属于本节的内容,但编译内核、U-boot等都对其有需要,所以不在本节叙述。对于程序开发
41、的环境,本文使用集成开发环境Eclipse。Eclipse集成开发环境仅仅只是个平台框架,不过各种插件对其支持从而使得其获得别的功能单一IDE工具难以比拟的灵活性。选择Eclipse还有一点,即是Eclipse的图形界面的开发方式和其良好的框架设计体系。这对习惯Windows图形界面下开发方式的人员来说要方便许多。在Fedora14系统中,在安装时选择全部安装,在安装完毕以后,可以直接在程序里的编程目录中直接启动Eclipse。如图2.19所示Eclipse的工作界面。图2.19 Eclipse工作界面对于Eclipse的的使用,本文将在第4章嵌入式通信程序的设计中给予说明。2.5 本章小结本
42、章介绍了ARM嵌入式Linux构建的相关知识,也是进行ARM嵌入式以太网通信程序开发首先要面对的工作,具体涉及启动代码、内核、根文件系统的编译和配置、PC宿主机开发环境的搭建以及Eclipse软件的应用。完成了AT91Bootstrap、U-Boot、Kernle、CramFS 的编译和配置。在编译过程中会出现的问题本章也做了说明并提出了解决办法。这部分知识具有一定的通用性,其中Eclipse是进行代码调试常有效的软件平台,熟练掌握后可以很有效地进行嵌入式linux代码的编写和在线仿真调试。3 ARM嵌入式以太网通信的开发Linux系统的一个主要特点是它强大的网络支持功能,它在网络方面的应用也
43、越来越广泛。本章叙述了TCP/IP 协议和Linux 网络开发的基础知识,本章是下一章TCP服务器、TCP客户端开发,UDP服务器以及UDP客户端开发程序设计的理论基础。3.1 OSI网络模型网络结构的标准模型是OSI模型。它是很多网络协议模型的基础,目前大多数的网络通信协议都是基于这个模型建立起来的,这种分层的思想在很多领域中都得到了广泛地应用。OSI协议参考模型从上到下共分为7层,分别是:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。OSI七层网络模型及其功能如表3.1所列。表3.1 OSI 7层网络模型OSI层功能应用层 文件传输,电子邮件、虚拟终端 表示层 数据格式化、代
44、码转换、数据加密 会话层 解除或建立与别的节点的联系 传输层 提供端对端的通信接口 网络层 为数据包选择路由 数据链路层 传输有地址的帧以及错误检测功能 物理层 以二进制数据形式在物理媒体上传输数据 在OSI七层网络模型中,各层之间的规则是相互独立的,每层通过下一层的数据为上一层提供服务,不同主机相同层次之间是对等的,每一层都规定了不同的特性并完成不同的功能。3.2 TCP/IP协议栈的基本概念上节中简单介绍了国际互联网标准化组织推荐的OSI网络模型,但OSI模型过于庞大且较为复杂,具体实现有很多困难。在实际应用中,TCP/IP是网络中使用的基本通信协议。TCP/IP 的协议参考和OSI协议的
45、对应关系如图3.1所示。图3.1 OSI七层模型与TCP/IP四层模型对照图目前有很多种实现的方式,比如串行线路(Serial Line IP, SLIP)、点对点P2P等。在以太网应用中,该层网络在IP数据的基础上增加了一共14个字节的报头,这14个字节被称为以太网报头,其数据格式如图3.2 所示。图3.2 以太网数据格式3.3 TCP协议基本概念TCP协议建立在不可靠的网络层IP协议之上,在IP协议的基础上,增加了确认重发、超时重传、流量控制等机制,实现了一种面向连接的传输协议。建立好连接后,双方便均可收发信息直到连接断开7。TCP协议是在IP协议的基础上进行数据传输的,TCP数据在IP报
46、文中的位置如图3.3所示。图3.3 TCP数据在IP报文中的位置3.3.1 建立与断开TCP连接主机A 与主机B 要想通过TCP协议进行通信,需要通过3个报文段完成TCP连接的建立,这个过程称为三次握手(three-way handshake),即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步8,如图3.4所示。TCP 连接的建立需要双方发送自己的同步SYN信息给对方,在SYN中包含了末端初始化的数据序号,并且需要收到对方对自身发出SYN的确认。三次握手过程为:第一次:主机A向主机B发送连接请求,其中包含SYN段信息,通知主机B主机端口和序号。第二次:主机B应答主机A,向主机A发
47、送建立连接请求,并发送主机B的初始序号,其中ACK段为主机A发送的ISN + l。第三次:主机A将主机B发送的SYN段加1(SYN + 1)作为确认号返回给主机B作为应答。图3.4 TCP建立连接的三次握手过程建立一个TCP连接需要三次握手,而断开一个TCP连接需要四次挥手,其过程如图3.5所示。图3.5 TCP断开连接的四次挥手过程第一次:主机A发送FIN字段到主机B,发送断开连接的请求。第二次:主机B先确认主机A的FIN请求,然后发送ACK字段到主机A,确认序号为主机A序号加上1。第三次:主机B向主机A发送FIN请求。第四次:主机A对主机B的请求确认后,随之断开TCP连接。3.3.2 TC
48、P传输中数据的封装和解封TCP/IP协议中数据传输过程与OSI七层模型相似,只不过是TCP/IP协议只是四层的网络模型,实现起来较为方便。TCP数据通信传输过程如图3.6所示。图3.6 TCP通行数据传输中的封装和解封数据从应用程序发送到物理层驱动程序处的过程是一个将数据封装的过程。在发送数据的主机A中,数据经过传输层增加了TCP头部,再经过网络层增加了IP头部,最后达到物理层驱动程序中并添加了以太网头部,然后将封装完毕的数据发送到以太网中进行传输,送往接收主机B一端。以太网数据包从物理层传送到应用程序处的过程是一个将数据解封的过程。在主机B上,驱动程序从以太网中接收到以太网数据包,将以太网数
49、据包去除头部和尾部后进行CRC校验后发送到网络层,在IP协议层内去除IP头部并发送至传输层的TCP协议,在TCP协议层去除掉TCP头部获得需要的数据,然后将数据传递给应用程序,在主机B上的应用程序最后得到的是去除掉各种协议层头部的有效数据。3.3.3 TCP协议的特点总结TCP 协议具有以下几个突出的特点。1.面向连接的服务:TCP进行数据传输之前必须要建立TCP连接,连接完成后,所有TCP报文的传输都在此连接的基础上进行。2.可靠的传输服务:采用校验和应答重发机制保证传输的可靠性,接收方需要对接收的TCP报文进行校验和计算,如果计算结果错误则不发送确认响应,没有接收到响应的发送端主机将在超时
50、后自动重发刚才的TCP报文。3.字节流服务:TCP协议进行传输的时候将数据视为没有结构的字节流,这样基于这样的字节流传输就没有字节顺序(大端模式/小端模)的问题。4.流量控制:支持端到端的流量控制。3.4 UDP协议用户数据包协议(User Datagram Protocol),简称UDP协议。UDP是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IP协议是TCP/IP协议中最为核心的协议10。UDP 数据报封装成一份IP 数据报的格式,如图3.7 所示。图3.7 UDP数据在IP报文中的位置鉴于UDP协议的上述特点,在网络质量较差的环境下使用UDP协议会出现数
51、据包丢失严重的问题,但使用UDP协议比获得较快的使用速度,我们日常的应用程序中老版的QQ就是使用UDP协议传输11。3.4.1 UDP传输中数据的封装和解封由于UDP协议与TCP协议都同属于传输层,其在网络传输中的作用也比较相似,因此UDP协议数据传输过程中的数据封装和解封过程与TCP协议极为相似。UDP协议层的数据传输过程如图3.8所示。图3.8 UDP通信数据传输中的封装和解封数据从应用程序发送到物理层驱动程序处的过程是一个将数据封装的过程。在发送数据的主机A中,数据经过传输层增加了UDP 头部,再经过网络层增加了IP头部,最后达到物理层驱动程序代码中添加了以太网头部,然后将封装完毕的数据
52、发送到以太网中进行传输,送往接收主机B一端。以太网数据包从物理层传送到应用程序处的过程是一个将数据解封的过程。在主机B上,驱动程序从以太网中接收到以太网数据包,将以太网数据包去除头部和尾部后进行CRC校验后发送到网络层,在IP协议层内去除IP头部并发送至传输层UDP协议处,在UDP协议层去除掉UDP头部获得需要的数据,然后将数据传递给应用程序,在主机B上的应用程序最后得到的是去除掉各种头部的有效数据。3.4.2 UDP协议特点总结UDP协议具有以下特点:1.UDP无连接协议,2.可广播传输相同的消息。3.UDP信息包的开销小。4.吞吐量不受算法的调节。5.UDP是面向报文的。3.5 本章小结本
53、章介绍了TCP协议和UDP协议的数学模型,以及数据转移的流程,这是ARM嵌入式以太网通信程序设计的基础,有了这一章的基础知识,我么可以画出流程图,对TCP和UDP通信的流程进行分解,通过下一章的Linux网络编程套接字的帮助,然后实现其软件的编程,即可实现ARM嵌入式以太网通信程序的设计。4 ARM嵌入式的以太网通信程序设计通过前面几章,完成了本课题的前期工作,也是非常重要的,搭建了开发环境,搭建了嵌入式Linux系统,熟悉了嵌入式的网络知识;熟悉了TCP/IP和UDP/IP的原理;以及学习了嵌入式Linux的网络编程,本章讲述TCP/IP与UDP/IP的以太网通信程序的设计过程,以及在开发板
54、上与PC之间以太网通信的测试。4.1 TCP通信程序设计TCP 网络编程的分为对服务器端和客户端两个部分的的程序设计,通过两端互相接收/发送请求、进行连接和传输数据,TCP协议设计了严格的3次建立连接握手过程、4次关闭连接握手过程11。4.1.1 TCP 服务器踹编程模式TCP 服务器端模式下编程主要分为以下流程:建立套接字socket()、绑定套接字与端口bind()、设置服务器的监听连接listen()、接收客户端连接accept()、接收和发送数据read()/write()。和recv() /send()等、关闭套在字close()。如图4.1 (a)所示为该TCP服务器端模式的流程图
55、。图4.1 TCP服务器端模式流程图1 socket()函数用于对网络、协议以及协议具体参数进行设置,实现套接字的初始化2 套接字与端口的绑定过程中,调用bind()函数将套接字与一个地址结构进行绑定。只有绑定之后才能进行数据的接收和发送。3 函数listen()用来初始化服务器可连接的队列。4 TCP服务器用accept()函数一直监听端口,直到一个客户端的连接请求到达。5 TCP 服务器通过send()和recv()或write()和read()等函数进行数据发送和接收。6 当完成通讯需求后,此时需要通过close()函数去关闭套接字的连接,结束通信。4.1.2 TCP客户端编程模式TCP
56、客户端模式下编程主要分为以下流程:建立套接字、服务器连接、接收和发送数据、关闭套接字。图4.2为该TCP 客户端模式的流程图。图4.2 TCP客户端模式流程图客户端模式流程与服务器端模式流程类似,两者不同之处是客户端直接利用connect()函数连接服务器端,并根据用户设置的服务器地址、端口等参数与特定服务器程序进行通信。在TCP 协议的客户端是不需要绑定端口、监听、接受客户端连接这3个函数的。4.1.3 TCP服务器端与客户端通信过程TCP服务器端与客户端进行数据交换要进行三次握手才可以完成TCP连接,之后才开始进行数据交换12,客户端的读数据过程对应服务器端的写数据过程,客户端与服务器端之间的的读写数据过程是相互对应的。当两者完成数据读写后,关闭套接字的连接,结束通信。该过程如图4.3所示。图4.3 TCP服务器端与客户端数据交互过程4.2 TCP网络程序设计流程4.2.1 创建网络套接字函数socket()socket()函数用于建立一个socket套接字的连接,可指定socket类型等信息。在建立了socket连接之后,可对sockaddr和sockaddr_in两个数据类型进行初始化,以保存所建立的socket信息。socket()函数调用成功后会返回
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纱线环保染料的研发与应用考核试卷
- 废弃资源综合利用的水环境与水资源保护技术考核试卷
- 泡沫塑料的耐候性与耐久性研究考核试卷
- 玻璃纤维增强塑料的耐应力松弛性能评估考核试卷
- 皮革制品的绿色制造与可持续发展考核试卷
- 站内商业资源整合与创新发展模式探索考核试卷
- 矿物在风力发电叶片材料中的应用考核试卷
- 森林改培与生态保护与生态保护与生态恢复材料应用考核试卷
- 珠海市普通高中上学期高二英语期末模拟试题
- 上海市实验学校2025届高三高考全真模拟卷(四)数学试题含解析
- 《陕文投应聘表格》word版
- 建设工程围挡标准化管理图集(2022年版)
- (完整word版)中小学教育质量综合评价指标框架(试行)
- 《新概念英语》第一册单词表
- 半泽直树日语字幕台词(一)
- 最新中建CI报价单-2013.
- 指尖血糖监测
- 拌和站地基承载力及抗倾覆计算书
- 最新公司客户订单流程管理制度
- 生物分离工程第四章膜分离技术.ppt
- +770甩车场设计
评论
0/150
提交评论