毕业设计(论文)-基于STM32的智能建筑以太网与RS232数据传输网关的设计.doc_第1页
毕业设计(论文)-基于STM32的智能建筑以太网与RS232数据传输网关的设计.doc_第2页
毕业设计(论文)-基于STM32的智能建筑以太网与RS232数据传输网关的设计.doc_第3页
毕业设计(论文)-基于STM32的智能建筑以太网与RS232数据传输网关的设计.doc_第4页
毕业设计(论文)-基于STM32的智能建筑以太网与RS232数据传输网关的设计.doc_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于STM32的智能建筑以太网与RS232数据传输网关的设计Design of Ethernet and RS232 Data Transmission Gateway Based on STM32学生姓名:Xxx学生学号:Xxx专业名称:建筑电气与智能化指导教师:Xxx控制与机械工程学院2015年 6月 18日独创性声明本人声明所呈交的毕业设计(论文)是本人在指导教师指导下进行的研究工作和取得的研究成果,除了文中特别加以引用标注之处外,论文中不包含其他人已经发表或撰写过的研究成果,没有伪造数据的行为。毕业设计(论文)作者签名: 签字日期: 年 月 日毕业设计(论文)版权使用授权书本毕业设计(论文)作者完全了解学校有关保留、使用论文的规定。同意学校保留并向有关管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权天津城建大学可以将本论文的全部或部分内容编入有关数据进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本论文。(保密的毕业设计(论文)在解密后适用本授权说明)毕业设计(论文)作者签名: 指导教师签名:签字日期: 年 月 日 签字日期: 年 月 日摘 要根据RS232与以太网的特点,为了实现以太网与RS232数据传输网关的设计,提出一种基于STM32微控制器的数据传输转换接口器的设计方法。充分发挥STM32F107控制器的超强功能,利用通用输入输出口、时钟、中断控制及以太网等辅助功能去阐述设计原理,并细致地给出相应的硬件电路。网关设计的软件应该采用模块化设计,每个相应的模块都应该做成独立的函数,以便调用时更省时,运用主程序和中断服务程序对数据传输功能进行软件实现。在设计的过程中实现了以下三点功能:第一点,实现了使用STM32芯片来设计网关电路;第二点,实现了网关具有以太网接口和RS232接口;第三点,在设计软件的过程中,实现了以太网TCP协议到串行数据协议的转换传输。关键字:STM32F107;以太网;RS232;数据传输网关;ABSTRACT According to the characteristics of RS232 and Ethernet, gateways for Ethernet and RS232 data transmission design, proposed a STM32 microcontroller-based design method of data conversion interface. Super STM32F107 controller function into full play, and using general purpose input/output port, clock, interrupt controller and Ethernet, while accessibility and design principles, and detail is given the appropriate hardware. Gateway design software has a modular design, each corresponding modules should be made an independent function, so that when more time, use main program and interrupt service routines for data transmission software. In the design process to achieve the following three functions: 1th , realized using the STM32 chip circuit design gateway; 2nd, implements a gateway with Ethernet interface and RS232 interfaces; 3rd, in the process of designing software, implement TCP protocol over Ethernet to serial data protocol conversion and transport.Key words:STM32F107;Ethernet;RS232;Data transmission gateway;目 录第一章 方案介绍11.1 课题设计背景11.2 课题设计要求11.3 课题设计工作1第二章 主控芯片的选择32.1 STM32微型控制器的选择32.2 STM32F107芯片概述32.3 STM32F107芯片结构42.4 STM32的功能及优势5第三章 网关硬件设计63.1 总体框架设计63.2 电源模块设计73.3 JTAG下载电路83.4 复位电路83.5 以太网模块电路设计93.6 RS232通讯电路设计10第四章 软件介绍114.1 LWIP协议栈简介114.1.1 pbuf结构体定义114.1.2 LWIP协议栈中各层的实现124.1.3 LWIP协议栈的内存管理134.2 IP处理144.2.1 IP接收包154.2.2 IP发送包164.3 TCP服务器的设计和实现164.3.1 TCP协议的特点164.3.2 TCP协议结构174.3.3 TCP连接函数的建立194.3.4 TCP服务器的初始化204.4 RS232的通讯214.5 软件设计214.6 数据转换软件设计22第五章 系统的测试255.1 数据传输简介255.2 硬件连接255.3 程序的调试与下载265.4 软件配置275.5 TCP与RS232的双向数据传输295.5.1 TCP向RS232进行数据传输305.5.2 RS232向TCP进行数据传输315.5.3 测试结论分析32致谢33参考文献34附录36第一章 方案介绍第一章 方案介绍1.1 课题设计背景智能建筑就是把建筑物的结构、设备、服务和管理依据不同用户的要求而进行的最合理的设计,从而为用户提供一个高效、舒适、便利的人性化建筑环境。因此和普通的建筑相比,智能建筑不仅具有居住的功能,还在结构上由单一居住逐渐转换成现代智慧的工具。智能建筑可以提供内部和外部的信息交换和数据传输,帮助人们与建筑内部设备互动,从而有效地安排时间,通过智能建筑建立一个强大的网络系统,实现把家庭设备的各项信息综合在一个平台上。现代智能建筑已经进入数字化、智能化时代,进入物联网时代。要求信息共享,生产过程信息化、网络化管理。在当今高速实时数字信号处理系统中,涉及的数据对象趋于多样化,这些数据通常需要不同的网络接口。具有不同的传输速率,不同的传输方向。由于智能建筑的迅猛发展,为了满足智能建筑现场不同功能模块的信息交换,以及不同网络接口的数据传输要求。因此为了符合上述的要求,提出一种新的设计方法,特别选用STM32微控制器作为数据传输的中心控制器。结合设计要求,提出“基于STM32的智能建筑以太网与RS232数据传输网关”的设计。1.2 课题设计要求 为了使网关的数据传输更加的高效实用,论文的要求是实现利用功能强大的STM32系列芯片设计网关电路。且设计的网关电路必须要同时具备以太网与RS232的接口,这样即能节省费用,又能大大地提高系统的利用率。除此之外,在设计软件程序的时候,设计必须要完成以太网TCP协议到串行数据协议的转换传输。1.3 课题设计工作1.数据传输网关的简介:本次的设计课题为“基于STM32的智能建筑以太网与RS232的数据传输网关的设计”,这次设计相对于以往的数据传输网关设计而言,最大的创新之处是选用了STM32芯片微型控制器。因为设计就是为了不断的创新,不断的优化陈旧的东西,而让原有的设计能够在实现同样的效果的前提下,使设计的成本和时间都能大大的降低,从而达到最好的效率。所以STM32F107芯片显然能达到这个要求,它同时具有以太网和RS232接口的功能,能同时连接以太网接口和RS232接口,并在两者之间起到一个“桥梁”的作用,使两者在进行数据传输的时候,对各自发来的数据包进行解包和打包的操作,最终转换成能传向对方的数据。 2.硬件设计:本次设计的硬件设计理念其实很简单,主要是把整个系统模块化,然后再对各个模块的功能进行细致的阐述。简单的来说,本次设计分为四个模块来进行,分别是电源模块,以太网模块,RS232模块,还有STM32主控芯片。通过对以上四个模块的实现来最终完成数据传输网关的设计。 3.软件设计:充分理解LWIP协议栈的的数据传输,还有RS232串口,再结合GPIO,NVIC和以太网,充分理解以太网到RS232的数据传输过程和RS232到以太网的数据传输过程 。然后根据数据传输的过程写出相应的程序流程图和程序,最终结合硬件设备来完成本次的设计。4.最后完成系统的调试,这是非常重要的一步,因为不管是硬件的设计还是软件的设计,最终还是要为最后的调试服务,假如调试不成功,一切都是白费功夫而已。所以最后需要运用sscomv20(串口调试程序)和TCP-tester来进行模拟的数据传输网关的设计,只有不断的调试和修改,才能最终使得我们的设计符合最终的设计要求。67 第二章 主控芯片的选择第二章 主控芯片的选择2.1 STM32微型控制器的选择在开始设计之前,需要选用同时具有网络接口的以太网和RS232接口的微型控制器,同时要满足设计的其他的一些具体功能,我们不得不选择一个合适的微控制器。因此,STM32系列的微型控制器就给了我们非常多的选择和开发的空间,它提供了全新的32位产品的选择可能性,结合高性能、低功耗、高实用性的出色特点,另一方面又能保持很高的集成度,还有很容易开发的巨大优势。STM32产品至今已经开发出了四大产品系列:L1、F1、F2和F4。具体的不同如下:1.F2系列:不仅拥有以太网接口,还有crypto/hash模块和SDIO模式的音频模块,同时还有一个时钟频率120MHz和2个USB-OTG-FS接口。2.L1系列:它的时钟频率一般来说是32MHz,配带有USB-FS接口,是大家公认的超低功率型控制器。3.F1系列:对于这种系列来说,一般分为基本型和互联型两种,基本型芯片(STM32F103)的时钟频率是72MHz,同时还配有USB-FS接口;互联型芯片(STM32F107)的时钟频率也是72MHz,但是却配有2个USB-OTG-FS接口。除此之外,还拥有以太网接口模块和RS232接口。4.F4系列:它的有一个功能是和F2系列的芯片是一致的,那就是最新微型功能模块。而有所区别的是在功能上有所加强,内部组成有:配有一个Cortex-M4内核,以太网接口模快和crypto/hash模块,一般它的时钟频率可以高达168MHz,还有2个USB-OTG-FS接口。从以上的4种系列的STM32微控制器来看,既要同时满足设计中要求的具有以太网接口和RS232接口的微型控制器,又要结合高性能和低功耗的特点,以上能满足条件的最优答案就是互联型芯片STM32F107了,因此最终决定选用F1互联型系列的STM32F107作为本设计的微型控制器。2.2 STM32F107芯片概述STM32F107是意法半导体公司最新推出的一款带有CORTEX-M3内核的32位微处理器,其互联型接口和内部资源较多,开发板最好的一点就是结合了大部分的主流外设网络,例如USB接口、UART和电机控制等等。除此之外,STM32F107微控制器是一种可以支持IEEE-802.3-2002的介质访问控制器,主要通信的范围是以太局域网,通过一个具有标准的介质无关端口(MII)或者是精简的介质无关端口(RMII)。STM32F107想要和物理的局域网总线(光纤或者是双绞线等等)进行连接的话,就必须外加一个外部的物理接口设备,不然就不能连接成功。在使用的过程中,一般多达9路的信号RMII和17路的信号MII, STM32F107的无关介质端口是可以被物理设备连接的。为了满足市场的不同需求,STM32开发板在性质和价格上都做出了巨大的取舍。相信一定能对工业市场的开发上做出一定的贡献。众所周知,Cortex-M3是由Cortex-M系列所发布的,这一款相对于其他系列的来说是非常的好用的,其中配有低功耗的内核处理器。它的功能非常的齐全,特点也是非常的显著,比如说:调试成本低,中断延迟时间短,门数少等等。是专门为了把实时应用、高性能、低功耗、具有竞争性价格等优点集合到一起而要求设计的,也是为了能使嵌入式应用的中断响应能力更加的迅速而专门为大家去设计的。2.3 STM32F107芯片结构STM32F107芯片运用的是性能高的ARM Cortex-M3 32位的精简型计算机内核,一般来说工作频率在72MHz,芯片内部有一个256k的Flash和一个64kb的Sram,这个JTAG接口并不是15pin的,而是一个20pin的标准JTAG接口,除此之外,还有一些重要的接口,例如:以太网接口、USB Host接口、USB OTG接口、两路CAN接口。其他的接口就是一个DB9, SD卡插槽、一个IIC EEPROM、八个可控LED、三个按键、10k可调电阻、240*320LCD接口(背部,未调试)。以上介绍的接口都是可以通过各个复用功能的作用,最终映射到不同的引脚上去的,其目的就是为了能在设计中更好的去开发利用。电路接口图如下:图2-1 开发板接口2.4 STM32的功能及优势1.配有专门以太网MAC,还有DMA和硬件支持的IEEE1588。所以是低成本的网络化,还有精确的时钟同步。2.使用的是具有MII或RMII的以太网物理PHY接口,因此,我们可以非常灵活的选择物理PHY接口。3.片内具有内置的OTG PHY的USB 2.0 OTG全速的接口,所以,具有USB主机的功能,不再需要外置的USB OTG或PHY.4.它的核心是PLL模块,配有高级的时钟配置方案为外设提供服务,目的就是为了更加的灵活,而且成本也会更加的优化。除此之外,我们也可以向USB、CAN或者是以太网MAC提供时钟的控制。5.它的启动模式非常的灵活,可以向很多的设备提供启动的服务,例如CAN、USART和USB等设备,完全可以为这些设备的固件升级提供启动。正是由于它灵活的通信接口,所以在我们的启动程序出现故障,在无法擦除的情况下,它一样的可以保证新代码的烧录成功。6.它具有许多低功耗模式的灵活电源,还有时钟管理。另外,可编程唤醒功能的时钟和84字节的后备数据寄存器的存在,也是它的一大优势。正是因为这个原因,因此在运行的过程中,甚至在待机的状态时都会裁减应用系统,可以使性能和功耗能长期的保持在一个相对平衡的状态,电池可以为RTC的运行提供充足的电能,同时可以在84字节后备寄存器中保持应用程序关键数据。7.它不仅支持多达80个5v容忍的通用I/O口,还支持10个定时器的串口,其他的例如:CAN、USB、USRT和以太网等都收到它的支持。模拟功能一般包含2个DAC,还有完整的电源监控功能。因为STM32芯片的互联型产品功能非常的齐全,是一个非常安全稳定的通信中枢器件,所以,在进行工作的时候,这些所有的功能模块都是可以同时工作的。第三章 网关硬件设计第三章 网关硬件设计3.1 总体框架设计为了能够极大地提高系统的稳定性和可靠性,也为了能够最大化地缩短开发时间和节约开发所花费的费用,在系统硬件的设计选型时,能选取一种既具有以太网接口,又具有RS232接口的芯片当然是最好的结果了。因为当我们需要的芯片同时具有了以太网和RS232的功能,那么在实现以太网和RS232的数据传输的时候,就会减少很多不必要的外围电路的设计了。显然,尽量的减少对外围电路的设计,会减少我们设计的一大部分时间。这样大大地提高了系统的利用率,同时也减少了成本。因此,为了实现项目的开发要求,选用控制系统开发芯片STM32f107作为系统控制主芯片,它不仅广泛地用于工业方面,而且自身功能非常的强大。对于STM32F107芯片来说,他不仅功能非常的强大,而且性价比也是非常的高。它主要是以Cotex-M3内核为基础而存在的32位闪存微控制器,它所采用的指令也是非常的高端,是一种高代码、高性能密度的指令集,除此之外,还运用到了一个叫作紧藕合嵌套向量中断控制器。一般来说,配有一个RMII接口,还有以太网接口和RS232接口。正是因为它的配置齐全,所以它的优点就是低功耗,低成本和高性能等等。设计的网关电路将系统分为四个模块设计如下:图3-1 网关电路模块结构框由图3-1可知,以太网可以通过双绞线与STM32芯片相连,而RS232接口也与STM32芯片相连。这样一来,我们的以太网就可以很容易地通过STM32F107芯片与RS232之间形成信息交换了。当以太网需要传送数据到RS232的时候,或者RS232需要传送数据到以太网的时候,STM32芯片就显得格外的重要,因为它是协议转换的控制中心,不管是转换成以太网数据包还是RS232帧的数据,都是需要STM32来进行协议转换的。所以必须对以上各个模块进行严谨的设计,才能使数据能够顺利的传输。3.2 电源模块设计 在实验的设计过程中,要想使实验中的各个模块能够正常的运行,就需要对STM32F107芯片提供有效且充足的电源。对于STM32F107开发板来说,供电方式一般有两种:第一种是5v电源适配器进行供电;第二种是USB串口进行供电。而本设计主要用到的是5v电源适配器供电。当我们直接把适配器的一端插在220v的插座上,一端接在STM32F107芯片的J6上时,就能对STM32芯片提供5v的电压了。电路图如下:图3-2 5v适配器供电电路而无论我们采取什么样的供电方式对STM32芯片进行供电,最后都会把5v的电源转换为3.3v的电源为系统进行供电。因此,我们选取SPX1117芯片来实现对STM32芯片电压的转换,SPX芯片是一种常用的3.3v稳压芯片,能够产生3.3v的稳压电源,对我们系统的正常运行至关重要。转换电路如下:图3-3 5v转3.3v电路3.3 JTAG下载电路JTAG的主要功能有两种:一种是对系统仿真调试,另一种是芯片内部测试,一般来说,标准的JTAG接口包括四线:第一条是TD0(测试数据输出)、第二条是TDI(测试数据输入)、第三条是TMS(测试模式选择)、第四条是TCK(测试时钟)。JTAG有14针的接口和20针的接口,在本次设计当中,我们采用的是20针的接口来进行调试电路和下载程序。详细的接口电路图如下:图3-4 JTAG下载电路3.4 复位电路复位电路是一个很简单的电路,如下电路图所示,当按下开关S2的时候,电路接通,复位引脚电平就会降低,因此就达到了系统复位的效果。一般来说,复位电路有两个作用,即可以对系统上电进行复位,又可以在系统运行过程中,通过按键来进行手动复位。图3-5 复位电路3.5 以太网模块电路设计当在实际的模块与模块间的设计过程中,怎样解决STM32F107芯片和以太网之间的连接,将是我们需要重视的问题。对于这个设计而言,必须在芯片和以太网间加一个物理层的接口芯片才能完成连接,因此我们选取一个能支持MII(介质无关接口)和RMII(精简的介质无关接口)的DP83848C芯片,这是一款功能齐全,功耗低的单路物理层器件,它所具有的MII和RMII接口,可以让我们的设计变得更加的简单。除此之外,这个芯片还支持10BASE-T和100BASE-TX的以太网外设,对于任何以太网的问题都有很好的兼容性和通用性。下面是STM32芯片与DP83848C芯片的以太网接口硬件连接图:图3-6 STM32F107以太网接口硬件连线设计3.6 RS232通讯电路设计一般来说,STM32F107芯片的接口电路的电平为1TL,但是标准的RS232电平是采用负逻辑形式的,显然和1TL与COMS电平是完全不一样的,且规定+3-+15v间的电平为逻辑“0”电平,而-3-15v间的电平为逻辑“1”电平。所以在设计通信的过程中必须采用电平转换的方法,以便使两者的电平相配。因此,在这次设计中,我们采用的是SP3232芯片来完成电平的转换工作。详细的电平转换电路图如下:图3-7 RS232电平转换电路第四章 软件介绍第四章 软件介绍4.1 LWIP协议栈简介在网络传输中,为了顺利地完成通讯,必须使用具有多层以上的多种协议,这些协议按一定的层次顺序组合在一起,便会组成一个协议栈(Protocol STack)了,换句话说,也叫协议族(Protocol Suite)。LWIP协议其实主要是一种专门适用于嵌入式系统的TCP/IP协议栈,它的通俗意思就是大家都熟悉的Light Weight(轻型)IP协议,在运行的范围方面,即可以移植到操作系统上运行,也可以在没有操作系统的情况下独立的运行。LWIP的主要目地其实只有一个,那就是能够最大化的减少存储器利用量和代码的尺寸,一般情况下,LWIP协议能够在只有几十K的RAM的情况下,或者在只有40K左右的ROM的情况下就可以正常的运行,正因为如此,LWIP协议就可以很容易的适合于空间小的和资源有限的处理器,例如嵌入式系统。为了符合减少处理器和存储器的设计要求,LWIP可以利用不需要任何拷贝的API进行裁减。TCP/IP协议是一个缩写的名称,其实它的全名叫做传输控制/因特网互联网协议(Transmission Control Protocol/Internet Protocol),它对Internet来说是非常的重要的,因为它是互联网络的基础,也是人们运用的最基础的传输协议,它的组成单元包括两种:第一种是网络层的IP协议,第二种是传输层的TCP协议。4.1.1 pbuf结构体定义LWIP协议栈中的数据包是用pbuf结构体来进行定义的,该结构体的主要定义如下面所述:Struct pbufStruct pbuf*next;Void*payload;u16_t tot_len;u16_t len;u8_t type;u8_t flags;u16_t ref;Next指针的作用主要是指向下一个需要用到的pbuf数据包,其中,当你要运用当前的数据包的时候,就需要用到payload指针,而当前的pbuf长度则需要totl_en来表示,在pbuf链中接下来的pbufs的所有len领域的总数也是需要totl_en来表示的,然而当前pbuf的长度则是需要利用len来表示的,flags和type表示的是pbuf的类型,具体来说,pbuf具有三种类型,分别是pbuf ram、pbuf rom和pbuf pool,ref则包含一个参考计数。4.1.2 LWIP协议栈中各层的实现1.网络的接口:next指针一般会指向它的下一个接口,ip_addr表示的是ip地址,netmask表示的是子网掩码,gw则表示的是默认网关。他们三个都是都是由IP层调用的。当硬件接收到数据包的时候,系统就会马上调用input指针指向该函数了;反之,当IP模块有数据包发送的时候,就会调用output指针指向的函数;当ARP模块有数据包发送时,同样会调用linkoutput指针指向的函数。除此之外,netif还定义了一些状态回调函数,只有当配置了该功能时,才会使用。2.IP层:在IP层中,LWIP仅仅能够发送、接收和转发包,基本可以完成IP的基本功能,但是,它却不能够接收和发送已经被分割的IP包,还有一些带IP选项的包它也不能够处理。所以,在需要接收IP包的时候,我们需要先调用ip_input()函数,然后,函数再通过网络接口的IP地址去检验目的地址,以确保数据包是否被发往主机。当发送数据包时,是需要调用函数ip_output()来完成接下来的流程,它可以启用合适的函数ip_route()去寻找适当的网络接口发送数据包,在确定了发送包的网络接口之后,就可以开始调用ip_output_if()函数来完成接下来的工作了。假如没能找到网络接口的IP地址与我们所传进的数据包的目的地址相同,这个包就应当被转发,可以利用函数ip_forward()对包进行转发。3.传输层:传输层协议一般分为两种类型,第一种是本文需要用到的TCP(传输控制协议),第二种是一种名为UDP(用户数据包协议)的协议。然而两者的区别在:TCP协议提供的主要是面向连接和可靠的字节流型服务,当用户需要和客服端进行数据交换之前,我们就需要提前在双方之间建立一个所谓的TCP连接,这样才能进行下一步的数据传输。TCP协议的功能很齐全,主要的功能有以下几个:能够提供超时重发,能够检验数据,能够进行流量控制和丢弃重复数据等等。这样就可以很好的保证数据的正常传输了。然而,UDP协议只不过是一个简单协议,它的主要作用是面向数据报的运输层协议,它最大的好处就是能够准确的把相应的应用程序发送到IP层的数据报,然后再发送出去,这一步操作主要强调的是过程,而并非结果,也就是并不能保证他们是否能到达目的地,他不提供可靠性,但是它也有一个优点,那就是它的传输速度很快。通过以上两者的比较,我们根据可靠性的要求,这个设计需要选取的是TCP传输协议。4.1.3 LWIP协议栈的内存管理在LWIP协议栈中,从内存分配策略来看,一个可以分为两种类型:第一种叫做内存堆的分配,第二种叫做内存池的分配。内存堆的分配听起来似乎很难理解,但是它的原理其实很简单,说得通俗易懂的话,就是在数据传输之前,先确定好一个内存大小的模块,然后对其进行管理。它的分配策略就是“最快合适”方式,只要在寻找内存块的时候,能够找到一个空闲块比它所请求的内存块大,就会立即切割出它所需要的那一块,再把切割所剩下的部分返回到动态内存堆里面。在所分配的内存堆中,有一部分是用来存放分配器管理的私有数据的,其大小大约是12个字节,这个部分是不能被修改的,即使是用户也不能,不然就会出现非常致命的错误。内存的释放,相比内存的分配是不同的,可以说是截然相反的。分配器可以对每个节点进行必要的检查,看看它前后会不会有空闲的内存块,如果找到了空闲的内存块,就会将它们合并在一起,形成一个相对较大的空闲内存块了。内存堆的分配策略优点就是:比较简单,内存的浪费小,非常适合于小内存的管理。但是它的缺点也是非常明显的,同时也是不容忽略的,当在频繁的分配或者是释放的过程中,很有可能产生一些小小的碎片,这些小的碎片在内存中是没用的,所以理论上来说,碎片的量当然是越少越好。如果碎片的量得不到有效的控制的话,就有可能导致内存的分配成功率降低。所以为了能够减少内存碎片,比较好的方法就是分配-释放-分配-释放。在对内存堆进行分配的时候,需要对mem_int()内存堆进行初始化,主要就是为了说明起始和结束的地址,还有初始化内存的空闲列表,如果是lwip初始化时,为了给自己进行调用,那么此个接口就是内部存在的私有接口,一般是不会对客户层进行开放的。当Mem_malloc()函数对内存进行分配的时候,它会把所有它所用到的字节数作为数据传递给该函数,而返回来的数据就会指一个新的指针,且这个内存是最新分配的。相反,假如内存在进行分配的时候,结果是不成功,那么就出现返回来的值存在NULL的情况,同时,我们要进行分配的空间大小,在一定程度上也应该受到内存对齐的干扰,结果分配的空间大小可能会比我们所申请的稍微偏大。这样一来,返回的内存就会出现“没有”初始化的。在返回得到地内存当中,很可能会参杂着一些不同的废品,但我们完全能够利用一些更好的数据,甚至是零来对这块内存进行初始化。有一点是必须要说明的,那就是我们的内存分配和释放在中断函数里面不能进行。由于内存堆是一个全局变量,所以在做内存的申请和释放等操作时,是需要做一个线程安全保护的。假如多个线程同时在进行内存的申请和释放的时,申请所耗时间一定会延长的,因为多个信号量会出现等待状态。Mem_calloc()是存在2个不同的值的,一个表示的是元素的大小,一个是表示元素的数目,而我们所要进行分配的内存空间大小,就是以上两个不同值的积。Mem_calloc()实际上就是对mem_malloc()函数的单一拼装,与mem_malloc()不相同之处就是它能够将动态分配内存的值进行清零处理。要想使动态内存池分配部分得以实现,就需要用到memp.c,memp.h文件。在内存池里面进行内存管理,一个最大的优点就是可以很好的防止内存碎片的产生,而且它的内存分配和释放效率会更高,相反,它的缺点就是浪费部分的内存。内存池管理一般是借鉴事先启用的宏,在内存中直接设立一个大内存,最后运用到内存池当中,在进行内存分配的请求的时侯,会直接地参考它所申请的内存大小,选择适合它的长度的池里面去申请。内存池在进行初始化的时候,它的作用是给不同的内存设立一个链表memp_tab,此链表一般来说是逆序的,除此之外,它还具有统计功能,可以记录各样内存池地数目。LWIP的特性有以下几点:1.支持ICMP协议、DHCP协议,同时也支持多网络接口下的IP转发,动态分配IP地址。2.包括实验性的扩展的UDP协议。3.还包含阻塞控制和RTT估算。4.可以为内部函数的回调提供特殊的接口,主要是为了加强应用程序的功能。4.2 IP处理关于IP层来说,它所研究的一般是和信息的接收有关,除此之外,还有信息包的发送和转发,甚至是分片数据包的重装。而LWIP却只是完成了IP最基础的几个性能,那就是数据包的传递、接收和转发,但是却并不能对分割的IP包进行发送和接收,也不能对带有IP选项的数据包进行处理。IP数据报头结构如下:图4-1 IP数据报头结构从上图可以知道,其中的选项字段是允许不存在的,所以我们通常所说的IP数据报头长度一般为20个字节。可以明显的看出,这是一个4位的字段,对于IPv4来说,该数值为4;同理,对于IPv6,该数值就是6了。4bit字段是用来记录首部的长度的,单位为“字”,因此对于一些不包含任何选项字段的IP报头而言,它的长度应该为5,由于该字段所要求的最大值是15,所以它所能够描述的最大IP报头长度就为60字节了。接下来就是一个8bit的服务型字段,这个字段的最主要作用就是能很好的描述IP数据包继续的服务类型,例如:最大吞吐量,最小延时,最高可靠性等等。但是总的来说,这个字段在LWIP中的作用是很小的。16位的总长度字段可以用来总结全部的IP数据报,同时也包括了IP数据报头的总字节数。一般来说,IP数据包的总长度是可以达到65535字节的,然而在实际运用当中,对于这么庞大的数据包是不允许出现在底层链路的,如果存在这样的情况,只会大大地增加数据出现错误的可能性。因此,在链路层是很容易出现大的IP数据包分解这种情况的。接下来的16位标识字段是起到一个标识作用,主要对IP层发出的每一份数据报进行标识,当每发送一份报文的时候,该数值就会加1。而3位标识和13位片偏移字段都是在IP数据包的分片时会运用。TTL字段是用来记录IP数据包能被转发的次数,在每次转发过后,该数值都会减1,直到该数值减为0时,一个ICMP报文就会被返回到源主机那里。还有8位协议字段是用来记录IP数据包的来源的。它能总结每个数据包的来源,不管它是从哪个协议传来的,如果这个数值是1,则说明它是ICMP协议;如果这个数值值是2,则说明它是IGMP协议;如果该数值是6,则说明它是TCP协议;如果该数值为17,则说明它是UDP协议。16位首部校验和只会针对该IP的首部做检验,对于其内部数据在传输过程中是否会出错,它并不是很在乎,数据的校验工作,一般来说是由上层协议负责的,例如:ICMP、UDP、IGMP、TCP等协议都需要计算他们的头部和整个数据区的长度。4.2.1 IP接收包对于要接收的IP数据包,必须先让ip_input()函数被设备驱动函数调用后,才能开始进行处理。在这段过程中,初始化的任务有很多,例如:检测IP所用的版本,还需要确定报头的值,除此之外,要算出和检查报头的checksum域。理想的情况是,在proxy服务器对所有的碎片数据包进行重组以后,我们在堆栈中就再也收不到碎片,如果是这样的话,那么所有含有IP碎片的数据包都会在不知不觉中被丢掉。同样,如果是带有ip选项的包,也会由指定的代理去处理,最终的结果也是被丢掉。接下来的工作就是检验包是否被发往主机了,其实这检验的方法很简单,只要运用函数通过网络接口的IP地址检验目的地址就可以了。我们需要的网络接口已经被安放在链表中并加以排序,是支持线性查询的。一般而言,网络接口的序号都是指定为小的号,因为能比线性查询的方法更好的方法,至今还没找到。假如需要接收的数据包是通过主机指定好的包,那么必须由protocol域来判定该包应该被传给哪个更高层的协议。4.2.2 IP发送包函数ip_output()可以用来处理一个即将发送的数据包,然后再利用另一个函数ip_rout()去寻找一个适合的网络接口,最后顺利的将包上传出去。一旦我们需要的网络接口确定之后,数据包就会被传递到ip_output_if()函数,而这个函数也会把发送网络接口当作一个函数自变量。当这时候,IP报头域会被填补,同时,IP报头checksum也会被计算。最后,IP包的源和目的地址就会被当作一个变量,最终也会被传送到ip_output_if()函数那里。一般来说,源地址是很有可能被忽略掉的,但是我们还是可以把要发送的网络接口的IP地址作为包的来源地址的。如果想要找到一个合适的网络接口,我们可以利用ip_route()函数来实现,它可以通过线性查找网络接口列表很容易的找到我们所想要的接口。在查找IP包的IP地址的过程中,可以很好的利用网络接口的网络掩码来完成。假如所要求的目的地址和掩码的接口IP地址相同,就完全可以选择这个接口。假如并不能找到一个合适的接口匹,那么也只能使用缺省的网络接口了。缺省的网络接口的装配一般是由人亲自开启的时侯,或者是处于运转状态的时侯。还有一种可能性,假如缺省的接口地址都不能够和目的IP地址匹配,那么也就只能选择网络结构中的gw字段作为链路层帧的目的IP地址。 由于TCP在计算运输层校验和的时候需要知道目的的IP地址,所以我们必须保证外发网络接口在已经确定的情况下,才能将数据包传递给IP层。要想达到这个目的,我们可以直接利用运输层的函数,ip_route()函数能很好的完成这个任务,因为数据包到达IP层的时候,外发网络早已经收到信号,就完全没有必要再一次的去查找网络接口列表了。取而代之的是那些协议可以直接的去调用ip_output_if()函数。只要该函数能把网络接口作为一个参数,就有很大的可能性去避免外发接口的查询。4.3 TCP服务器的设计和实现4.3.1 TCP协议的特点TCP协议的中文名字为传输控制协议,它是以IP数据帧为基础而进行传递的,能供应稳定的数据传输服务。下面就是关于TCP的特征:1.面向连接:协议规定,要想通过TCP而进行数据传输的话,就必须在数据传输之前,需要传输的两个点要通过TCP连接来建立连接,只有当这个连接建立成功以后,才能进行下一步的数据数据传输。同理,当我们需要终止连接的时候,也必须使用TCP连接中断过程来关闭连接,不然就不会达到我们希望达到的要求。2.双向的传输:在我们的TCP协议传输过程中,每个数据连接都存在两个状态,分别是一收一发两种逻辑通道。数据在传输的过程中,是可以同时进行接收和发送数据的,在TCP报头里面,不仅包含着传出的数据,而且还有确认输入数据的序列号。3.安全的传输:在传输数据的时候,对于我们需要发送的数据,必须要按一定的顺序进行发送,且不可以胡乱的发送,以至于导致错误。除此之外,必须确认数据是否发送成功,这就需要接收到接收方反馈回来的信号,假如没有得到确认的数据,那么就需要重新发送数据,接收方接收了重复的数据包就会将其丢掉,而失序包就将被还原成正确的序列。4.数据字节流:顾名思义,就是当TCP在进行数据传输的时候,在逻辑管道上进行传输的数据是一种连续的字节流,而且TCP的报头序列号和确认号也是以字节的形式存在的。TCP在传输的过程中,并不会知道它所传输的字节是什么内容,也不会知道传输的起始位置,它只能通过应用层的协议来对字流节的数据进行分析。5.流量的控制:和一般的流水管道一样,为了防止堵塞,TCP协议也规定了数据传输的流量。所以在传输数据的两方都会预留一个接收的缓冲区,假如其中一方的接收数据缓冲区满了,那么它会发送信号给另一方,让它终止数据的发送,直到缓冲区有空余的空间为止。但是双方的接收缓冲区都是独立存在的,永远也不会出现膨胀的情况。6.应用层数据分段:如果我们的TCP连接一旦成立以后,两方就会对彼此能传递的最大值进行互换,假设收到的是ICMP的“路径最大传输单位”值,就可以自动的调整TCP的大小了。7.一对一传输:TCP协议可以提供一对一的通讯服务。4.3.2 TCP协议结构TCP协议进行数据传输的可靠性是非常的高的,只有需要发送的应用数据被拆分成比较合适的数据块的时候,TCP协议才会对其进行发送。这么可靠的数据发送能力肯定是和TCP协议的首部结构是分不开的。以下就是TCP协议的首部结构图:图4-2 TCP协议的首部结构上图是TCP的首部结构图,一般来说,假如不要求任选字节的话,它的长度应该在20字节,这样一来,可见TCP协议与IP协议的首部大小是一样的。接下来是TCP协议首部结构的各部分的应用。首先介绍结构图最顶端的两个部分,源端口号和目的端口号。它们主要起到的是一个标识的作用,不管是在发送端,还是在接收端,它们都可以对当前的应用程序进行标识。其实,它们对确定一个TCP的连接也起到了至关重要的作用,当他们两个的数值组合IP首部的源IP地址和目的IP地址,就会确定一个独一无二的TCP连接了。同源端口号和目的端口号的作用一样,32位序号字段也起到一个标识的作用,它主要是标识TCP发送端到它的接收端的数据字流节,确切的说,是对这个报文的第一个数据字节进行标序。在建立了一个新的连接的时候,我们的SYN标志就会置向1的位置,最后加上主机的初始序号ISN后,我们的这个主机将要发送的数据的第一个字节序号就会变为ISN+1了。32位确认序号的ACK字段永远是被置于1的位置,因为当ACK被置于1的时候才有效,这个序号携带的是接收端希望接收到的下一个序列号。由图4.2中列举的6个标志比特可以知道,它们的用法依次分别是:第一个是紧急指针的有效标识;第二个是确认序号的有效标识;第三个表示的是接收端应该快速的把报文段发送给应用层;第四个是重新建立连接;第五个表示的是一个同步的序号,在建立连接的时候需要用它来发起连接;第六个表示发送端已经完成了发送的任务。窗口的作用主要是进行流量的控制,一般是根据自己的窗口字段的大小来实现既定的目标,除此之外,它还能进行字节数接收的操作。检验和的范围非常的广,在TCP的首部和TCP数据里都分布着,简单的概括就是占据了整个TCP报文段。这个字段必须是从发送端进行计算和储存,而且由接收端进行检验。紧急指针是一个正的偏移量,通过和序号字段中的数值进行求和,最终可以表示紧急数据最后一个字节的序号。值得注意的一点是:要想紧急指针有效的工作,就必须在URG标志数值置于1的时候进行。在TCP的报文段中,有时候也会出现数据部分没有值的状态。很可能会出现在某个连接的建立和终止的时候,因为这个时候两方所交换的报文段都只是存在TCP首部。或者还有另一个可能,那就是某方在没有进行数据发送的时候,它是需要通过不含任何数据的首部去检测收到的数据的。4.3.3 TCP连接函数的建立每个新的TCP连接都是由函数tcp_new()来创建的。在连接创建完成以后,协议控制模块(PCB)就进入监听模式了,可以直接的去连接另外一个主机,也可以等待数据接收的连接信号。1.tcp_new()Struct tcp_pcb*tcp_new(void)这个函数的主要功能是为了建立一个新的连接标志(pcb),只有在定义一个tcp_pcb控制块以后,才能首先被调用。当返回来的数值为pcb时,表明已经正常的建立了连接;当返回值为NULL时,表明一个全新的pcb内存是不能被用的。2.tcb_bind()Err_t tcp_bind(struct tcp_pcb*pcb,struct ip_addr*ipaddr,u16_t port)该函数主要是用于绑定本地的IP地址和端口号,用户在使用的过程中,可以将其绑定在任何一个本地的IP地址上,不过有一点是必须注意的,只有在函数tcp_new()被调用之后,它才可以被调用。在以上函数的原型中,pcb表示我们准备绑定的连接,ipaddr表示绑定的IP地址,port表示绑定的本地端口号。当返回值是ERR-OK时,说明已经正确地绑定了指定的连接;当返回值是ERR-USE时,说明我们之前所指定的端口号已经被绑定了一个连接,与这次绑定产生了严重的冲突。3.tcp_listen()Struct tcp_pcb*tcp_listen(struct tcp_pcb*pcb)该函数的功能就是当一个正在请求的连接被接收的时候,会使之

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论