LwIP协议栈在uCOS II下的实现

时间:2011-05-12来源:网络


6、应用实例的建立和测试
做完上面的移植修改工作以后,就可以在uCOS II中初始化LwIP,并创建TCP或UDP任务进行测试了。这部份完全是C语言的实现,因此这部份在ez80和ARM7上基本都是一样的。值得注意的是LwIP的初始化必须在uCOS II完全启动之后也就是在任务中进行,因为它的初始化用到了信号量等OS相关的操作。关键部份的代码和说明如下:
void start_kernel(void)
{
int LineNo10 = 0;
int LineNo11 = 1;
int LineNo12 = 2;
int LineNo13 = 3;
int LineNo14 = 4;

OSInit();
OSTaskCreate(lwip_init_task, LineNo10, lwip_init_stk[TASK_STK_SIZE-1], 0);
OSTaskCreate(usr_task,LineNo14,usr_stk[TASK_STK_SIZE-1],20);
vRTCStart();
OSStart();
/* NEVER EXECUTED */
while(1);
}
主程序中创建了lwip_init_task初始化LwIP任务(优先级0)和usr_task用户任务(优先级20)。lwip_init_task任务中除了初始化硬件时钟和LwIP之外,还创建了tcpip_thread(优先级5)和tcpecho_thread(优先级6)。实际上tcpip_thread才是LwIP的主线程,多线程的Berkley API也是基于这个线程实现的,即上面的tcpecho_thread线程也要依靠tcpip_thread线程来与外界通信,这样做的好处是编程简单,结构清晰。
实用Berkley API实现的tcpecho_thread是一个TCP echo服务器,监听7号端口,程序框架如下:
void tcpecho_thread(void *arg){
conn = netconn_new(NETCONN_TCP); //创建新的连接标识
netconn_bind(conn, NULL, 7); //绑定到7号端口
netconn_listen(conn); //开始监听端口
while(1){
newconn = netconn_accept(conn); //接收外部到来的连接
buf = netconn_recv(newconn) //获取数据
……. //处理数据
netconn_write(newconn, data, len, NETCONN_COPY); //发送数据
netconn_delete(newconn); //释放本次连接
}
}
编译运行后,用ping ip地址命令可以得到ICMP reply响应。用telnet ip地址 7(登录7号端口)命令可以看到echo server的回显效果。说明ARP、ICMP、IP、TCP协议都已正确运行。

1 2

关键词: 实现 II uCOS 协议 LwIP

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版