发信人: gdtyy (gdtyy), 信区: Embedded
标 题: VxWorks for LPC2210网络应用编程实战
发信站: 水木社区 (Mon Jun 25 23:26:20 2007), 站内
***************************************
* VxWorks for LPC2210网络应用编程实战 *
***************************************
------ 《ecos增值包》选配之VxWorks网络应用编程实战
2007/06/06 [email protected] www.armecos.com
VxWorks对网络支持得相当好,稳定且高效,内存池的巧妙运用实现了“零内存拷贝”
,netJobAdd函数的使用减少了中断延迟时间,用户只需要实现网络驱动就可以运行完整的
TCP/IP协议栈。通过网络下载和调试程序比串口快很多,我们已经移植好了EasyARM2200和
SmartARM2200上的VxWorks网络驱动BSP,下面通过一个例子demo3.c来讲一下VxWorks for
LPC2210网络应用编程。
这个例子是开发板上网页演示程序在VxWorks上的移植,通过实际测试(在
SmartARM2200上),响应速度非常快(平均为0.09秒),ping测试(74字节包)的平均响应时间
为3ms,ARP响应时间为3ms。源码如下:
#include "sockLib.h"
#include "inetLib.h"
#define STACK_SIZE 2000
void webserver_test(int arg);
unsigned char httpweb[]={
"HTTP/1.0 200 OK/r/n"
"Date: Mon, 24 Nov 2003 01:24:17 GMT/r/n"
"Server: microHttp/1.0 Zlgmcu Corporation/r/n"
"Accept-Ranges: bytes/r/n"
"Connection: Keep-Close/r/n"
"Content-Type: text/html/r/n"
"/r/n"
};
unsigned char web[]={
"<HTML>/r/n"
"<HEAD>/r/n"
"<TITLE>ARM_NET演示网页(周立功单片机)</TITLE>/r/n"
"<BODY aLink=green background=/100.bmp bgColor=#f1f1dd link=red/r/n"
"vLink=#321afd>/r/n"
"<H1>HELLO WELCOME TO EasyArm WEBSERVER</H1>/r/n"
"<UL>/r/n"
"<LI> <A HREF=/"http://www.zlgmcu.com//">周立功单片机网站 </A>/r/n"
"<LI> <A HREF=/"http://www.zlg.cn//">周立功单片机内部BBS </A>/r/n"
"<LI> <A HREF=/"http://www.zlgmcu.cn//">周立功单片机 </A>/r/n"
"</UL>/r/n"
"</BODY>/r/n"
"</HTML>/r/n"
};
unsigned char httpgif[]={
"HTTP/1.0 200 OK/r/n"
"Date: Mon, 24 Nov 2003 01:24:17 GMT/r/n"
"Server: microHttp/1.0 Zlgmcu Corporation/r/n"
"Accept-Ranges: bytes/r/n"
"Connection: Keep-Close/r/n"
"Content-Type: image/bmp/r/n"
"/r/n"
};
unsigned char bmp[442]={
0x42,0x4d,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x28,0x00,
0x00,0x00,0x1a,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,
0x00,0x00,0x40,0x01,0x00,0x00,0xc4,0x0e,0x00,0x00,0xc4,0x0e,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,
0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x80,
0x00,0x00,0xc0,0xc0,0xc0,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0xff,0x00,0x00,0xff,
0x00,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf6,0x66,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0x66,0x66,0x6f,0x6f,0xff,0x66,0x66,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xf6,0xff,0xff,0x6f,0xf6,0xff,0xf6,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x6f,0xff,0x6f,0xf6,0xff,0xf6,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xf6,0xff,0xf6,0xf6,0xff,0xff,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x6f,0xf6,0xff,0x6f,0xff,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xf6,0x66,0x66,0xf6,0xff,0xf6,0x66,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00
};
void demo3(void)
{
printf("Demo3 Start....../n");
taskSpawn("webserver_test", 90, 0, STACK_SIZE, webserver_test, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0);
}
void
webserver_test(int arg)
{
struct sockaddr_in host,client;
int s,sa,e_source,len, sockAddrSize;
unsigned char buf[400];
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0) {
return;
}
/* Set up host address */
sockAddrSize = sizeof(struct sockaddr_in);
host.sin_family = AF_INET;
host.sin_len = sizeof(host);
host.sin_addr.s_addr = INADDR_ANY;
host.sin_port = ntohs(80);
if(bind(s, (struct sockaddr *) &host, sizeof(host)) < 0) {
return;
}
listen(s, SOMAXCONN);
while(1){
memset(buf, 0, sizeof(buf));
if ((sa = accept(s, (struct sockaddr *)&client, &sockAddrSize)) < 0) {
printf("Accept ERROR!/n");
continue;
}
printf("SERVER : HTTP request arrived from %s:%d/n",
inet_ntoa(client.sin_addr),ntohs(client.sin_port));
len = read(sa, buf, sizeof(buf));
if(buf[5] == ' '){
len = write(sa, httpweb, sizeof(httpweb)-1);
len = write(sa, web, sizeof(web));
}
else if(buf[5] == '1'){
len = write(sa, httpgif, sizeof(httpgif)-1);
len = write(sa, bmp,sizeof(bmp));
}
close(sa);
}
}
下面图示说明使用方法:
和前面《VxWorks for LPC2210应用编程实战》里介绍的使用方法类似,唯一不同点是
Target Server要设置成wdbrpc。
下面只介绍不同部分的设置。
设置Target Server,使用网络RPC通信,目标机IP地址为192.168.0.2,超时和重试次
数根据需要设置,调试时如果网络速度比较慢的话(因为加入了调试信息),使用缺省值可能
导致连接失败,正常工作时网络速度很快,不存在此问题。注意:Core File and Symbols
里的File文件要与烧写在flash里的VxWorks一致,即带调试信息的ELF文件
(vxWorks_romResident)。连接成功会显示成功信息,托盘里出现一个象靶子一样的图标。
[img]http://www.armecos.com/pic21ic/y1.gif[/img]
[img]http://www.armecos.com/pic21ic/y2.gif[/img]
其他操作与《VxWorks for LPC2210应用编程实战》里介绍的使用方法相同,不再赘述
。
超级终端上显示的运行信息。
[img]http://www.armecos.com/pic21ic/y3.gif[/img]
用IE访问192.168.0.2就可以浏览内置网页,响应速度相当快(0.09秒)。
基于网络RPC的调试shell比基于串口的快多了,输入“i”后,几乎是一下子蹦出任务
状态列表信息。
[img]http://www.armecos.com/pic21ic/y5.gif[/img]
这是ping测试的结果,通过sniffer抓包分析,ping测试(74字节包)的平均响应时间为
3ms,ARP响应时间为3ms。看来VxWorks真的不赖。
[img]http://www.armecos.com/pic21ic/y6.gif[/img]
--
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.149.56.*]