- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于S3C44B0与uClinux构建web服务器
1 引言
随着互联网在全球的飞速发展,网络技术广泛应用于各种企业和工业系统,越来越多的信息化产品需要能够接入互联网通过web页面进行远程访问和控制。嵌入式web服务器是当今研究嵌入式[1]的应用热点,可广泛的应用到工业设备,自动化农业,信息化家电,远程监控报警系统等。目前正在开发的嵌入式系统中,将近一半的项目都选用Linux作为嵌入式操作系统,而uClinux是一个经过对标准Linux内核改动,高度优化、代码紧凑的嵌入式Linux[2]它保留了Linux的大多数优点,具有良好的移植性、优秀的网络功能。目前,基于三星S3C4510b与uClinux下web服务器已经实现,而基于S3C44B0与uClinux下web服务器的实现尚不多见。本文通过网口控制芯片RTL8109AS与S3C44B0的连接,实现了硬件设计,采用uClinux源代码和boa服务器源代码的编译以及CGI网关接口程序的编写实现了软件设计,在自行设计的S3C44B0开发板上实现了基于uClinux下的boa服务器和动态网页CGI网关接口程序,通过浏览器输入开发板的IP地址就可以动态地访问开发板上的网页。
2 硬件方案实现
本文设计的ARM开发板的核心是三星(Samsung)S3C44B0微处理器,是基于ARM7TDMI[3]的 RISC型CPU,是性价比较高的嵌入式32位处理器之一。S3C44B0芯片包含一个使用了66MHz和单周期精简指令处理器(ARM7TDMI),内建8k高速缓存器,2通道通用DMA、2通道外设DMA并具有外部请求引脚、2通道UART带有握手协议、11通道SIO、1通道多主IIC-BUS控制器、5个PWM定时器、71个通用I/O口等等并且能够与常用的外围设备实现无缝连接,从而简化了外围电路设计,降低了产品成本、体积和功耗。本文自行设计的开发板使用16MSDRAM和2Mflash的内存构架。其中Flash型号是SST39VF160,主要用于存放BIOS程序、uClinux内核映象以及ROMFS文件系统。SDRAM则采用两片HY57V641620,共同组成16M、32位宽的系统主存储器。外设方面,采用CS4334芯片进行音频扩展,采用PDIUSBD12芯片扩展了一个USB接口,串口控制芯片采用常见的MAX232,网口控制芯片采用Realtek公司的 RTL8109AS扩展1个10/100M的网卡设备。开发板框架如图1所示:
图1 开发板整体框架图
3 软件设计
3.1 uClinux在S3C44B0上的移植
本开发板采用 uClinux作为操作系统,uClinux是专门针对没有MMU的CPU,适合嵌入式系统小型化应用。uClinux经过对标准Linux内核的改动,形成了一个高度优化、代码紧凑的嵌入式Linux,uClinux保留了Linux的大多数优点:稳定,良好的移植性,优秀的网络功能,完备的对各种文件系统的支持,以及标准丰富的API。而且在uClinux系统上开发的应用程序可移植性很好,系统升级也非常容易,所以本文选用uClinux作为嵌入式操作系统。在S3C44B0上对uClinux内核进行的移植过程为:
首先对其源代码进行编译,从网上下载一个uClinux源代码,一般是压缩格式(tar.gz)的,将其解压,在当前目录下产生一个uClinux-dist目录,进入uClinux-dist目录,然后依次键入
(1) make menuconfig 进入菜单化的源代码配
置工具
(2) make clean 清除所有的编译结果
(3) make dep 设置文件依赖关系
(4) make lib_only 编译库文件
(5) make user_only 编译应用程序
(6) make romfs 编译文件系统
(7) make image 生成映象文件
(8) make 完成整个编译过程
编译完成后,在image下产生三个文件,image.ram,image.rom,romfs.img。将image.rom通过网口用tftp工具下载到系统板的flash中0x0处,上电键入BIOS提供的命令,uClinux便从SDRAM启动,完成移植过程[4-5]。
3.2 基于uClinux的web技术实现
(1) web服务器的工作原理[6-7]
web 服务器作为一个数据载体,可以将本地的信息和数据通过网络传递给远端发出请求的客户,这在远程监控的实现有很大的意义。web服务器监听用户端的服务请求,根据用户请求的类型提供相应的服务。用户端使用web浏览器和web服务器进行通信。web服务器在接收到用户端的请求后,处理用户请求并返回需要的数据。一个完整的HTTP事务一般由以下四个阶段组成:
l 客户与服务器建立TCP连接;
l 客户向服器发送请求;
l 如果请求被接受,则由服务器发送应答,在应答中包括状态码和所要的文件;
l 客户与服务器关闭连接。
(2) uClinux下web服务器的实现
从本质上讲,web服务器是在计算机幕后运行的程序,等待发自web浏览器的各种请求。当接受到请求时,它用被请求的文档或错误消息进行答复。大多数的web服务器都提供后端技术,就象CGI,能够使web服务器和已有的应用程序相连,从而提供交互式活动和信息检索。
uClinux 下,主要有三个web服务器:httpd,thttpd和boa。Httpd[9]是最简单的一个web服务器,功能也最弱,不支持认证、CGI。 thttpd web服务器和boa web服务器都支持认证、CGI等,功能都比较全。本开发板选用适合于嵌入式应用的boa web服务器。boa是一个单任务的http服务器,源代码开放、性能高。它和传统服务器的主要区别是:它是单进程的,在接到新的httpd请求时并不 FORK出一个新的进程来响应,不能对每个到来的连接处理,而且也不能将自己拷贝很多份来处理多连接。它在内部处理所有正在进行的http连接请求,只对单独的CGI程序、自动文件的产生、自动文件的解压等请求FORK出新进程。它的优点是代码简单、速度快、适合于嵌入式应用。对于嵌入式系统来说,实现 web服务器主要是为了使用www浏览器,最终让用户通过局域网或广域网访问和控制嵌入式系统设备。编写不同的HTML页面并结合CGI技术可以完成各种灵活、友好的交互功能。在uClinux下实现boa,本文具体对boa.conf和mime.types文件进行了几项修改:
(1) 由于根文件系统是只读的,不能用mkdir来新建目录,所以在编译内核前建好要用到的目录,在此把web服务器的根目录设在/home/下,将服务器文档根目录设在/home/httpd/目录下,把实现动态web网页功能的CGI程序放在/home/httpd/cgi-bin/ 目录下。这几个目录的建立通过修改开发平台的makefile来实现。在ROMFS_DIRS=bin dev etc home lib mnt proc usr var 增加home/httpd home/httpd/cgi-bin。这样修改后,通过上面的编译内核步骤编译后,根文件系统中就包含这些新建的目录。
(2) 指定web服务器的根目录路径,进入uClinux-dist/user/boa/src/目录下,通过修改define.h文件中 #define SERVER_ROOT/home语句来指定SERVER_ROOT。修改boa.conf文件,在uClinux- dist/user/boa/src/boa.conf里将User nobody,Group nogroup改为User 0,Group 0,Document Root/var/www改为DocumentRoot/home/httpd,定义默认首页和CGI程序所在的目录,即:
DirectoryIndex index.html,ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/miNI.type不需要修改。Boa.conf和mini.types必须放到web服务器根目录下,把修改后的boa.conf和mini.types复制到uClinux-dist/romfs/home下,然后对uClinux- dist/Vendors/Samsung/4510b/inittab修改,在inet:unknow/bin/inetd后加入boa: unknown/bin/boa c/home。这样配置好后,此时web服务器的根目录为/home/httpd,httpd目录下放的是web服务器可以访问的文件,包括html网页,JPG图片等。/home/httpd目录下放置的文件和网站文件类型完全一样,其中index.html为远程浏览客户访问web服务器所看到的默认首页值,通过超级链接可以链接到/romfs/home/httpd目录以及其所有子目录下的所有静态网页。如果要实现动态网页,只能采用CGI,因为目前uClinux还不支持ASP,PHP等技术。CGI即通用网关接口,它是一个WWW服务器主机对外服务的标准接口,一般来说一个CGI接口的功能就是在超文本和服务器主机应用程序间传递信息。目前最为流行的CGI[10]程序语言有四种:C,Shell,Perl和Visual Basic。CGI程序属于一个外部程序,需要编译成为可执行文件,才能在服务端运行,其应用程序流程图如图2所示:
图2 CGI程序流程图
图3 uClinux下内嵌网页
图4 LED演示程序界面
浏览器将用户输入的数据送到web服务器,web服务器将数据使用stdin送给CGI程序,在执行CGI程序后,可能会访问存储数据的一些文档,最后使用stdout输出html形式的结果文件,经过web服务器送回浏览器显示给用户。
本文通过c语言来编写CGI程序,编译成二进制文件放在/cgi-bin/目录下,由于前面配置了boa服务器的CGI目录, ScriptAlias/cgi-bin//home/httpd/cgi-bin/, 所以/cgi-bin/目录下的CGI程序就能被正确执行。配置完成后,重新编译内核,编译时选中boa选项将编译好的内核下载到开发板,启动 uClinux完成IP配置,启动boa web服务器之后就可以通过浏览器浏览网页了,如果想启动uClinux时自动启动boa web服务器,可以修改rc文件,进入uClinux-dist/vendors/Samsung/4510b,在运行脚本中加入boa c/home/&修改后重新编译内核,再下载到开发板运行,运行uClinux后即可访问网页了。下面结合一个例子来说明如何实现uClinux 下的动态网页技术。先用HTML语言编写web内嵌网页(如图3),然后点击内嵌主页上的LED DEMO演示程序超级链接,进入到网页的下一界面(如图4),由ACTION属性来指定要用到用到的CGI程序,即ACTION=/cgi- bin/led.cgi,由METHOD属性来指明所用的提交方法,即METHOD =POST。
选中LED复选框,然后点击SET,就能控制开发板上的发光二级管。说明uClinux下boa服务器已经运行成功。
4 结束语
本文通过硬件方案的实现、软件设计、以及uClinux下web技术的实现,实现了基于S3C44B0与uClinux下的 boa服务器。通过启动开发板上的boa服务器,在PC机上的浏览器键入开发板上的IP地址,就能访问开发板中内嵌的静态网页,通过CGI程序的实现,实现了网页的动态显示,并用一个控灯的例子对boa服务器的运行进行了实验验证。本文所实现的嵌入式web服务器通用性比较强,能够在嵌入式开发平台上高效率地运行,应用前景非常看好。
上一篇:基于FPGA的FIR数字滤波器的优化设计
下一篇:动力电池组测试平台设计