在完成了一些驱动的编写和移植后,将开展一些基础应用的研究和实验,在eCos STM32平台上给大家展示一些应用实例,让初步接触eCos的朋友对eCos应用有个基本了解。
第一个基础应用就是嵌入式web服务器的移植和使用。eCos自身带有2个嵌入式web服务器——ATHTTP server和HTTP server,2者都是轻量级嵌入式web服务器(后者更加简单)。由于这2个server在eCos中需依赖BSD TCP/IP或open tcp/ip协议栈,暂不支持LWIP协议栈,所以先介绍goAhead移植到eCos的应用。
goAhead简介
曾经移植goAhead到嵌入式linux中,上面有一些关于goAhead的介绍,请参考链接下的文章进行了解:http://velep.com/archives/category/web/goahead
现在goAhead被Oracle收购后,交给embed this公司的团队维护。根据该公司网站上的介绍,goAhead是该公司CEO,Michael O’Brien,实现的一个嵌入式web服务器。目前最新版本是3.1.1.0版本。相关链接:http://www.embedthis.com/products/goahead/index.html
goAhead LICENSE
goAhead是一个开放源码、允许自由传播、修改的嵌入式web服务器,但如果要想免费使用在商用产品上,请遵循它的Open Source License。
goAhead移植
goAhead非常容易移植,支持Windows CE、ECOS、linux、LYNX、MACOS、NW、QNX4、Vxworks等。不过,目前新版本的移植性尚待验证。本次移植的时候,开始基于最新版本goAhead3.1来移植的。虽然代码规范了很多,但移植到eCos上,发现要编译通过非常困难,可能是水平有限的问题吧。
所以后面还是转到goAhead 2.5版本来移植。理由很简单,它有提供ECOS的模板。
另外,需要注意的是,本次移植goAhead到eCos中,是基于lwip协议栈的。之所以提出这个,是因为lwip协议栈提供的一些接口和头文件与BSD tcpip或者open tcpip略有不同,仅管lwip有提供linux兼容的socket API接口。
goAhead 2.5源码下载
本次移植的goAhead,是基于原先我成功移植到嵌入式linux上goAhead 2.5源码包,该源码包打了文件上传补丁。下载地址:http://velep.com/archives/139.html
注意:该源码包中,带有移植到linux下的编译过程文件.o和.d文件,所以第一次编译前必须make clean下。否则编译会出现下面的问题:
实际就是一个问题,打红色部分:
/opt/ecos/gnutools/arm-eabi/lib/gcc/arm-eabi/4.6.3/../../../../arm-eabi/bin/ld: error: Source object libwebs.a(asp.o) has EABI version 0, but target webs has EABI version 5
make clean下就可以解决。
goAhead移植思路
goAhead具有很好的移植性。解压源码包后,可以看到goAhead源码组织结构,如下:
|
|\______各种OS移植子目录(如:ecos子目录)
|\______Web自目录(用来保存自己设计的网页)
|\______GoAhead服务器源码(C程序)
\______webcomp.c网页编译器
由于eCos是和用户应用程序编译链接在一起形成最终可执行映像文件,所以我们设计的网页文件(ASP、html等)在编译阶段就会被解析并和服务器源码编译到了一起。如果是在嵌入式linux中,网页文件可以不与web服务器程序链接在一起,你只要把它们放到指定的目录下即可。
goAhead根目录下的webcomp.c网页编译器(ECOS目录下也有,使用哪个取决于你的makefile)负责把所有web网页进行转换,使其能够与goAheadWeb服务器源码以及eCos其他应用代码一起编译。
在goAhead 2.5版本中,所有web网页内容本应该放在www目录下,但对于eCos有点特殊,其makefile使用的却是web目录。需要注意的是,goAhead 2.5版本本身没有web这个目录的,移植时需要创建或者修改makefile,让它去转换www目录下的网页文件。这个后续会详细讲解,这里知道有这么回事就可以了。
goAhead的ECOS目录包含了与eCos的接口,包括main.c文件和makefile文件。用户根据实际需要可以对main.c和makefile文件进行修改。
通过阅读ECOS目录下的makefile文件可知,goAheadWeb服务器编译过程主要有三个步骤:
1、编译webcomp.c文件,生成网页编译器webcomp.exe。webcomp.c使用本地编译器gcc进行编译,编译后的网页编译器位于ECOS目录下。网页编译器将web子目录下的所有网页进行转换并生成webcomp.c文件。webcomp.c文件将存放于ECOS子目录下。
2、交叉编译器对goAhead根目录下的Web服务器源码和网页文件webcomp.c进行编译,生成库文件libwebs.a。
3、eCos应用程序在编译时与库文件libwebs.a进行链接,生成可运行于目标平台的可执行文件。
整个移植思路如下:
1. 先看下ECOS目录下的makefile文件,根据需要进行修改;
2. 进入ECOS目录,执行编译,先期目标是能够编译成功;
3. 编译成功后,进入调试测试阶段,看能否正常访问一个简单的网页(一般是默认的首页),如果不能,则需要进行调试工作了。
下面我将按照上面描述的移植思路详细介绍goAhead移植到eCos的过程。限于篇幅,其中,第2步将放到下一章节,第3步将放到下下一章节。
makefile的修改
根据goAhead ECOS目录下的makefile设计,依照它的模板,在DEBUG := -g -Wall -O2下面加入下面的内容。同时,要屏蔽下面# For Cirrus Logic EDB72xx board和# For Motorola PowerPC MBX/860的内容。
export ECOS_REPOSITORY
PKG_INSTALL_DIR := /mnt/hgfs/stm32_ecos/build/obj/ecos/install
COMMAND_PREFIX := /opt/ecos/gnutools/arm-eabi/bin/arm-eabi-
#CFLAGS := -mcpu=arm7tdmi $(DEBUG)
CFLAGS := -mcpu=cortex-m3 -mthumb $(DEBUG)
其中,
- ECOS_REPOSITORY,指定eCos源码包仓库路径,如果设定了该环境变量,可以不需要前面两句;
- PKG_INSTALL_DIR,指定编译eCos后install目录;
- COMMAND_PREFIX,指定编译器前缀;
- CFLAGS,编译标志;
这里重点说下CFLAGS的-mcpu=cortex-m3 -mthumb。-mcpu用于指定CPU的处理架构体系,它必须指定值,否则编译不通过,这个从makefile提供的模板就可以知道。我使用的STM32,所以-mcpu的值是cortex-m3。我们知道,cortex-m3使用thumb指令,所以-mthumb也是必须的。
我开始移植的时候,并不知道-mcpu是什么,按照goAhead makefile提供的模板(参考其中的# For Cirrus Logic EDB72xx board),设置:CFLAGS := -mcpu=arm7tdmi $(DEBUG),但这样编译会出错。如下图所示:
Error: selected processor does not support ARM mode `rev16 ip,ip’
这个问题查了好久。后面根据错误提示才怀疑到CFLAGS 值的问题。因为我想到自己的CPU是STM32,属于cortex-m3架构,并非ARM7TDMI。但如果是CFLAGS := -mcpu=cortex-m3 $(DEBUG),编译还是有问题。后面看到eCos图形配置界面的编译标志中,-mcpu=cortex-m3后面还带有-mthumb,加上去试了下,果然编译通过。忽然记起,cortex-m3处理器使用的是thumb指令。
重要提示:
每次编译错误,修改相关文件后再编译最好make clean下再make,避免停留在不必要的编译错误中。