APP下载

基于μC/OS-Ⅱ和LwIP的嵌入式Web服务器实现

2011-02-03杨俊吕建平徐峰柳

电气自动化 2011年3期
关键词:浏览器以太网邮箱

杨俊 吕建平 徐峰柳

(苏州大学 电子信息学院,江苏苏州 215006)

0 引言

随着嵌入式系统和单片机技术的发展,嵌入式以太网的设计越来越受关注。美国贝尔实验室总裁Arun Netravali等一批科学家曾经作出了预测:未来"将会产生比PC时代多出成百上千倍的瘦服务器和超级嵌入式瘦服务器,这些瘦服务器将与我们这个世界你能想象到的各种物理信息、生物信息相连接,通过Internet自动地、实时地、方便地、简单地提供给需要这些信息的对象"[1]。因此,研究和设计嵌入式网络通信将具有十分重要的价值。本文以LPC1768、DP83848CVVP芯片搭建硬件平台,构建以μC/OS-Ⅱ、LwIP为基础的软件系统,在此基础上实现web服务,从而达到通过浏览器对其进行访问的目的。

1 μC/OS-Ⅱ系统分析及移植

μC/OS-Ⅱ是由美国人Jean J.Labrosse编写的一个公开源代码的微内核嵌入式实时操作系统,其实时性能和内核的健壮性早已经在大量的实际应用中得到了证实。具有如下特点:①公开源代码,②移植性好,③可裁剪,④稳定性和可靠性高。

1.1 μC/OS-Ⅱ系统分析

μC/OS-Ⅱ是多任务系统,内核负责管理各个任务,每个任务都有其优先级,μC/OS-Ⅱ最多可以管理64个任务,其每个任务都拥有自己独立的堆栈。μC/OS-Ⅱ提供了非常丰富的系统服务功能,比如信号量、消息邮箱、消息队列、事件标志、内存管理和时间管理等,这些功能可以帮助用户实现非常复杂的应用。

1.2 μC/OS-Ⅱ移植

μC/OS-Ⅱ作为操作系统,全部源代码大约是6000~7000行,文件结构如图1所示,移植主要是处理与处理器相关的源文件,即 os_cpu_c.c,os_cpu_a.s,os_cpu.h。其中 os_cpu.h 主要包含编译器相关的数据类型的定义、堆栈类型的定义以及几个宏定义和函数说明,为了便于移植,须重新定义数据类型,因为不同的编译器所提供的同一数据类型的数据长度并不相同。os_cpu_c.c文件中主要实现任务堆栈的初始化函数OSTaskStkInit(),任务创建函数通过调用函数OSTaskStkInit()初始化任务堆栈结构。在os_cpu_a.s文件中需要根据具体的硬件处理器实现几个汇编函数OSstartHighRdy()、OSCtxSw()、OSIntetxsw以及临界处理函数OS_CPU_SR_Save,OS_CPU_SR_Restore。尤其需要注意的是,由于LPC1768是cortex-m3内核,故OSCtxSw()、OSIntetxsw函数都是通过触发pendsv(可挂起中断服务)来完成,它负责μC/OS-II的全部上下文切换。

图1 μC/OS-Ⅱ系统文件结构

2 LPC1768的网络接口设计

由于LPC1768的以太网控制器只集成了介质访问控制器(MAC),缺少物理层(PHY),故本系统选用的 PHY芯片为DP83848CVV芯片,由 National Semiconductor公司生产,RJ45接口选用 HanRun公司生产的 HR911105A接口。DP83848CVV、HR911105A与LPC1768的硬件连接示意图如图2所示。1768的以太网模块使用RMII(简化的媒体独立接口)协议和片上MIIM(媒体独立接口管理)串行总线、MDIO(管理数据输入/输出)来实现与片外PHY之间的连接,MIMM接口可对PHY寄存器进行访问。RMII对应的引脚为 ENET_TX_EN、ENET_TXD[1:0]、ENET_RXD_[1:0]、ENET_RX_ER、ENET_CRS、ENET_REF_CLK,接口MIMM对应的引脚为ENET_MDC、ENET_MDIO。需要注意的是使用DP83848CVV芯片的RMII模式必须外接50MHz的有源晶振。

图2 LPC1768网络连接示意图

3 LwIP介绍

LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。

3.1 LwIP协议栈的体系结构

LwIP的体系结构如图3所示,由图可知:LwIP由一些相对独立的模块组成,除TCP/IP协议的实现模块(IP、ICMP、UDP、TCP)外,还包括许多相关的支持模块,这些支持模块包括操作系统模拟层、缓冲与内存管理模块、网络接口函数以及一组Intemct校验和计算函数、API接口函数。

图3 LwIP协议栈体系结构

3.2 LwIP移植:实现操作系统模拟层

LwIP的操作系统模拟层(sys_arch)是底层操作系统和LwIP之间的一个接口,为LwIP提供信号量和邮箱2种进程间通信方式。当用户移植LwIP时,只需修改这个接口即可。主要实现以下几种类型的函数,分别是信号量操作函数、邮箱操作函数、临界保护函数、sys_thread_new()函数、sys_arch_timeouts()函数。由于μC/OS-II提供了创建任务函数、临界保护函数以及丰富的信号量和邮箱操作函数,所以只需对这些函数稍加修改,便可实现LwIP操作系统模拟层的函数。

3.3 LwIP协议栈的TCP通信流程

TCP属于传输层协议,它为应用层提供可靠的字节流服务,建立在TCP协议之上的应用层协议有 HTTP等。本文采用的是HTTP协议。基本的TCP处理过程被分割为6个功能函数来实现:tcp_input()、tcp_process()、tcp_receive()、tcp_write、tcp_enqueue、tcp_output。实现框图如图4所示。

图4 TCP层通信流程

3.4 LwIP主线程tcpip_thread

主线程tcpip_thread是一个主控循环,底层接口函数通过tcpip_thread和lwip的内部函数进行通信,比如在进行tcp传输时,底层接口函数通过传递邮箱mbox的方式进入到tcpip_thread,然后在该函数中,进入tcp层的tcpip_input函数中,实现tcp层的传输。

3.5 LwIP API

LwIP API专为LwIP设计,所以它可以充分利用LwIP的内部结构以实现其设计目标,不需要在应用程序和协议栈之间复制数据,因此应用程序可以巧妙地直接处理内部缓冲区。LwIP API使用2种数据类型,分别为:①、netbuf,描述网络缓存的数据类型,对应的函数为netbuf_new()、netbuf_delete()、netbuf_alloc()等;②、netconn,描述网络连接的数据类型,对应的函数为netconn_new,netconn_delete()、netconn_bind,netconn_connect()、netconn_accept()等。LwIP的上层应用程序是基于LwIP API编写的。

4 HTTP协议

超文本传送协议(HTTP)是实现www的应用层协议,HTTP负责web服务器与web客户(浏览器)之间的实际超文本文档的传送。

4.1 HTML 语言

网页就是一个HTML语法格式的纯文本文档,HTML是网络所基于的标准的格式化语言。HTML文档与网页在浏览器的显示并不相同,浏览器显示的是对HTML文档的解释。

4.2 HTTP 报文格式

一个HTTP事物包含一个HTTP请求和一个HTTP应答报文,这两种报文都遵循一个通用结构,被称为HTTP报文格式,如图5所示。由图可知,请求行是HTTP请求报文的起始行,用于指示命令或客户要求服务器执行的动作、方法、要引用的资源以及客户使用的HTTP版本。该行格式如下:<IMETHOD> <I请求的URI> <IHTTP版本>,其中方法(method)告知服务器要执行的动作。方法的种类有"get"、"post"、"HEAD"等。本系统实现的是利用"get"请求向服务器提取网页。

图5 HTTP报文格式

5 系统实现

本系统的实现是通过在μC/OS-Ⅱ下建立的4个任务完成,分别是:①起始任务task_start(),优先级为0,用于创建其他3个任务并进行LwIP、EMAC的初始化,执行之后被挂起,永不再执行;② 底层硬件接收任务ethernetif_input(),优先级为4;③ tcpip_thread()任务,优先级为1;④ http_server任务,优先级为10。任务②、③、④依靠μC/OS-Ⅱ下的信号量sem和邮箱mbox进入就绪态,否则被挂起。如图6所示:

图6 ethernetif_input、tcpip_thread、http_server通信流程

当本系统上电时,由于此时浏览器并没有发送数据,网络接口没有数据,故没用中断发生,sem和mbox无法投递,所以此时这3个任务完全由μC/OS-II内核的系统定时器中断依据优先级而发生切换,程序流程如图7。tcpip_thread的优先级最高,tcpip_thread首先被运行,但由于没有邮箱被投递,故该任务随之被挂起,在内核调度的作用下,ethernetif_input()任务开始运行,同理,sem也没有投递,随之挂起,然后进入到http_server任务,随之也被挂起,此时系统进入空闲任务,等待中断的发生,即等待浏览器的访问。

图7 未发生中断时,系统程序流程图

web服务器的实现:

http_server任务是基于lwip API编程的,程序流程如图8所示,由图可以看出,在进入到netconn_accept函数时,等待邮箱accept_mbox的到来,否则被挂起。accept_mbox邮箱是在浏览器和服务器三次握手之后由accept_function()投递,此时程序进入netconn_recv()函数,等待recv_mbox的到来。recv_mbox的投递发生在数据被传至tcp层时,由 recv_tcp函数投递的。一旦 recv_mbox被 post,则进入到netbuf_data()函数,用于获得接收数据指针,这个指针指向netbuf的第一个数据片段且这个片段包含HTTP请求,若是"get"请求,则发送网页,若不是则关闭连接,等待下一个连接到来。

图8 http_server任务流程图

6 结束语

本文详细介绍了利用LPC1768以太网控制模块,在μC/OS-II操作系统的基础上,移植LwIP协议栈,搭建嵌入式web服务器的过程。由于搭建的web服务器具有网页数据动态显示功能,可以满足一般的嵌入式设备进行远程监控,所以本系统实现对嵌入式设备的远程检测和控制具有很好的借鉴意义。

[1] 李纪栓.嵌入式INTERNET接入模块的设计[J].机械管理开发,2006,5.

[2] 焦海波,刘健康.嵌入式网络系统设计-基于Atmel ARM7系列[M].北京:北京航空航天大学出版社,2008.4.

[3] (美)JEAN J.LABROSSE.嵌入式实时操作系统μC/OS-II(第2版)[M].邵贝贝译.北京:北京航空航天大学出版社,2003.5.

[4] 郑巨明,张和生,贾利民等.基于μC/OS-II和LwIP的嵌入式以太网接口设计[J].计算机测量与控制,2009,17(11).

[5] 熊海泉.μ C/OS II下LwIP协议的移植实现[J].科技广场,2005.2.

[6] 苏义鑫,毛晓磊.uIP在S3C44B0X上的移植研究及webserver实现[J].微型电脑应用,2008,24(2).

猜你喜欢

浏览器以太网邮箱
基于1500以太网养猪场的智能饲喂控制系统的设计与实现
反浏览器指纹追踪
没问题邮箱
谈实时以太网EtherCAT技术在变电站自动化中的应用
关于停止使用dianxunjishu@china.com邮箱的通知
环球浏览器
一种90W高功率以太网供电系统的设计
浅谈EPON与工业以太网在贵遵高速公路中的应用
邮箱变更
《胃肠病学》邮箱更改启事