当前位置:文档之家› 毕业论文-嵌入式web服务器的设计与实现

毕业论文-嵌入式web服务器的设计与实现

嵌入式web服务器的设计与实现

摘要:

随着现代通信技术和网络技术的迅猛发展,以太网技术也越来越成熟,特别是基于TCP/IP通信协议的Web技术得到了广泛应用。我们可以用微控制器加以太网接口芯片,取代PC机进行现场控制,组成嵌入式Web Sever系统。现场传感器自动跟踪各监测点的信息,把检测到的数据存储在非易失性存储器中,并及时发布到互联网上;相关的工作人员就可以通过Web技术对设备进行远程控制、管理和维护,从浏览器上直接监控现场设备的运行,这样就大大提高了生产效率和管理水平。

本文主要工作:

1.以ATmega128和LAN91C111为核心的嵌入式系统硬件平台的架构,阐述

了各个模块具体的设计过程。

2. 以μC/OS-II嵌入式操作系统在ATmega128处理器上的移植过程。

3.实现应用于ATmega128上的lw TCP/IP协议栈。

4. 在此基础实现了简化的HTTP协议,并设计了一个基于ATmega128的嵌入式

Web服务器系统。

关键词:网络协议;单片机;以太网芯片;嵌入式操作系统;嵌入式Web服务器

Embedded web server Design

Abstract

Along with the modern communication technology and the rapid development of network technology, Ethernet technology and more mature, particularly based on TCP/IP communication protocol Web technology has been widely applied. We can use micro-controller be too network interface chip, replacing the PC site control,, the embedded Web Sever system. Field sensor automatically keep track of different monitoring point of information, the detected data stored in non-volatile memory, and promptly released onto the Internet; related personnel through a Web technology on the device for remote control, management and maintenance, from the browser on the direct monitoring of field devices running, greatly improved productivity and management level.This article mainly work:

1. to ATmega128 and LAN91C111 as the core of embedded system hardware infrastructure, explains each module specific design process.

2. to μ C/O S-I I embedded operating system in the ATmega128 processor of the transplantation process.

3. implementation of the applied to the ATmega128 lw TCP/IP protocol stack.

4. on this basis enables simplified HTTP protocol, and created a based on the ATmega128 embedded Web server systems.

Key words: network protocols; single-chip; Ethernet chip; embedded operating system; the embedded Web server

目录

摘要: (1)

Abstract (2)

1.1 硬件选择 (5)

1.1.1 ATmega128的特点 (5)

1.1.2以太网控制器LAN91C111 (5)

1.1.3 NEC公司的62256 (6)

1.2硬件架构设计 (6)

1.2.1存储模块 (7)

1.2.2网络模块 (7)

1.3以太网接口设计与实现 (8)

1.3.1 LAN91C111寄存器地址映射 (8)

1.3.2 LAN91C111工作原理 (8)

1.3.3缓存中的数据帧格式 (8)

1.3.4 LAN91C111驱动程序设计 (9)

第二章μC/OS-II嵌入式操作系统的移植 (10)

2.1 μC/OS-II的概述 (10)

2.1.1μC /OS-II简介 (10)

2.2 μC/OS-II的移植 (10)

2.2.1 uC/OS II移植的相关工作 (10)

2.2.2用户实时任务编写 (12)

第三章 LwIP在uCOS II上的实现原理及过程 (14)

3.1概述 (14)

3.2 与CPU或编译器相关的include文件 (14)

3.3 sys_arch操作系统相关部份 (14)

3.4 lib_arch中库函数的实现 (16)

3.5网络设备驱动程序 (17)

第四章嵌入式Web服务器的实现 (18)

4.1嵌入式Web服务器技术 (18)

4.2 HTTP协议实现 (19)

4.3文件系统 (20)

4..4嵌入式Web服务器的工作流程 (22)

4.5嵌入式Web服务器的实现 (23)

谢辞 (27)

参考文献 (28)

前言

Internet与信息产品的结合是当今发展的一个趋势,嵌入式Internet技术的产生正好迎合了这个趋势。由于Internet技术的渗透,嵌入式系统正变得越来越智能化并具有越来越多的网络友好特性。加上Web技术的飞速发展,以太网技术也越来越成熟,特别是基于TCP/IP通信协议的Web技术得到了广泛应用。我们可以用微控制器加以太网接口芯片,取代PC机进行现场控制,组成嵌入式Web 服务器系统。随着计算机技术和网络技术的快速发展,以嵌入式设备为主的监控系统、信息家电和通信设备被广泛使用,嵌入式Web服务器则是其中关键的技术设备。现场传感器自动跟踪各监测点的信息,把检测到的数据存储在非易失性存储器中,并及时发布到互联网上;相关的工作人员就可以通过Web技术对设备进行远程控制、管理和维护,从浏览器上直接监控现场设备的运行,这样就大大提高了生产效率和管理水平。随着Web技术的发展,几乎改变了现在的信息表达形式,很多应用都是基于Web技术的。由于HTML语言的标准统一性,只要在嵌入式设备中有一个微型服务器,就可以使用任意一种Web浏览器接收和发送信息。目前国外的相关研究很多,如Pharlap公司的MicroWeb、AgranatSystems 公司的EmWeb、EmWare公司的emMicro、Allegro公司的RomPager、WindRiver 公司的Wind,还有Boa、Enea、PicoWeb、ChipWeb、Ipic、NetAcquire、Voyager、Quiotix等。国内的有Webit

对于嵌入式Web服务器的研究和应用,其意义是重大的。它为我们管理、控制和监测各种各样设备提供了一个很好的途径。所以如何设计这种特别的Web服务器,如何在嵌入式设备中安装Web服务器,就成了嵌入式Web服务器的发展和研究方向。本文就在嵌入式嵌入式Web服务器技术进行讨论。

第1章硬件设计

1.1 硬件选择

1.1.1 ATmega128的特点

ATmega128为基于AVR RISC结构的8位低功耗CMOS微处理器。由于其先进的指令集以及单周期指令执行时间, ATmega128 的数据吞吐率高达 1 MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。

ATmega128 产品综述:128K 字节的系统内可编程Flash( 具有在写的过程中还可以读的能力,即RWW)、4K 字节的EEPROM、4K 字节的SRAM、53 个通用I/O 口线、32个通用工作寄存器、实时时钟RTC、4 个灵活的具有比较模式和PWM 功能的定时器/ 计数器(T/C)、两个USART、面向字节的两线接口TWI、8 通道10 位ADC( 具有可选的可编程增益)、具有片内振荡器的可编程看门狗定时器、SPI 串行端口、与IEEE 1149.1 规范兼容的JTAG 测试接口( 此接口同时还可以用于片上调试),以及六种可以通过软件选择的省电模式。空闲模式时CPU 停止工作,而SRAM、T/C、SPI 端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作,寄存器的内容则一直保持;省电模式时异步定时器继续运行,以允许用户维持时间基准,器件的其他部分则处于睡眠状态; ADC 噪声抑制模式时CPU 和所有的I/O 模块停止运行,而异步定时器和ADC 继续工作,以减少ADC 转换时的开关噪声; Standby 模式时振荡器工作而其他部分睡眠,使得器件只消耗极少的电流,同时具有快速启动能力;扩展Standby 模式则允许振荡器和异步定时器继续工作。

1.1.2以太网控制器LAN91C111

LAN91C111是SMSC公司生产的专门用于嵌入式产品的10/100M快速以太网控制器,该器件具有可编程、CRC校验、同步或异步工作方式、低功耗CMOS设计、小尺寸等特点,是设计嵌入式以太网网络接口的良好选择。

LAN91C111 主要特点:

1.支持IEEE80

2.3/802.3u以太网标准

2.自动诊测(Auto_Negotiation):10/100M,全双工/半双工收发方式

3.片上8KB的FIFO RAM

4.可外接E2PROM

5.内部32位数据通道

6.硬件MMU,并支持先进的传输队列管理

7.部分输入引脚和I/O引脚支持5V电压,可直接与5V设备相连

8.支持ARM、Power PC、Coldfire等嵌入式处理器的接口

9.内含介质无关接口MII(media independent interface)的介质访问控制

MAC和内部物理接口PHY

10.内含四组I/O寻址寄存器,每组7个;一个用于区别这四组寄存器的组选择

寄存器;11个PHY MII寄存器。

11.可连接同轴电缆或双绞线,带有低通滤波器、100Base-Tx/10Base-T的传

输端

1.1.3 NEC公司的62256

62256是32K的低功耗静态RAM存储器. 用P0和P2来扩展外部ram(就是用P0和P2与62256对应的管脚相连接)。

62256 引脚功能

A0 – A14 地址总线(Address)

D0 /D7 输入/输出口(nput/output)

CS 端口选择(Chip select)

WE 输入始能(Write enable)

OE 输出始能(Output enable)

VCC 电源始能(Power supply)

VSS 接地(Ground)

1.2硬件架构设计

该系统的各个功能模块图如图1.2所示:

图1.2 硬件系统平台结构图

ATmega128的指令执行是基于流水线技术的,使得一条指令可以在一个时钟周期内执行完成,当外接晶振达到16MHZ时,该CPU的执行速度理论可以达到16MIPS的性能。由于ATmega128的内部SRAM较小,所以扩展了32K的SRAM存储器,使得系统的整体性能大幅提升。JTAG是系统必需的接口,它用于将用户编写的程序下载到ATmega128中执行。该系统也提供RS232串口,在调试程序时方便用户输出调试信息;在实际应用中可以将系统中的重要数据通过串口传输到PC机上保存。网络控制器和显示控制器是本系统的两个重要的组成部分,它们都是通过PC104总线和CPU相连接的。本系统选用SMSC公司的LAN91C111网络芯片连接到ATmega128上,通过编写相应的程序使之接入到Internet,实现较高的网络通信性能。

1.2.1存储模块

由于ATmega128芯片内部的SRAM大小只有4KB,运行μC/OS-II嵌入式操作系统和网络应用程序是比较困难的,,所以扩展了一个NEC公司的62256是32KB 的SRAM芯片。由于ATmega128的数据线和低地址线是复用的,因此要将62256 SRAM芯片连接到CPU上时需要加一个地址锁存器74AHC573,这样就可以解决高速CPU和低速存储器之间数据通信的矛盾。

1.2.2网络模块

网络接口模块是本系统硬件设计的核心部分,也是最难的部分。本系统使用SMSC公司高性能的100M LAN91C111网络芯片作为网络模块的核心部件,完成系统的网络通信功能。LAN91C111提供的总线接口单元BIU可以方便地与工业标准

总线进行连接,可以同步或异步的操作,可进行灵活的32位、16位和8位的总线接口设计。在本系统中LAN91C111使用8位异步总线接口与ATmega128相连,极大地提高了系统的吞吐量。由于该LAN91C111工作在异步传输方式下,故将与同步信号有关的引脚LCLK、nRDYRTN、nCYCLE、W/nR设置为无效。nSRDY、nDATACS、nVLBUS是工作在32位数据传输的情况下,而本接口是8位数据传输,故不使用。nADS是地址锁存信号,可将它直接接地。

1.3以太网接口设计与实现

本系统采用LAN91C111作为网络接口,研究其内部的工作机制是编写驱动程序的基础。以太网控制芯片功能的实现主要通过读写相关的寄存器组实现,寄存器对外映射为接口地址。

1.3.1 LAN91C111寄存器地址映射

LAN91C111内部的寄存器分为BANK0-BANK3共四页。页面选择通过页选择寄存器(Bank Select register, BSR)来进行。不论当前页是哪一页,改变BSR 的值就可以切换BANK,利用16个字节地址空间映射到I/O口就能实现对整个芯片的操作。

1.3.2 LAN91C111工作原理

对于100Mbps来说,发送数据时,MMU首先将MCU传来的数据,根据其大小为其在RAM中分配若干页。在数据传送到RAM时,数据包的包号在TX FIFO中排队,然后按照FIFO规则逐个将数据包传送到PHY模块进行4B5B编码,并经过扰频器整理后送到发送数据端。发送数据端将这个经过扰频后的4B5B数据包变成三电平信号MLT-3并加以驱动在双绞线上输出。接收数据时,LAN91C111首先将数据包复制一份并送到解扰频器后,再送到4B5B解码器解码,而EPH模块根据数据包的目标地址是否为本网卡的MAC地址或广播地址、多播地址来决定数据包的取舍。若地址匹配,MMU为其在RAM中开辟相应大小的空间,并以中断方式告知处理器。当数据包被取走后,MMU释放此块内存。对于10Mbps来说,发送接收过程是相似的,但它采用Manchester编码,并以适当的电平加以驱动在双绞线上输出,并且没有扰频器和解扰频器。

1.3.3缓存中的数据帧格式

要发送的以太帧开头加上四个字节,开头两个是状态字,用户可写入0,发送时由芯片自动重写。下两个字节并为一个字,低11位记录缓存当前页的占用情况,含以太帧、状态字、字节记数和最后一个控制字的长度,发送时由用户填写。字节记数不考虑自动PAD填充位的长度。控制字节格式如图1.9所示。

Bit7 bit0

图1.9 控制字节格式

ODD为1表示数据区长度是奇数,最后一个数据字节有效,数据字节总数为偶数。ODD为0表示数据区长度是偶数,最后一个数据字节无效。CRC为1表示数据帧后加CRC校验。CRC为0表示不加CRC校验。

1.3.4 LAN91C111驱动程序设计

LAN91C111接收数据的流程如下:

(1) 设置Receive Control寄存器中的RXEN位为1,允许接收数据包。

(2) 收到含有正确地址的数据包后,MMU请求分配存储空间,并分派一个packet number,内部的DMA逻辑产生连续的地址,并将接收到的字写到内存中。如果超界,包被丢弃,存储空间被释放。当检测到包结束,status word被写到接收包的最前面,byte count写到第2个字。如果CRC校验正确,packet number 被写到RX FIFO,由于RX FIFO非空,产生RCV INT中断。如果CRC校验不正确,存储空间被释放,而且不产生中断。

(3) CPU接收到中断后开始执行中断处理程序,它读入Interrupt Status 寄存器,如果产生接收中断(RCVINT位为1),则可以从FIFO Ports寄存器得到接收的包的packet number,而且可以从数据寄存器中将接收包传送到内存或外存中。当处理结束后,CPU向处理器发送命令释放使用的存储空间和packet number。

第二章μC/OS-II嵌入式操作系统的移植

2.1 μC/OS-II的概述

μC/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。

2.1.1μC /OS-II简介

μC /OS-II是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。μC/OS-II绝大部分的代码是用ANSI的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到6 4位,μC/OS-II 已在超过40种不同架构上的微处理器上运行。μC/OS-II已经在世界范围内得到广泛应用,包括很多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。实际上,μC/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局(Federal Aviation Administration)的认证,可以用在飞行器上。这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统。除此以外,μC/OS-II 的鲜明特点就是源码公开,便于移植和维护

2.2 μC/OS-II的移植

要把uC/OS II成功地移植到某一处理器上.该处理器必须满足以下要求:

1.处理器的C编译器能产生可重入代码。

2.用C语言就可以打开和关闭中断。

3.处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。

4.处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。

5.处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。

2.2.1 uC/OS II移植的相关工作

uC/OS II的移植工作主要涉及与处理器相关的以下内容:

与编译器相关的数据类型声明(OS_CPU.H)不同的处理器有不同的字长.所以必须定义一系列数据类型以确保移植的正确性。文件OS_CPU.H中声明了10个相关数据类型。

改写与任务管理相关的函数(OS_CPU_C.C)uC/OS II移植需要改写6个与任务管理相关的函数.它们是:OSTaskStkInit()、OSTaskCreatHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTaskTickHook()其中只需对OSTaskStkInit()编写代码,后5个函数必须声明,但是内部并没有代码。OSTaskCreate()和OsTaskCreateExt()通过调用OSTaskStkInit()来初始化任务的堆栈结构。

编写与任务切换相关的函数(OS_CPU_A.ASM),uC/OS II的移植要求用户编写四个与处理器相关的汇编语言函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。(1) OSStartHighRdy( )函数

OSStartHighRdy( )由OSStart( )函数调用,功能是在多任务调度开始时运行优先级最高的就绪任务。它主要完成三件事:一是通知操作系统,多任务调度已经开始;二是使SP指向优先级最高的就绪任务的任务栈栈顶;三是恢复最高优先级任务的运行环境。在调用OSStart( )函数之前,必须先调用OSInit( )函数进行系统初始化,且至少己经创建一个任务。在OSStartHighRdy( )启动之前,必须调OSTaskSwHook( )函数,通过检查变量OSRuning来确定OSTaskSwHook( )函数被调用的对象。为了启动任务,OSStartHighRdy( )首先找到当前就绪的优先级最高任务,并从任务的任务控制块中找到指向堆栈的指针,然后从堆栈中弹出全部寄存器的内容,运行中断返回指令。由于任务创建时堆栈的结构就是按中断后的堆栈结构初始化的,执行中断返回指令后就切换到了新任务。

(2) OSCtxSw( )函数

OSCtxSw( )是一个任务级的任务切换函数,它主要完成以下几件事:保存当前任务现场;保存当前任务的任务栈指针到当前任务的任务控制块;切换最高优先级任务为当前任务;使SP指向最高优先级任务的任务栈的栈顶;恢复新任务的运行环境。

在μC/OS-II中,如果任务调用了某个函数,而该函数的执行结果可能造

成系统任务重新调度,则在函数的末尾会调用OSShed( ), OSShed( )将查找当前就绪的优先级最高的任务,若不是当前任务,则判断是否需要进行任务调度,并找到该任务控制块OS_TCB 的地址,将该地址拷贝到变量OSTCBHighRdy中,然后通过OSCtxSw( )进行任务切换。在此过程中,变量OSTCBCur始终包含一个指向当前运行任务OS_TCB的指针。

(3) OSIntCtxSw( )函数

OSIntCtxSw( )由于中断可能会使更高优先级的任务进入就绪态。为了让更高优先级的任务能立即运行,所以需要在中断中进行任务切换。在中断服务子程序的最后,OSIntExit( )函数会调用OSIntCtxSw( )做任务切换。OSIntCtxSw( )是一个中断级的任务切换函数。在此之前,中断服务程序已经保存了被中断任务的现场,因此不需要再保存现场了。OSIntCtxSw( )需要调整堆栈指针,去掉堆栈中一些不需要的内容,以使堆栈中只包含任务的运行环境。

(4) OSTickISR( )函数

OSTickISR( )是μC/OS-II要求用户提供一个周期性的时钟源,来实现时间的延时和超时功能。为了达到这一要求,可以使用硬件定时器,也可以从交流电中获得50/60Hz的时钟频率。本文是采用ATmega128的硬件定时器Timer来获得周期为100ms的时钟节拍。

如果用户的编译器支持插入汇编语言代码,可将所有与处理器相关的代码放到OS_CPU_C.C文件中,该文件便不再需要。编写中断服务程序CPUhighInterruptHook() 数和CPUlwoInterruptHook()函数

2.2.2用户实时任务编写

uC/OS II中的实时任务是在系统初始化(调用OSInit()和OSCtxSw())后,通过OSTaskCreateExt()调用创建的,实时任务创建完成后,调用OpenTimer0()设置时钟中断,最后调用OSStart(),系统开始运行并进行任务调度。

为了测试移植的结果,使用高奇ICD DEMO教学实验板并利用板上资源创建TempTask()、LEDTask()及通过RS232实现的Shell任务。其中,Shell任务接收并执行用户的Shell命令.并通过LCDTask()任务显示该命令.TempTask()则实现则周期性地采集与RA0-RA3相连接的温度。由于PIC的USART中只有2个字节的FIFO缓冲队列,快速的通信过程中很容易丢失数据.故除了通信的实现采用

中断方式之外.还设计了一个30Byte的缓冲队列,存放接收到的数据,接收数据由设计在CPUlowInterruptHook()中的代码完成,

uC/OS II是一个完整的、可移植、可裁减、源码公开的抢占式实时多任务操作系统。因此程序开发人员可以在嵌入式系统的开发过程中.灵活地改写其源代码.以满足用户特定的需求。uC/OS II在处理器上的成功移植.将大大提高复杂应用系统的开发效率.增强系统的可靠性,降低开发成本,提高经济效益。

第三章 LwIP在uCOS II上的实现原理及过程

3.1概述:

LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件、OS、编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下。因此LwIP在uCOS II上的实现就是修改这个目录下的文件,其它的文件一般不应该修改。下面分几部份分别说明相应文件的实现原理和过程。

3.2 与CPU或编译器相关的include文件

μC/OS II&LwIPsource etlwiparchucosIIincludearch目录下cc.h、cpu.h、perf.h中有一些与CPU或编译器相关的定义,如数据长度,字的高低位顺序等。这应该与用户实现μC/OS II时定义的数据长度等参数是一致的。

此外还有一点:一般情况下C语言的结构体struct是4字节对齐的,但是在处理数据包的时候,LwIP使用的是通过结构体中不同数据的长度来读取相应的数据的,所以,一定要在定义struct的时候使用_packed关键字,让编译器放弃struct的字节对齐。LwIP也考虑到了这个问题,所以,在它的结构体定义中有几个PACKED_FIELD_xxx宏,默认的时候这几个宏都是空的,可以在移植的时候添加不同的编译器所对应的_packed关键字。比如在Skyeye(C33209)上对应gcc编译器的定义:

#define PACK_STRUCT_FIELD(x) x __attribute__((packed))

#define PACK_STRUCT_STRUCT __attribute__((packed))

#define PACK_STRUCT_BEGIN

#define PACK_STRUCT_END

3.3 sys_arch操作系统相关部份

sys_arch.[ch]中的内容是与OS相关的一些结构和函数,主要可以分为四个部份:

(1) sys_sem_t 信号量

LwIP中需要使用信号量通信,所以在sys_arch中应实现信号量结构体和

处理函数:

struct sys_sem_t

sys_sem_new() //创建一个信号量结构

sys_ sem _free() //释放一个信号量结构

sys_ sem _signal() //发送信号量

sys_ arch_sem _wait() //请求信号量

由于μC/OSII已经实现了信号量OS_EVENT的各种操作,并且功能和LwIP 上面几个函数的目的功能是完全一样的,所以只要把μC/OSII的函数重新包装成上面的函数,就可以直接使用了。

(2) sys_mbox_t 消息

LwIP使用消息队列来缓冲、传递数据报文,因此要在sys_arch中实现消息队列结构sys_mbox_t,以及相应的操作函数:

sys_mbox_new() //创建一个消息队列

sys_mbox_free() //释放一个消息队列

sys_mbox_post() //向消息队列发送消息

sys_arch_mbox_fetch() //从消息队列中获取消息

μC/OSII同样实现了消息队列结构OSQ及其操作,但是μC/OS-II没有对消息队列中的消息进行管理,因此不能直接使用,必须在μC/OS-II的基础上重新实现。为了实现对消息的管理,定义了以下结构:

typedef struct {

OS_EVENT* pQ;

void* pvQEntries[MAX_QUEUE_ENTRIES];

} sys_mbox_t;

在以上结构中,包括OS_EVENT类型的队列指针(pQ)和队列内的消息(pvQEntries)两部分,对队列本身的管理利用μC/OS-II自己的OSQ操作完成,然后使用μC/OS-II中的内存管理模块实现对消息的创建、使用、删除回收,两部分综合起来形成了LwIP的消息队列功能。

(3) sys_arch_timeout 函数

LwIP中每个与外界网络连接的线程都有自己的timeout属性,即等待超时

时间。这个属性表现为每个线程都对应一个sys_timeout结构体队列,包括这个线程的timeout时间长度,以及超时后应调用的timeout函数,该函数会做一些释放连接,回收资源的工作。如果一个线程对应的sys_timeout为空(NULL),说明该线程对连接做永久的等待。

timeout结构体已经由LwIP自己在sys.h中定义好了,而且对结构体队列的数据操作也由LwIP负责,我们所要实现的是如下函数:

struct sys_timeouts * sys_arch_timeouts(void)

这个函数的功能是返回目前正处于运行态的线程所对应的timeout队列指针。timeout队列属于线程的属性,因此是OS相关的函数,只能由用户实现。

(4) sys_thread_new 创建新线程

LwIP可以是单线程运行,即只有一个tcpip线程(tcpip_thread),负责处理所有的tcp/ucp连接,各种网络程序都通过tcpip线程与网络交互。但LwIP 也可以多线程运行,以提高效率,降低编程复杂度。这时就需要用户实现创建新线程的函数:

void sys_thread_new(void (* thread)(void *arg), void *arg);

在μC/OS II中,没有线程(thread)的概念,只有任务(Task)。它已经提供了创建新任务的系统API调用OSTaskCreate,因此只要把OSTaskCreate封装一下,就可以实现sys_thread_new。需要注意的是LwIP中的thread并没有μC/OS II中优先级的概念,实现时要由用户事先为LwIP中创建的线程分配好优先级。

3.4 lib_arch中库函数的实现

LwIP协议栈中用到了8个外部函数,这些函数通常与用户使用的系统或编译器有关,如下:

u16_t htons(u16_t n); //16位数据高低字节交换

u16_t ntohs(u16_t n);

u32_t htonl(u32_t n); //32位数据大小头对调

u32_t ntohl(u32_t n);

int strlen(const char *str); //返回字符串长度

int strncmp(const char *str1, const char *str2, int len); //字符

串比较

void bcopy(const void *src, void *dest, int len); //内存数据块之间的互相拷贝

void bzero(void *data, int n); //内存中指定长度的数据块清零

3.5网络设备驱动程序

在我的系统中使用的网络芯片为RealTek的8019as芯片,这是ISA 10BASE-T的以太网芯片,与Ne2k兼容。所以目前实现的网络设备驱动是针对Ne2k的,其它类型的网络芯片驱动可以在LwIP的网站上找到。LwIP的网络驱动有一定的模型,ucosii&LwIPsource etlwiparchucosII etif 中的ne2kif.c文件即为驱动的模板,用户为自己的网络设备实现驱动时应参照此模板。

在LwIP中可以有多个网络接口,每个网络接口都对应了一个struct netif,这个ne2kif包含了相应网络接口的属性、收发函数。LwIP调用ne2kif 的方法netif->input()及netif->output()进行以太网packet的收、发等操作。在驱动中主要做的,就是实现网络接口的收、发、初始化以及中断处理函数。驱动程序工作在IP协议模型的网络接口层,它提供给上层(IP层)的接口函数以上的函数都可以分为协议栈本身的处理和对网络接口硬件的操作两部份,但硬件操作是对上层屏蔽的,具体参见RTL8019as、DM9008等Ne2k网络芯片的数据手册。驱动程序可以到LwIP的网站下载。

第四章嵌入式Web服务器的实现

4.1嵌入式Web服务器技术

嵌入式Web服务器技术的核心是HTTP引擎。HTTP协议是WEB应用的标准协议,其已经从HTTP1.0发展到HTTP1.1,性能有很大改变,增加了缓存功能,同志就是TCP连接形式的改变。HTTP1.0在每次HTTP请求中都需要TCP连接。一个典型的页面可能含有许多单独的HTT请求,如基本页面请求、每个HTML框架请求、每个图形请求等。建立每个请求并且产生每TCP连接需要占用大量的CPU 和内存资源。

图4.1嵌入式Web服务器系统模型

Browser/Server(简称B/S)模式已经成为流行的开发模式,本课题中的嵌入式WEB服务器要实现的功能主要是现场实时数据发布的功能。B/S访问模式是WEB Server和Browser之间的直接访问。客户和服务器间的中间节点不对HTTP请求及响应做任何操作,只需在客户端采用IE浏览器就可以对服务器上的数据进行浏览访问,不用开发客户端程序。采用B/S结构具有如下优势:

(1) 具有分布性特点,可以随时随地进行业务处理;

(2) 系统维护或升级只在服务器端,对客户端无须进行改动,只需要改变服务器端网页,即可实现所有用户的同步更新,易于维护和升级;

(3) 应用程序开发简单,共享性强。

4.2 HTTP协议实现

HTTP协议是一种请求/响应协议。在基于HTTP的客户/服务器数据交换时,当HTTP请求产生时,就开始一次HTTP通信。过程如下:浏览器提取出URL中的主机后,向DNS发出请求,解析主机名的IP地址;DNS解析地址并将结果返回给浏览器;浏览器向该地址请求建立TCP连接;浏览器发出请求报文;服务器向浏览器发送响应报文,并将指定数据发送给浏览器;断开连接。

根据HTTP协议规定,如果客户端没有发出请求,则服务器不会自动发送页面。因此通过在网页程序中加入标记,使浏览器在无用户干预下周期性地刷新页面,从而保证用户及时地获得远程现场的信息。

HTTP消息包括一个起始行、零个或多个消息头域、一个标示头域结束的实体行和一个可能存在的消息体。本程序主要解析消息的起始行,而忽略其它内容,这种处理思路也符合嵌入式系统硬件对软件实现的复杂度要求。请求方法决定了对请求URI所指定的资源进行操作的方式,GET方法读取URL指定的资源,一般用来向服务器传输少量且透明的数据,数据总量被限制在255个字符以内,而POST方法可传输大量数据,与HTML的表单特性相配合以实现远程动态交互控制。HTTP报文有两种类型:请求和响应。请求报文格式如下:

request-line

headers ( 0或有多个)

body(只对POST请求有效)

request-line的格式是:

request request-URL HTTP版本号

支持以下三种请求:

(1) GET请求,返回Request-URL所指出的任意信息。

(2) HEAD请求,类似于GET请求,但服务器程序只返回指定文档的首部信息,而不包含实际的文档内容。该请求通常被用来测试超文本链接的正确性、可访问性和最近的修改。

(3) POST请求用来发送电子邮件、新闻或发送能由交互用户填写的表格。这是唯一需要在请求中发送body的请求。使用POST请求时需要在报文首部

content-length字段中指出body的长度。

响应报文的格式是:

status-line

headers(0个或有多个)

body

status-line的格式是:

HTTP版本号 response-code response-phrase

在己经建立TCP连接的基础上,一个HTTP会话包括两个过程:客户端发送请求数据报文,Web服务器端完成相应动作并发送应答数据报文。服务器端在每次接收到HTTP请求报文时需做大量工作:对接收到的请求数据报文复杂的头部进行解析;准备符合协议的应答数据报文头部;从自身存储器中读出需要的数据填入数据报文的实体部分。

在本系统的设计方案中,考虑到该嵌入式系统只提供浏览信息的作用,所以嵌入式Web服务器仅接受GET请求方法,GET方法用于客户端获取页面文件。HTTP1.l中定义的一些其他方法,例如用于返回用户控制信息、客户端更新、删除服务器端文件或者用于客户端探察请求路径等用途都不做处理。每次请求HTTP 数据报文到达时,先解析是否为GET方法,如果不是GET方法则不做处理。

如果嵌入式Web服务器接收到的HTTP请求报文使用的是GET方法,表明客户端要求获得一个页面,则服务器端开始解析所请求页面的URL(Universal Resource locator)。每次包含GET方法的请求数据报文到达时,先将报文的元信息部分记录下来存放到EEPROM 中。封装应答HTTP数据报文时,先从EEPROM 头部读取固定的HTTP报文头部数据,然后装入报文的实体部分。这种方式的使用,提高了处理器读取存储器的效率,减小了系统的响应时间。

4.3文件系统

浏览器向嵌入式Web服务器发送连接请求,服务器由网络侦听状态进入接受状态,并对请求的信息进行判断、分析和回应。在响应用户的请求时,嵌入式Web服务器要产生真正有用的Web页面,我们不可能简单地在程序中用语句来按HTTP语法逐一产生页面,比较明智的做法是把网页文件保存起来,在需要的时

相关主题
文本预览
相关文档 最新文档