Chinaunix首页 | 论坛 | 博客
  • 博客访问: 716435
  • 博文数量: 140
  • 博客积分: 8196
  • 博客等级: 中将
  • 技术积分: 1350
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-16 19:53
文章分类

全部博文(140)

文章存档

2011年(2)

2010年(2)

2009年(2)

2008年(20)

2007年(52)

2006年(62)

分类: 系统运维

2006-09-14 21:47:31

前几天鼓捣了一个统计网络流量的软件,叫Bandwidthd。用起来之后发现这个软件很好,界面比较友好。就想把这个东西弄到开发板上玩玩,如果移植成功的话,那开发板不就变成一个网络流量统计器了么。不过这个软件的分析报告是通过Web方式给出的。那么就必须得在运行Bandwidthd的机器上开一个Web服务器,在普通的环境下可以使用httpd,但是在板子上就不好用了,太庞大。于是我就找了一个小型的嵌入式Web Server,也就是今天这篇文章的主角——appWeb
 
appWeb有两种许可,一种是GPL,免费的,另外一种是商业许可,有30天的试用期。免费的版本在 下载,appWeb的商业版本由Mbedthis公司发布和维护,网址是  
 
一般情况下使用免费的版本就可以了,appWeb的性能非常的优秀,其特点可以到网站上查阅,这里不多说。下面切入正题,如何移植appWeb到ARM开发板。
 
appWeb的源码包中有个很关键的工具,就是configure。如果configure配置好了,那么无需手动修改Makefile就可以正确的交叉编译出ARM格式的可执行文件。在configure之前需要设置几个关键的环境变量,这些环境变量的值将被configure程序读取然后应用到编译里去,变量如下:
 
CC,AR,LD,RANLIB,STRIP    //此5个须设置成交叉编译工具的所在位置
CC_FOR_BUILD             //这个设置成主机上的gcc
 
我用的是handhelds.org的toolchain,因此进行如下设置:
#export CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
#export AR=/usr/local/arm/3.4.1/bin/arm-linux-ar
#export LD=/usr/local/arm/3.4.1/bin/arm-linux-ld
#export RANLIB=/usr/local/arm/3.4.1/bin/arm-linux-ranlib
#export STRIP=/usr/local/arm/3.4.1/bin/arm-linux-strip
#export CC_FOR_BUILD=gcc
 
设置好后进行configure。configure提供了很多的参数,具体的可以参考appWeb网站上的安装说明,地址是  
 
下面给出我的configure参数:
#./configure --host=arm-s3c2410-linux --build=i686-pc-linux \
--disable-shared --disable-shared-libc --enable-static \
--port=80 --disable-multi-thread --type=RELEASE \
--prefix=/usr/appWeb --webDir=/var/web \
--disable-test --disable-samples
 
这里的参数在appWeb的网站上都有说明。需要指出的是,--host参数设定目标板的类型,这里用的是arm-s3c2410-linux,就是说在ARM平台上的Linux系统。而--build才是说明宿主机的平台,这里是i686-pc-linux,就是说在一台装有Linux的PC上进行交叉编译。我把appWeb编译成了一个静态的版本,这样会省去很多加载动态库的麻烦。--disable-test --disable-samples两个参数是说编译的时候取消测试和例子,不知为什么,在我的环境中如果不取消这两个东西,编译这两个东西的时候会产生错误。
 
然后就make吧
#make
 
成功之后make install
#make install
 
程序会被安装到3个位置,一个是可执行程序的位置,一个是--prefix指定的程序主目录,我这里是/usr/sbin和/usr/appWeb,还有一个就是放html的WebDir了。在/usr/sbin中的是编译出的正常版本,appWeb。但是这个不是我需要的全静态版本,于是到/appWeb源代码目录/bin下找到一个叫做appWebStatic的程序,把它cp出来。
 
接下来就是建立一个nfs的共享目录了,就起名叫/share吧。关于NFS的配置和使用不是本文的内容,所以不多说。然后把/usr/appWeb里的所有东西都cp到share下,把appWebStatic也cp过来,最后在share中建立一个web目录,这是appWeb读取html的默认位置,在web中随便写个test.html做测试用。
 
测试appWeb。还是老一套,把开发板用网线连上hub,直接连主机也行。接上串口,在Linux下开minicom连开发板,连上之后在开发板的shell下mount主机的nfs目录。
#mount -t nfs 主机IP:/share /tmp/nfs
#cd /tmp/nfs
#./appWebStatic
 
如果一切正常的话web server就起来了,然后在主机上用elinks或者别的什么浏览器来浏览一下网页,
#elinks 开发板IP/test.html
 
应该可以看见网页了,到此所有主要步骤完成。
 
接下来就是修改cramfs,把appWebStatic加到文件系统中,然后把cramfs烧到板子上就Ok了。这些步骤也不赘述了。
 
结语:
1)appWeb天生是给嵌入式设备用的,支持ARM平台,所以移植起来很方便,只要正确的进行configure基本就行了
2)appWeb源码目录下有两个文件,config.h和config.make。这两个文件其实就是configure的结果,Makefile就是用他们来编译程序的。如果感觉使用configure不方便,直接手动修改也行,虽然官方不推荐这样做
2)移植appWeb的目的是为了用Bandwidthd,但是Bandwidthd比较难移植,这个目前正在尝试中。
3)开发板上必须要有功能比较完整的Linux系统,这样方便测试,比如使用U盘或者NFS来测试应用程序。
5)还是那句话,嵌入式不是一开始就非做底层不可,做做应用,移植移植程序在板子上跑跑即好玩,还能很好的入门。
 
阅读(7071) | 评论(12) | 转发(1) |
给主人留下些什么吧!~~

InfoHunter2008-12-20 22:17:20

1)用cross compiler编译 2)在arm的板子上运行

chinaunix网友2008-11-16 20:59:52

我按照你的方法做,可是到#./appWebStatic这步的时候提示说:“cannot execute the binary file”是什么问题呢,谢谢

InfoHunter2008-04-22 10:36:19

g++的-mno-sched-prolog选项无效,似乎你编译器的版本不对??

guyong2192008-04-20 09:33:14

InfoHunter大侠: 我怎么编译到一个地方过不去了 帮我看下这个是什么原因 make -C ./mpr compile make -C ./mpr/UNIX compile /usr/bin/g++ -c -g -D_DEBUG -Wall -DLINUX -D_REENTRANT -DARM -mcpu=arm7tdmi \ -mno-sched-prolog -fno-exceptions -fno-rtti -fPIC -DPIC -I../.. \ -I../../include daemon.cpp -o ../../obj/arm-atmel-linux/daemon.lo cc1plus: invalid option `no-sched-prolog' /usr/bin/g++ -c -g -D_DEBUG -Wall -DLINUX -D_REENTRANT -DARM -mcpu=arm7tdmi \ -mno-sched-prolog -fno-exceptions -fno-r