您的位置:首页 > 理论基础 > 计算机网络

VxWorks for LPC2210网络应用编程实战zz

2007-08-30 20:39 537 查看
发信人: gdtyy (gdtyy), 信区: Embedded
标 题: VxWorks for LPC2210网络应用编程实战
发信站: 水木社区 (Mon Jun 25 23:26:20 2007), 站内

***************************************
* VxWorks for LPC2210网络应用编程实战 *
***************************************
------ 《ecos增值包》选配之VxWorks网络应用编程实战
2007/06/06 asdjf@163.com 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)。连接成功会显示成功信息,托盘里出现一个象靶子一样的图标。




其他操作与《VxWorks for LPC2210应用编程实战》里介绍的使用方法相同,不再赘述


超级终端上显示的运行信息。



用IE访问192.168.0.2就可以浏览内置网页,响应速度相当快(0.09秒)。

基于网络RPC的调试shell比基于串口的快多了,输入“i”后,几乎是一下子蹦出任务
状态列表信息。



这是ping测试的结果,通过sniffer抓包分析,ping测试(74字节包)的平均响应时间为
3ms,ARP响应时间为3ms。看来VxWorks真的不赖。


--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.149.56.*]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: