《基于STM32的智能建筑以太网与RS232数据传输网关的设计(53页).doc》由会员分享,可在线阅读,更多相关《基于STM32的智能建筑以太网与RS232数据传输网关的设计(53页).doc(53页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于STM32的智能建筑以太网与RS232数据传输网关的设计-第 48 页基于STM32的智能建筑以太网与RS232数据传输网关的设计Design of Ethernet and RS232 Data Transmission Gateway Based on STM32学生姓名:Xxx学生学号:Xxx专业名称:建筑电气与智能化指导教师:Xxx控制与机械工程学院2015年 6月 18日独创性声明本人声明所呈交的毕业设计(论文)是本人在指导教师指导下进行的研究工作和取得的研究成果,除了文中特别加以引用标注之处外,论文中不包含其他人已经发表或撰写过的研究成果,没有伪造数据的行为。毕业设计(论文)
2、作者签名: 签字日期: 年 月 日毕业设计(论文)版权使用授权书本毕业设计(论文)作者完全了解学校有关保留、使用论文的规定。同意学校保留并向有关管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权天津城建大学可以将本论文的全部或部分内容编入有关数据进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本论文。(保密的毕业设计(论文)在解密后适用本授权说明)毕业设计(论文)作者签名: 指导教师签名:签字日期: 年 月 日 签字日期: 年 月 日摘 要根据RS232与以太网的特点,为了实现以太网与RS232数据传输网关的设计,提出一种基于STM32微控制器的数据传输转换接口器的设
3、计方法。充分发挥STM32F107控制器的超强功能,利用通用输入输出口、时钟、中断控制及以太网等辅助功能去阐述设计原理,并细致地给出相应的硬件电路。网关设计的软件应该采用模块化设计,每个相应的模块都应该做成独立的函数,以便调用时更省时,运用主程序和中断服务程序对数据传输功能进行软件实现。在设计的过程中实现了以下三点功能:第一点,实现了使用STM32芯片来设计网关电路;第二点,实现了网关具有以太网接口和RS232接口;第三点,在设计软件的过程中,实现了以太网TCP协议到串行数据协议的转换传输。关键字:STM32F107;以太网;RS232;数据传输网关;ABSTRACT According to
4、 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 c
5、ontroller 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 fo
6、r 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 Eth
7、ernet 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.
8、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 硬件
9、连接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 课题设计背景智能建筑就是把建筑物的结构、设备、服务和管理依据不同用户的要求而进行的最合理的设计,从而为用户提供一个高效、舒适、便利的人性化建筑环境。因此和普通的建筑相比,智能建筑不仅具有居住的功能,还在结构上由单一居住逐渐转换成现代智慧的工具。智能建筑可以提供内部和外部的信息交换和数据传输,帮助人们与建筑内部设备互动,从而有效
10、地安排时间,通过智能建筑建立一个强大的网络系统,实现把家庭设备的各项信息综合在一个平台上。现代智能建筑已经进入数字化、智能化时代,进入物联网时代。要求信息共享,生产过程信息化、网络化管理。在当今高速实时数字信号处理系统中,涉及的数据对象趋于多样化,这些数据通常需要不同的网络接口。具有不同的传输速率,不同的传输方向。由于智能建筑的迅猛发展,为了满足智能建筑现场不同功能模块的信息交换,以及不同网络接口的数据传输要求。因此为了符合上述的要求,提出一种新的设计方法,特别选用STM32微控制器作为数据传输的中心控制器。结合设计要求,提出“基于STM32的智能建筑以太网与RS232数据传输网关”的设计。1
11、.2 课题设计要求 为了使网关的数据传输更加的高效实用,论文的要求是实现利用功能强大的STM32系列芯片设计网关电路。且设计的网关电路必须要同时具备以太网与RS232的接口,这样即能节省费用,又能大大地提高系统的利用率。除此之外,在设计软件程序的时候,设计必须要完成以太网TCP协议到串行数据协议的转换传输。1.3 课题设计工作1.数据传输网关的简介:本次的设计课题为“基于STM32的智能建筑以太网与RS232的数据传输网关的设计”,这次设计相对于以往的数据传输网关设计而言,最大的创新之处是选用了STM32芯片微型控制器。因为设计就是为了不断的创新,不断的优化陈旧的东西,而让原有的设计能够在实现
12、同样的效果的前提下,使设计的成本和时间都能大大的降低,从而达到最好的效率。所以STM32F107芯片显然能达到这个要求,它同时具有以太网和RS232接口的功能,能同时连接以太网接口和RS232接口,并在两者之间起到一个“桥梁”的作用,使两者在进行数据传输的时候,对各自发来的数据包进行解包和打包的操作,最终转换成能传向对方的数据。 2.硬件设计:本次设计的硬件设计理念其实很简单,主要是把整个系统模块化,然后再对各个模块的功能进行细致的阐述。简单的来说,本次设计分为四个模块来进行,分别是电源模块,以太网模块,RS232模块,还有STM32主控芯片。通过对以上四个模块的实现来最终完成数据传输网关的设
13、计。 3.软件设计:充分理解LWIP协议栈的的数据传输,还有RS232串口,再结合GPIO,NVIC和以太网,充分理解以太网到RS232的数据传输过程和RS232到以太网的数据传输过程 。然后根据数据传输的过程写出相应的程序流程图和程序,最终结合硬件设备来完成本次的设计。4.最后完成系统的调试,这是非常重要的一步,因为不管是硬件的设计还是软件的设计,最终还是要为最后的调试服务,假如调试不成功,一切都是白费功夫而已。所以最后需要运用sscomv20(串口调试程序)和TCP-tester来进行模拟的数据传输网关的设计,只有不断的调试和修改,才能最终使得我们的设计符合最终的设计要求。第二章 主控芯片
14、的选择2.1 STM32微型控制器的选择在开始设计之前,需要选用同时具有网络接口的以太网和RS232接口的微型控制器,同时要满足设计的其他的一些具体功能,我们不得不选择一个合适的微控制器。因此,STM32系列的微型控制器就给了我们非常多的选择和开发的空间,它提供了全新的32位产品的选择可能性,结合高性能、低功耗、高实用性的出色特点,另一方面又能保持很高的集成度,还有很容易开发的巨大优势。STM32产品至今已经开发出了四大产品系列:L1、F1、F2和F4。具体的不同如下:1.F2系列:不仅拥有以太网接口,还有crypto/hash模块和SDIO模式的音频模块,同时还有一个时钟频率120MHz和2
15、个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内核,以太网接口模快和cryp
16、to/hash模块,一般它的时钟频率可以高达168MHz,还有2个USB-OTG-FS接口。从以上的4种系列的STM32微控制器来看,既要同时满足设计中要求的具有以太网接口和RS232接口的微型控制器,又要结合高性能和低功耗的特点,以上能满足条件的最优答案就是互联型芯片STM32F107了,因此最终决定选用F1互联型系列的STM32F107作为本设计的微型控制器。2.2 STM32F107芯片概述STM32F107是意法半导体公司最新推出的一款带有CORTEX-M3内核的32位微处理器,其互联型接口和内部资源较多,开发板最好的一点就是结合了大部分的主流外设网络,例如USB接口、UART和电机控
17、制等等。除此之外,STM32F107微控制器是一种可以支持IEEE-802.3-2002的介质访问控制器,主要通信的范围是以太局域网,通过一个具有标准的介质无关端口(MII)或者是精简的介质无关端口(RMII)。STM32F107想要和物理的局域网总线(光纤或者是双绞线等等)进行连接的话,就必须外加一个外部的物理接口设备,不然就不能连接成功。在使用的过程中,一般多达9路的信号RMII和17路的信号MII, STM32F107的无关介质端口是可以被物理设备连接的。为了满足市场的不同需求,STM32开发板在性质和价格上都做出了巨大的取舍。相信一定能对工业市场的开发上做出一定的贡献。众所周知,Cor
18、tex-M3是由Cortex-M系列所发布的,这一款相对于其他系列的来说是非常的好用的,其中配有低功耗的内核处理器。它的功能非常的齐全,特点也是非常的显著,比如说:调试成本低,中断延迟时间短,门数少等等。是专门为了把实时应用、高性能、低功耗、具有竞争性价格等优点集合到一起而要求设计的,也是为了能使嵌入式应用的中断响应能力更加的迅速而专门为大家去设计的。2.3 STM32F107芯片结构STM32F107芯片运用的是性能高的ARM Cortex-M3 32位的精简型计算机内核,一般来说工作频率在72MHz,芯片内部有一个256k的Flash和一个64kb的Sram,这个JTAG接口并不是15pi
19、n的,而是一个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.使用的
20、是具有MII或RMII的以太网物理PHY接口,因此,我们可以非常灵活的选择物理PHY接口。3.片内具有内置的OTG PHY的USB 2.0 OTG全速的接口,所以,具有USB主机的功能,不再需要外置的USB OTG或PHY.4.它的核心是PLL模块,配有高级的时钟配置方案为外设提供服务,目的就是为了更加的灵活,而且成本也会更加的优化。除此之外,我们也可以向USB、CAN或者是以太网MAC提供时钟的控制。5.它的启动模式非常的灵活,可以向很多的设备提供启动的服务,例如CAN、USART和USB等设备,完全可以为这些设备的固件升级提供启动。正是由于它灵活的通信接口,所以在我们的启动程序出现故障,在
21、无法擦除的情况下,它一样的可以保证新代码的烧录成功。6.它具有许多低功耗模式的灵活电源,还有时钟管理。另外,可编程唤醒功能的时钟和84字节的后备数据寄存器的存在,也是它的一大优势。正是因为这个原因,因此在运行的过程中,甚至在待机的状态时都会裁减应用系统,可以使性能和功耗能长期的保持在一个相对平衡的状态,电池可以为RTC的运行提供充足的电能,同时可以在84字节后备寄存器中保持应用程序关键数据。7.它不仅支持多达80个5v容忍的通用I/O口,还支持10个定时器的串口,其他的例如:CAN、USB、USRT和以太网等都收到它的支持。模拟功能一般包含2个DAC,还有完整的电源监控功能。因为STM32芯片
22、的互联型产品功能非常的齐全,是一个非常安全稳定的通信中枢器件,所以,在进行工作的时候,这些所有的功能模块都是可以同时工作的。第三章 网关硬件设计3.1 总体框架设计为了能够极大地提高系统的稳定性和可靠性,也为了能够最大化地缩短开发时间和节约开发所花费的费用,在系统硬件的设计选型时,能选取一种既具有以太网接口,又具有RS232接口的芯片当然是最好的结果了。因为当我们需要的芯片同时具有了以太网和RS232的功能,那么在实现以太网和RS232的数据传输的时候,就会减少很多不必要的外围电路的设计了。显然,尽量的减少对外围电路的设计,会减少我们设计的一大部分时间。这样大大地提高了系统的利用率,同时也减少
23、了成本。因此,为了实现项目的开发要求,选用控制系统开发芯片STM32f107作为系统控制主芯片,它不仅广泛地用于工业方面,而且自身功能非常的强大。对于STM32F107芯片来说,他不仅功能非常的强大,而且性价比也是非常的高。它主要是以Cotex-M3内核为基础而存在的32位闪存微控制器,它所采用的指令也是非常的高端,是一种高代码、高性能密度的指令集,除此之外,还运用到了一个叫作紧藕合嵌套向量中断控制器。一般来说,配有一个RMII接口,还有以太网接口和RS232接口。正是因为它的配置齐全,所以它的优点就是低功耗,低成本和高性能等等。设计的网关电路将系统分为四个模块设计如下:图3-1 网关电路模块
24、结构框由图3-1可知,以太网可以通过双绞线与STM32芯片相连,而RS232接口也与STM32芯片相连。这样一来,我们的以太网就可以很容易地通过STM32F107芯片与RS232之间形成信息交换了。当以太网需要传送数据到RS232的时候,或者RS232需要传送数据到以太网的时候,STM32芯片就显得格外的重要,因为它是协议转换的控制中心,不管是转换成以太网数据包还是RS232帧的数据,都是需要STM32来进行协议转换的。所以必须对以上各个模块进行严谨的设计,才能使数据能够顺利的传输。3.2 电源模块设计 在实验的设计过程中,要想使实验中的各个模块能够正常的运行,就需要对STM32F107芯片提
25、供有效且充足的电源。对于STM32F107开发板来说,供电方式一般有两种:第一种是5v电源适配器进行供电;第二种是USB串口进行供电。而本设计主要用到的是5v电源适配器供电。当我们直接把适配器的一端插在220v的插座上,一端接在STM32F107芯片的J6上时,就能对STM32芯片提供5v的电压了。电路图如下:图3-2 5v适配器供电电路而无论我们采取什么样的供电方式对STM32芯片进行供电,最后都会把5v的电源转换为3.3v的电源为系统进行供电。因此,我们选取SPX1117芯片来实现对STM32芯片电压的转换,SPX芯片是一种常用的3.3v稳压芯片,能够产生3.3v的稳压电源,对我们系统的正
26、常运行至关重要。转换电路如下:图3-3 5v转3.3v电路3.3 JTAG下载电路JTAG的主要功能有两种:一种是对系统仿真调试,另一种是芯片内部测试,一般来说,标准的JTAG接口包括四线:第一条是TD0(测试数据输出)、第二条是TDI(测试数据输入)、第三条是TMS(测试模式选择)、第四条是TCK(测试时钟)。JTAG有14针的接口和20针的接口,在本次设计当中,我们采用的是20针的接口来进行调试电路和下载程序。详细的接口电路图如下:图3-4 JTAG下载电路3.4 复位电路复位电路是一个很简单的电路,如下电路图所示,当按下开关S2的时候,电路接通,复位引脚电平就会降低,因此就达到了系统复位
27、的效果。一般来说,复位电路有两个作用,即可以对系统上电进行复位,又可以在系统运行过程中,通过按键来进行手动复位。图3-5 复位电路3.5 以太网模块电路设计当在实际的模块与模块间的设计过程中,怎样解决STM32F107芯片和以太网之间的连接,将是我们需要重视的问题。对于这个设计而言,必须在芯片和以太网间加一个物理层的接口芯片才能完成连接,因此我们选取一个能支持MII(介质无关接口)和RMII(精简的介质无关接口)的DP83848C芯片,这是一款功能齐全,功耗低的单路物理层器件,它所具有的MII和RMII接口,可以让我们的设计变得更加的简单。除此之外,这个芯片还支持10BASE-T和100BAS
28、E-TX的以太网外设,对于任何以太网的问题都有很好的兼容性和通用性。下面是STM32芯片与DP83848C芯片的以太网接口硬件连接图:图3-6 STM32F107以太网接口硬件连线设计3.6 RS232通讯电路设计一般来说,STM32F107芯片的接口电路的电平为1TL,但是标准的RS232电平是采用负逻辑形式的,显然和1TL与COMS电平是完全不一样的,且规定+3-+15v间的电平为逻辑“0”电平,而-3-15v间的电平为逻辑“1”电平。所以在设计通信的过程中必须采用电平转换的方法,以便使两者的电平相配。因此,在这次设计中,我们采用的是SP3232芯片来完成电平的转换工作。详细的电平转换电路
29、图如下:图3-7 RS232电平转换电路第四章 软件介绍4.1 LWIP协议栈简介在网络传输中,为了顺利地完成通讯,必须使用具有多层以上的多种协议,这些协议按一定的层次顺序组合在一起,便会组成一个协议栈(Protocol STack)了,换句话说,也叫协议族(Protocol Suite)。LWIP协议其实主要是一种专门适用于嵌入式系统的TCP/IP协议栈,它的通俗意思就是大家都熟悉的Light Weight(轻型)IP协议,在运行的范围方面,即可以移植到操作系统上运行,也可以在没有操作系统的情况下独立的运行。LWIP的主要目地其实只有一个,那就是能够最大化的减少存储器利用量和代码的尺寸,一般
30、情况下,LWIP协议能够在只有几十K的RAM的情况下,或者在只有40K左右的ROM的情况下就可以正常的运行,正因为如此,LWIP协议就可以很容易的适合于空间小的和资源有限的处理器,例如嵌入式系统。为了符合减少处理器和存储器的设计要求,LWIP可以利用不需要任何拷贝的API进行裁减。TCP/IP协议是一个缩写的名称,其实它的全名叫做传输控制/因特网互联网协议(Transmission Control Protocol/Internet Protocol),它对Internet来说是非常的重要的,因为它是互联网络的基础,也是人们运用的最基础的传输协议,它的组成单元包括两种:第一种是网络层的IP协议
31、,第二种是传输层的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来表示的,然
32、而当前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模块有数据包发送时,同样会
33、调用linkoutput指针指向的函数。除此之外,netif还定义了一些状态回调函数,只有当配置了该功能时,才会使用。2.IP层:在IP层中,LWIP仅仅能够发送、接收和转发包,基本可以完成IP的基本功能,但是,它却不能够接收和发送已经被分割的IP包,还有一些带IP选项的包它也不能够处理。所以,在需要接收IP包的时候,我们需要先调用ip_input()函数,然后,函数再通过网络接口的IP地址去检验目的地址,以确保数据包是否被发往主机。当发送数据包时,是需要调用函数ip_output()来完成接下来的流程,它可以启用合适的函数ip_route()去寻找适当的网络接口发送数据包,在确定了发送包的网
34、络接口之后,就可以开始调用ip_output_if()函数来完成接下来的工作了。假如没能找到网络接口的IP地址与我们所传进的数据包的目的地址相同,这个包就应当被转发,可以利用函数ip_forward()对包进行转发。3.传输层:传输层协议一般分为两种类型,第一种是本文需要用到的TCP(传输控制协议),第二种是一种名为UDP(用户数据包协议)的协议。然而两者的区别在:TCP协议提供的主要是面向连接和可靠的字节流型服务,当用户需要和客服端进行数据交换之前,我们就需要提前在双方之间建立一个所谓的TCP连接,这样才能进行下一步的数据传输。TCP协议的功能很齐全,主要的功能有以下几个:能够提供超时重发,
35、能够检验数据,能够进行流量控制和丢弃重复数据等等。这样就可以很好的保证数据的正常传输了。然而,UDP协议只不过是一个简单协议,它的主要作用是面向数据报的运输层协议,它最大的好处就是能够准确的把相应的应用程序发送到IP层的数据报,然后再发送出去,这一步操作主要强调的是过程,而并非结果,也就是并不能保证他们是否能到达目的地,他不提供可靠性,但是它也有一个优点,那就是它的传输速度很快。通过以上两者的比较,我们根据可靠性的要求,这个设计需要选取的是TCP传输协议。4.1.3 LWIP协议栈的内存管理在LWIP协议栈中,从内存分配策略来看,一个可以分为两种类型:第一种叫做内存堆的分配,第二种叫做内存池的
36、分配。内存堆的分配听起来似乎很难理解,但是它的原理其实很简单,说得通俗易懂的话,就是在数据传输之前,先确定好一个内存大小的模块,然后对其进行管理。它的分配策略就是“最快合适”方式,只要在寻找内存块的时候,能够找到一个空闲块比它所请求的内存块大,就会立即切割出它所需要的那一块,再把切割所剩下的部分返回到动态内存堆里面。在所分配的内存堆中,有一部分是用来存放分配器管理的私有数据的,其大小大约是12个字节,这个部分是不能被修改的,即使是用户也不能,不然就会出现非常致命的错误。内存的释放,相比内存的分配是不同的,可以说是截然相反的。分配器可以对每个节点进行必要的检查,看看它前后会不会有空闲的内存块,如
37、果找到了空闲的内存块,就会将它们合并在一起,形成一个相对较大的空闲内存块了。内存堆的分配策略优点就是:比较简单,内存的浪费小,非常适合于小内存的管理。但是它的缺点也是非常明显的,同时也是不容忽略的,当在频繁的分配或者是释放的过程中,很有可能产生一些小小的碎片,这些小的碎片在内存中是没用的,所以理论上来说,碎片的量当然是越少越好。如果碎片的量得不到有效的控制的话,就有可能导致内存的分配成功率降低。所以为了能够减少内存碎片,比较好的方法就是分配-释放-分配-释放。在对内存堆进行分配的时候,需要对mem_int()内存堆进行初始化,主要就是为了说明起始和结束的地址,还有初始化内存的空闲列表,如果是l
38、wip初始化时,为了给自己进行调用,那么此个接口就是内部存在的私有接口,一般是不会对客户层进行开放的。当Mem_malloc()函数对内存进行分配的时候,它会把所有它所用到的字节数作为数据传递给该函数,而返回来的数据就会指一个新的指针,且这个内存是最新分配的。相反,假如内存在进行分配的时候,结果是不成功,那么就出现返回来的值存在NULL的情况,同时,我们要进行分配的空间大小,在一定程度上也应该受到内存对齐的干扰,结果分配的空间大小可能会比我们所申请的稍微偏大。这样一来,返回的内存就会出现“没有”初始化的。在返回得到地内存当中,很可能会参杂着一些不同的废品,但我们完全能够利用一些更好的数据,甚至
39、是零来对这块内存进行初始化。有一点是必须要说明的,那就是我们的内存分配和释放在中断函数里面不能进行。由于内存堆是一个全局变量,所以在做内存的申请和释放等操作时,是需要做一个线程安全保护的。假如多个线程同时在进行内存的申请和释放的时,申请所耗时间一定会延长的,因为多个信号量会出现等待状态。Mem_calloc()是存在2个不同的值的,一个表示的是元素的大小,一个是表示元素的数目,而我们所要进行分配的内存空间大小,就是以上两个不同值的积。Mem_calloc()实际上就是对mem_malloc()函数的单一拼装,与mem_malloc()不相同之处就是它能够将动态分配内存的值进行清零处理。要想使动
40、态内存池分配部分得以实现,就需要用到memp.c,memp.h文件。在内存池里面进行内存管理,一个最大的优点就是可以很好的防止内存碎片的产生,而且它的内存分配和释放效率会更高,相反,它的缺点就是浪费部分的内存。内存池管理一般是借鉴事先启用的宏,在内存中直接设立一个大内存,最后运用到内存池当中,在进行内存分配的请求的时侯,会直接地参考它所申请的内存大小,选择适合它的长度的池里面去申请。内存池在进行初始化的时候,它的作用是给不同的内存设立一个链表memp_tab,此链表一般来说是逆序的,除此之外,它还具有统计功能,可以记录各样内存池地数目。LWIP的特性有以下几点:1.支持ICMP协议、DHCP协
41、议,同时也支持多网络接口下的IP转发,动态分配IP地址。2.包括实验性的扩展的UDP协议。3.还包含阻塞控制和RTT估算。4.可以为内部函数的回调提供特殊的接口,主要是为了加强应用程序的功能。4.2 IP处理关于IP层来说,它所研究的一般是和信息的接收有关,除此之外,还有信息包的发送和转发,甚至是分片数据包的重装。而LWIP却只是完成了IP最基础的几个性能,那就是数据包的传递、接收和转发,但是却并不能对分割的IP包进行发送和接收,也不能对带有IP选项的数据包进行处理。IP数据报头结构如下:图4-1 IP数据报头结构从上图可以知道,其中的选项字段是允许不存在的,所以我们通常所说的IP数据报头长度
42、一般为20个字节。可以明显的看出,这是一个4位的字段,对于IPv4来说,该数值为4;同理,对于IPv6,该数值就是6了。4bit字段是用来记录首部的长度的,单位为“字”,因此对于一些不包含任何选项字段的IP报头而言,它的长度应该为5,由于该字段所要求的最大值是15,所以它所能够描述的最大IP报头长度就为60字节了。接下来就是一个8bit的服务型字段,这个字段的最主要作用就是能很好的描述IP数据包继续的服务类型,例如:最大吞吐量,最小延时,最高可靠性等等。但是总的来说,这个字段在LWIP中的作用是很小的。16位的总长度字段可以用来总结全部的IP数据报,同时也包括了IP数据报头的总字节数。一般来说
43、,IP数据包的总长度是可以达到65535字节的,然而在实际运用当中,对于这么庞大的数据包是不允许出现在底层链路的,如果存在这样的情况,只会大大地增加数据出现错误的可能性。因此,在链路层是很容易出现大的IP数据包分解这种情况的。接下来的16位标识字段是起到一个标识作用,主要对IP层发出的每一份数据报进行标识,当每发送一份报文的时候,该数值就会加1。而3位标识和13位片偏移字段都是在IP数据包的分片时会运用。TTL字段是用来记录IP数据包能被转发的次数,在每次转发过后,该数值都会减1,直到该数值减为0时,一个ICMP报文就会被返回到源主机那里。还有8位协议字段是用来记录IP数据包的来源的。它能总结
44、每个数据包的来源,不管它是从哪个协议传来的,如果这个数值是1,则说明它是ICMP协议;如果这个数值值是2,则说明它是IGMP协议;如果该数值是6,则说明它是TCP协议;如果该数值为17,则说明它是UDP协议。16位首部校验和只会针对该IP的首部做检验,对于其内部数据在传输过程中是否会出错,它并不是很在乎,数据的校验工作,一般来说是由上层协议负责的,例如:ICMP、UDP、IGMP、TCP等协议都需要计算他们的头部和整个数据区的长度。4.2.1 IP接收包对于要接收的IP数据包,必须先让ip_input()函数被设备驱动函数调用后,才能开始进行处理。在这段过程中,初始化的任务有很多,例如:检测I
45、P所用的版本,还需要确定报头的值,除此之外,要算出和检查报头的checksum域。理想的情况是,在proxy服务器对所有的碎片数据包进行重组以后,我们在堆栈中就再也收不到碎片,如果是这样的话,那么所有含有IP碎片的数据包都会在不知不觉中被丢掉。同样,如果是带有ip选项的包,也会由指定的代理去处理,最终的结果也是被丢掉。接下来的工作就是检验包是否被发往主机了,其实这检验的方法很简单,只要运用函数通过网络接口的IP地址检验目的地址就可以了。我们需要的网络接口已经被安放在链表中并加以排序,是支持线性查询的。一般而言,网络接口的序号都是指定为小的号,因为能比线性查询的方法更好的方法,至今还没找到。假如
46、需要接收的数据包是通过主机指定好的包,那么必须由protocol域来判定该包应该被传给哪个更高层的协议。4.2.2 IP发送包函数ip_output()可以用来处理一个即将发送的数据包,然后再利用另一个函数ip_rout()去寻找一个适合的网络接口,最后顺利的将包上传出去。一旦我们需要的网络接口确定之后,数据包就会被传递到ip_output_if()函数,而这个函数也会把发送网络接口当作一个函数自变量。当这时候,IP报头域会被填补,同时,IP报头checksum也会被计算。最后,IP包的源和目的地址就会被当作一个变量,最终也会被传送到ip_output_if()函数那里。一般来说,源地址是很有
47、可能被忽略掉的,但是我们还是可以把要发送的网络接口的IP地址作为包的来源地址的。如果想要找到一个合适的网络接口,我们可以利用ip_route()函数来实现,它可以通过线性查找网络接口列表很容易的找到我们所想要的接口。在查找IP包的IP地址的过程中,可以很好的利用网络接口的网络掩码来完成。假如所要求的目的地址和掩码的接口IP地址相同,就完全可以选择这个接口。假如并不能找到一个合适的接口匹,那么也只能使用缺省的网络接口了。缺省的网络接口的装配一般是由人亲自开启的时侯,或者是处于运转状态的时侯。还有一种可能性,假如缺省的接口地址都不能够和目的IP地址匹配,那么也就只能选择网络结构中的gw字段作为链路
48、层帧的目的IP地址。 由于TCP在计算运输层校验和的时候需要知道目的的IP地址,所以我们必须保证外发网络接口在已经确定的情况下,才能将数据包传递给IP层。要想达到这个目的,我们可以直接利用运输层的函数,ip_route()函数能很好的完成这个任务,因为数据包到达IP层的时候,外发网络早已经收到信号,就完全没有必要再一次的去查找网络接口列表了。取而代之的是那些协议可以直接的去调用ip_output_if()函数。只要该函数能把网络接口作为一个参数,就有很大的可能性去避免外发接口的查询。4.3 TCP服务器的设计和实现4.3.1 TCP协议的特点TCP协议的中文名字为传输控制协议,它是以IP数据帧为基础而进行传递的,能供应稳定的数据传输服务。