免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1832 | 回复: 1
打印 上一主题 下一主题

uIP在S3C44B0上的移植 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-01 17:39 |只看该作者 |倒序浏览

                                                        uIP在S3C44B0上的移植,无操作系统
首先必须说明的是,uIP的官方网址上,有很好的移植文档,大家应该以该文档为准。
作者的单位是Swedish Institute of Computer Science。
官方网址:http://www.sics.se/~adam/uip/
我使用的版本是1.0。
uIP是一个超轻量的TCP/IP协议栈,可以用于8位处理器和无操作系统环境。
uIP是瑞典大虾Adam Dunkels的作品。lwip也是这位大虾开发的,但是现在由另一个团队在维护。
版权:以我的poor的英文的理解,可以将uIP的源代码和二进制文件用于商业或其他用途。可以对源代码进行修改。
     如果以源代码方式使用uIP,应该在源代码中保留uIP的版权说明。
     如果以二进制方式使用uIP,应该在你的文档中包含uIP的版权说明。
也就是说,我们可以合法而且自地使用它,除非你把它说成是自己的作品。
由于移植很顺利,我没有仔细读源代码,这里简单说明一下自己对uIP的理解。
支持IP、ARP、TCP、UDP和ICMP(PING only)。
同时支持多个网络应用。
为了减少内存使用,在软件结构上没有按照协议分层,紧耦合。
我在ARM下编译,uIP的代码大小是10K字节左右,RAM使用2K字节多一点。应该还可以优化。
uIP仅使用一个数据缓冲(uip_buf),发送和接收都使用该缓冲区。因此:
     TCP的重传功能,要借助应用层来实现。因为协议栈没有缓冲已发送的TCP分段。
基于异步事件的API。或者说应用应该怎样使协议栈运行起来:
     协议栈初始化:包括设置IP地址、子网MASK,MAC地址。
     应用在通过以太网驱动接收到以太网帧时,应调用uip_input(),对接收到的数据进行协议处理。
          调用uip_input()前,应该将收到的以太网数据放在uip_buf中,并给uip_len变量赋值。
     应用应该构造一个定时器,定时调用uip_periodic(),以帮助实现协议栈中需要定时处理的事务。
          我选择的定时周期是20ms。
     应用应提供一个处理协议栈事件的回调函数(CALLBACK),该回调函数也就是实现了网络应用(例如telnet)。
          定义:#define UIP_APPCALL     netApp_appcall //netApp_appcall就是我的协议栈事件处理函数。
          在该函数中:
               查询当前连接的端口,以判断对应哪一个网络应用。
               通过调用uip_connected()等函数,判断返回值,以判断当前存在哪些事件并处理。
                      例如(uip_connected() == 1)表示连接建立。
                      例如(uip_newdata() == 1)表示收到新的应用数据,你应该在这里处理这些数据。
                      例如(uip_rexmit() == 1)表示应用应重传上一个TCP分段。
      总的来说,这个API还是比较容易使用的。官方文档中提供了较详尽的API的说明和使用例子代码。
上面这个API与标准的socket接口很不一样。因为socket接口基于stop wait机制,需要multi task支持。
      而uIP是面向无操作系统环境的。
      uIP还提供了一个类似socket的接口Protosockets,那个接口需要一个protothread机制来实现。
      所谓protothread很古怪,反正我是不会用的。
一个基本的uIP源代码集合:
uip.c   uip.h
uip_arp.c  uip_arp.h
uip_arch.h uip-conf.h uipopt.h
我在移植时,仅修改了uip-conf.h和uipopt.h。
     uip-conf.h:
          把“#define UIP_CONF_BYTE_ORDER  LITTLE_ENDIAN”变成“#define    UIP_CONF_BYTE_ORDER UIP_LITTLE_ENDIAN”。可能是个BUG。
         配置你想打开或关闭的特性,例如是否支持UDP。
         增加一个“#define UIP_CONF_IPV6 0”,以关闭ARM编译时的那么多警告。
         增加“#include "netapp.h"”。这是你的网络应用的头文件,该头文件应该定义:
               #define UIP_APPCALL
               #define uip_tcp_appstate_t和#define uip_udp_appstate_t
               #define UIP_APPSTATE_SIZE
     uipopt.h:
          对协议栈的一些高级配置,可以不修改直接使用。
我的板子是立宇泰的44b0开发板,上面有一个RTL8019AS。
8019AS的驱动程序用的是广东一位大虾的。
移植驱动时,要注意与硬件相关的两个问题:
     使用GCS4,因此8019的基地址是0X8000000。
     地址线用的是A8到A12,因此在访问8019时寄存器地址应<<8。
     使用哪一个外中断脚作为8019的中断。
需要给8019AS驱动和uIP协议栈提供相同的MAC地址。
推荐的调试过程:
     8019AS的寄存器中包含两个chip ID,是0x50和0x70。ID读出正确,说明8019AS的读写没有问题。
     接收ARP包:
          用计算机PING你的单板时,驱动程序应发生中断,收到ARP包。
          ARP包的目的MAC地址是6个FF。
          收到ARP请求包,进一步证明你的驱动程序是正确的。
          将ARP请求包交给协议栈,协议栈应生成ARP响应包,通过驱动发送出去。
          在计算机的命令行执行arp -a,应看到你的单板的IP地址与MAC地址。
     接收IP包:
          用计算机PING你的单板时,应收到封装在IP包中的ICMP包(ECHO)。
            协议栈响应ECHO_REPLY类型的ICMP包,在计算机上就可以看到PING通了。
     TCP:
          找一个计算机上测试TCP的小程序,单板上做一个简单的TCP应用,测试连接的建立断开和接收发送。
结束语:
uIP很简单,能用在51单片机。我移植到ARM上有些小材大用。不过我只需要简单的网络应用,并且主要目的是学习。
我从开始下载uIP,到移植8019驱动,到TCP测试成功,用了整一个星期。在调试驱动时遇到一点小问题。
原来对TCP/IP协议栈只是泛泛的了解。
uIP的文档一定要通读。这么认真地写文档值得称许。
感谢广东千喜科技的大虾,我已经从你那里参考了无数有价值的东东。
感谢Adam Dunkels。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/16651/showart_351908.html

论坛徽章:
0
2 [报告]
发表于 2013-11-25 17:42 |只看该作者
UIP连接一段时间后断开,就再也连不上了???
开发环境: 44b0 逻辑情况下跑UIP协议栈编译器:ADS1.2 网卡芯片:rtl8019as 问题描述:在44b0裸机情况下运行UIP的server程序?用xP作为客户端,通过网络调试助手,循环给开发板发送ping数据包。大概40分钟左右,可以进行有效通信---pC可以ping的通开发板,同时可以收发TCP数据包,但是40分钟之后就无法进行有效通信了,重启一次开发板就又可以再一次进行通信?我用定时器0,5ms的一个定时模块,10s进行一次ARP老化处理,50ms进行一次TCP超时处理。请高手指点一二?多谢了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP