原创 uIP TCP/IP协议栈移植之记录

2010-11-5 09:15 7276 8 15 分类: MCU/ 嵌入式

好久不写东西了,有点虚度的。。。


uIP TCP/IP协议栈移植之记录一


打算把uIP移植到深蓝嵌入式网络开发板上去。


uIP能做的不少: web server, web client, smtp...


一步一步来,做点记录吧。


主CPU采用STM32F107RC(深蓝开发板上的一样)。


uIP TCP/IP协议栈为瑞典计算机Adam Dunkels( experimental computer scientis)所写,大名鼎鼎的轻量级的LwIP也为其所创。Adam Dunkels的大作及其多。不了解的去他的主页看看其人其作吧:http://www.sics.se/~adam/


互联网的核心基于TCP/IP协议栈,人们能用上互联网均离不开TCP/IP协议。uIP比LwIP更为精小,其是为了8位/16位CPU系统设计而生的。。。


本次移植uIP的1.0版本(目前为止,应该是最新版本吧),OK,不想说那么多废话吧,让uIP跑起来吧! HULA!


首先获uIP1.0源码包,可以到这个瑞典科学院的官方主页上获取,


 地址:>>http://www.sics.se/~adam/uip/


移植超级简单,跑起来觉不会超过5分钟。当然因人而以吧,反正我初次移植的时候心里也没底,弄弄着,就可以跑起来了。uIP1.0源码不多,作者已经做得很精简了。


本次移植采用STM32,如何建立一个107的工程就免了吧。 这次也不关注107的以太网驱动。这个官方都有。采用官方的驱动即可,当然你觉得不够隐,自己花时间就摸索吧。


uIP1.0源码包文件:


0f136f90-da2e-4758-9a1c-05890c803f42.jpg


在移植之前如果,对TCP/IP没有一点概念性的了解,这下可有文字要看了,文件包里有相关的pdf,txt文档资料,了解一些事必须的吧,这样才能事半功倍。 外国人的东西,当然要懂外国的文字了,其实也就是千把页的英文文档而已, 是的,千把页的文档, 当然省事的不会全部看完,关键看看自己的阅读理解能力了。


本次工程采用IAR,建立工程之后,相继添加:


clock-arch.c , timer.c , uip.c , uip_arp.c 等文件。


驱动好之后,主要是也只是uip_arch.c这个文件了,也就主要是以下几个函数:


uip_tcpchksum() ’uip_udpchksum()‘ uip_ipchksum(),uip_add32()了


顾名思义,从名字可以猜出什么内容吧。因为这此时移植到32位CPU上的,所以uip_add32这个函数也得加进去。如果未了更加有效率,可以用汇编了,一些内容如下:
#include "uip.h"
#include "uip_arch.h"


#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
#define IP_PROTO_TCP    6


/*-----------------------------------------------------------------------------------*/
void uip_add32(u8_t *op32, u16_t op16)
{


  uip_acc32[3] = op32[3] + (op16 & 0xff);
  uip_acc32[2] = op32[2] + (op16 >> 8);
  uip_acc32[1] = op32[1];
  uip_acc32[0] = op32[0];


  if(uip_acc32[2] < (op16 >> 8)) {
    ++uip_acc32[1];
    if(uip_acc32[1] == 0) {
      ++uip_acc32[0];
    }
  }



  if(uip_acc32[3] < (op16 & 0xff)) {
    ++uip_acc32[2];
    if(uip_acc32[2] == 0) {
      ++uip_acc32[1];
      if(uip_acc32[1] == 0) {
 ++uip_acc32[0];
      }
    }
  }
}
/*-----------------------------------------------------------------------------------*/
u16_t uip_chksum(u16_t *sdata, u16_t len)
{
  u16_t acc;


  for (acc = 0; len > 1; len -= 2) {
    u16_t u = ((unsigned char *)sdata)[0] + (((unsigned char *)sdata)[1] << 8);
    if ((acc += u) < u) {
      /* Overflow, so we add the carry to acc (i.e., increase by
         one). */
      ++acc;
    }
    ++sdata;
  }


  /* add up any odd byte */
  if(len == 1) {
    acc += htons(((u16_t)(*(u8_t *)sdata)) << 8);
    if(acc < htons(((u16_t)(*(u8_t *)sdata)) << 8)) {
      ++acc;
    }
  }


  return acc;
}
/*-----------------------------------------------------------------------------------*/
u16_t uip_ipchksum(void)
{
  return uip_chksum((u16_t *)&uip_buf[UIP_LLH_LEN], 20);
}
/*-----------------------------------------------------------------------------------*/
u16_t uip_tcpchksum(void)
{
  u16_t hsum, sum;



  /* Compute the checksum of the TCP header. */
  hsum = uip_chksum((u16_t *)&uip_buf[20 + UIP_LLH_LEN], 20);


  /* Compute the checksum of the data in the TCP packet and add it to
     the TCP header checksum. */
  sum = uip_chksum((u16_t *)uip_appdata,
     (u16_t)(((((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - 40)));


  if((sum += hsum) < hsum) {
    ++sum;
  }


  if((sum += BUF->srcipaddr[0]) < BUF->srcipaddr[0]) {
    ++sum;
  }
  if((sum += BUF->srcipaddr[1]) < BUF->srcipaddr[1]) {
    ++sum;
  }
  if((sum += BUF->destipaddr[0]) < BUF->destipaddr[0]) {
    ++sum;
  }
  if((sum += BUF->destipaddr[1]) < BUF->destipaddr[1]) {
    ++sum;
  }


  if((sum += (u16_t)htons((u16_t)IP_PROTO_TCP)) < (u16_t)htons((u16_t)IP_PROTO_TCP)) {
    ++sum;
  }


  hsum = (u16_t)htons((((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - 20);


  if((sum += hsum) < hsum) {
    ++sum;
  }


  return sum;
}


需要写的代码也不是很多吧。还有一个要说的clock-arch.c 的文件是与系统时钟节拍有关的,超级少,只有一个函数:


extern uint32_t SYS_TICK;
clock_time_t
clock_time(void)
{
    return (SYS_TICK);
}


ef72a01d-79f1-4d38-955e-1dd09eb623a9.jpg


OK,基本完成,接下来就是一些小修修改了。不说了,应该很容易了,先看看uIP效果吧。


编译OK,然后呢,怎么做?  下载工程到深蓝开发板上去,直接跑啊,PING 啊


 c518bf86-3bb4-44aa-bb08-436a0f14d4f1.jpg


 


已经跑起来了,即可加入其它相应的功能了,做嵌入式服务器,客户端,SMTP,能做的事就多了.


IAR工程包下载,直接可以在深蓝开发板上运行(本人开发的,没有? 可以到我的淘宝去看看啊)


 


 


 

PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

用户1710962 2013-11-8 21:02

学习了,要在430上移植,参考一下……

用户423223 2012-4-21 10:11

useful henyouyong强大

用户417603 2012-4-12 22:38

大神,膜拜下

用户44393 2011-6-2 09:42

路过

用户1409644 2010-11-8 16:02

学习

xucun915_925777961 2010-11-5 11:21

走过,路过,学习一下^_^

huotingtu_505472073 2010-11-5 01:01

向楼主学习

用户1600327 2009-2-28 12:58

楼主辛苦!致以崇高敬意!!!

用户25499 2007-11-15 23:33

很有帮助,多谢

用户102575 2007-8-27 00:35

dds太好了就是资料下不下来啊有点欠缺 啊
相关推荐阅读
用户1369714 2012-04-12 12:34
大家好,我是itspy,关于这个博客,请大家看过来!
大家好,我是itspy,关于这个博客...,很失望,以后不会用了 如果大家有什么问题,请到我的另一个博客去留言吧 我也很希望跟大家做交流,有什么技术问题,itspy会很乐意帮助的,新博客欢...
用户1369714 2011-08-07 14:35
uip 移植在rt-thread上的源码
*/本人在以前开发过程中移植uIP到RT-Thread实时线程系统,有需要用到项目中的朋友可以参考一下。 附件是源码包,在以太网驱动采用DM9000,驱动程序和移植文件uipif.c在源码包下(rt...
用户1369714 2011-01-13 10:32
Linux内核的社会视角--Mr. Process的一生
         Linux内核是一个无比复杂的系统,要想看清大致的脉络也非易事。其实,可以把运行中的Linux想像成一个人类的社会,当中的进程就是社会中的人。人有生老病死,进程有创建、异常、终止。人...
用户1369714 2011-01-08 12:39
RT-Thread Radio 网络播放器--初次零距离接触!
      今天很高兴, 收到了RT-Thread Radio套件,还有ffx和RT-Thread工作室写的新书《RT-Thread 实时操作系统 编程指南》。 如此令人快乐的事,如此高兴,实在是想不...
用户1369714 2011-01-05 15:43
如何编写linux的驱动程序
如何编写Linux的驱动程序编写linux驱动程序,应该是一件得心应手的事,因为linux是开源的,从上往下或从下往上,一切都是那么的光明磊落的呈现于眼前。只要你愿意,你可随意了解你所想知道的东西。L...
用户1369714 2010-12-28 10:12
Busybox制作Linux根文件系统
Busybox ——嵌入式Linux中的瑞士军刀利用busybox-1.13.0制作linux根文件系统(yaffs2)源码下载:http://www.busybox.net/downloads/操作...
EE直播间
更多
我要评论
7
8
关闭 站长推荐上一条 /3 下一条