微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 一种uIP TCP/IP协议栈在51系列单片机上的实现

一种uIP TCP/IP协议栈在51系列单片机上的实现

时间:08-04 来源:互联网 点击:

以太网上。eth_rcve()函数将接收到的数据存储到uip_buf指定的缓冲区中,同时修改uip_len的值。

uIP提供的源代码中包括一个基于HTTP协议的WEB SERVER示例,该WEB SERVER通过简单的文件系统在数据存储器中存储静态页面,同时具有CGI功能。用户可以参照该示例以及uIP提供给应用程序的接口函数说明实现自己的应用层功能。用户的应用程序中必须将 UIP_APPCALL宏定义为该层的服务程序。例如:在示例程序中WEB SERVER的处理程序为httpd()函数,则要进行如下的宏定义#define UIP_APPCALL httpd.

51系列单片机上都有2到3个定时计数器,可以选择其中的一个来为TCP/IP协议中与时间有关的事件定时。需要由用户处理的定时事件包括:为uip_periodic()函数的执行提供基准,还要为ARP表项的更新定时。uip_periodic()函数每0.5秒执行一次,ARP表项每10秒更新一次。

uIP的设置单独包含在一个叫uipopt.h的头文件里,都是以宏的形式定义方便于修改。用户应根据自己的应用在uipopt.h文件里设置本地的物理地址、IP地址、网关地址、收发缓冲区的大小、支持的最大连接数、ARP表大小等等选项。

添加了必须的模块,对uIP进行了正确地配置后,需要编写主程序函数。针对基于以太网的WEB SERVER应用,主程序在完成初始化后将不停的进行查询,如果有新数据包到达则送uip_input()函数处理;如果没有新数据包到达则处理定时事件。框架代码如下所示:

通过实际的代码说明uIP协议栈的主控制循环。

void main(void)

{

/*省略部分代码*/

/*设置TCP超时处理时间和ARP老化时间*/

timer_set(periodic_timer, CLOCK_CONF_SECOND / 2);

timer_set(arp_timer, CLOCK_CONF_SECOND * 10);

/*定时器初始化*/

init_Timer();

/*协议栈初始化*/

uip_init();

uip_arp_init();

/*应用层初始化*/

example1_init();

/*驱动层初始化*/

etherdev_init();

/*IP地址、网关、掩码设置*/

uip_ipaddr(ipaddr, 192,168,1,9);

uip_sethostaddr(ipaddr);

uip_ipaddr(ipaddr, 192,168,1,16);

uip_setdraddr(ipaddr);

uip_ipaddr(ipaddr, 255,255,255,0);

uip_setnetmask(ipaddr);

/*主循环*/

while(1)

{

/*从网卡读数据*/

uip_len = etherdev_read();

/*假如存在数据则按协议处理*/

if(uip_len > 0)

{

/*收到的是IP数据,调用uip_input()处理*/

if(BUF->type == htons(UIP_ETHTYPE_IP))

{

uip_arp_ipin();

uip_input();

/*处理完成后,假如uip_buf中有数据,则调用etherdev_send 发送出往*/

if(uip_len > 0)

{

uip_arp_out();

etherdev_send();

}

}

/*收到的是ARP数据,调用uip_arp_arpin()处理*/

else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {

uip_arp_arpin();

if(uip_len > 0)

{

etherdev_send();

}

}

}

/*查看0.5S是否到了,到了则调用uip_periodic处理TCP超时程序*/

else if(timer_expired(periodic_timer))

{

timer_reset(periodic_timer);

for(i = 0; i UIP_CONNS; i++)

{

uip_periodic(i);

if(uip_len > 0)

{

uip_arp_out();

etherdev_send();

}

}

/*查看10S是否到了,到了则调用ARP处理程序*/

if(timer_expired(arp_timer))

{

timer_reset(arp_timer);

uip_arp_timer();

}

}

}

return;

}

以上实例在keil C51编译器下设置大模式,优化等级6(速度优先)进行编译,对uIP代码部分可以不做任何修改,对HTTP示例代码仅需针对类型表达进行极少量的修改即可编译通过。在硬件平台上运行良好。

五 总结

uIP协议栈采用有效的方法和结构化的代码,使其存储器占用量很小并且可以很方便的应用到不同的工程项目中。同时它又是免费的可以自由使用于商业和非商业目的。uIP为低端嵌入式设备的网络接入提供了很好的解决方案,具有很高的应用价值。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top