zhaoke 发表于 2007-1-20 03:02:49

开源项目: uIP嵌入式TCP/IP协议栈

开源项目: uIP嵌入式TCP/IP协议栈

赵珂, cn.zhaoke.com
http://blog.zhaoke.com/64.html
2006年1月20日


http://blog.zhaoke.com/data/2007/0120/uip_tcpip.gif

uIP是专为8位和16位的嵌入式微控制器设计的微型TCP/IP协议栈, 它采用BSD授权(这里可以获得完整的BSD许可证), 具有良好的互操作性, 并遵循RFC标准.


uIP提供了网络通信所必须的协议, 本身代码和占用的内存数都非常少 - uIP的源代码只有几KB, RAM占用仅几百字节.

uIP是一个完全由C语言编写的开源软件, 它的文档和源代码可用于商业和非商业用途, 它已经移植到了大部分的8位微控制器, 而且已在很多的嵌入式产品和项目中使用. (比如卫星, Cisco路由器. 查阅Links页面的几个例子)

uIP具有如下功能:
.良好的文档和源代码注释 - 几乎每一行代码都有注释.
.代码非常少.
.占用非常少的内存, 在编译时候可以设置.
.支持ARP, SLIP, IP, UDP, ICMP(ping)和TCP协议.
.提供一套实例程序: web服务器, web客户端, 电子邮件发送程序(SMTP客户端), Telnet服务器, DNS主机名解析程序.
.同时活动的TCP链接数没有限制, 在编译时候可以设置.
.可免费用于商业和非商业用途.
.TCP和IP协议遵循RFC标准, 包括流控制, 片断分割和重传超时估算.

uIP由瑞典计算机科学学院(网络嵌入式系统小组)的Adam Dunkels开发.

uIP的代码大小和RAM占用

下面表格显示了uIP的代码大小和RAM占用. 代码使用gcc 3.3在8位的Atmel AVR架构上编译并使用代码大小优化(-Os).

uIP在Atmel AVR平台上的代码大小和RAM占用, 单位字节
http://blog.zhaoke.com/data/2007/0120/uip01.gif

总的内存占用将依赖: 分配了多少个TCP链接数, 分配了多少个ARP表项, 分配了多大的包缓冲. 这些在编译时候可以设置. 每一个正在监听的TCP端口增加额外的2个字节内存. 下面是uIP的一个配置实例: 一个正在监听的TCP端口, 10个TCP连接数, 10个ARP表项, 一个400字节大小的包缓冲和一个简单的HTTP服务器.

配置实例
http://blog.zhaoke.com/data/2007/0120/uip02.gif

对上图做一点补充, 注意uIP的设计使用了非常少的堆栈内存. uIP的调用视图非常窄, main函数和应用函数之间只有单个函数调用. 大多应用程序使用uIP函数作为C Macro, 因此不需要使用调用栈.

uIP文档

uIP文档1.0提供两种格式下载: HTML和PDF(uip-1.0-refman.pdf, 1.4MB, 261页)

发表论文:

1. Adam Dunkels, “Full TCP/IP for 8-Bit Architectures“. In Proceedings of the first international conference on mobile applications, systems and services (MOBISYS 2003), San Francisco, May 2003.
描述了uIP和IwIP相关的TCP/IP标准和其它TCP/IP实现.
http://blog.zhaoke.com/data/2007/0120/mobisys2003.pdf

2. Adam Dunkels, Oliver Schmidt, Thiemo Voigt, and Muneeb Ali. Protothreads: Simplifying Event-Driven Programming of Memory-Constrained Embedded Systems. In Proceedings of the Fourth ACM Conference on Embedded Networked Sensor Systems (SenSys 2006), Boulder, Colorado, USA, November 2006.
描述和评测了支持uIP protosocket库的超轻量级protothreads.
http://blog.zhaoke.com/data/2007/0120/dunkels06protothreads.pdf

3. Adam Dunkels, Juan Alonso, and Thiemo Voigt, “Making TCP/IP Viable for Wireless Sensor Networks“, the First European Workshop on Wireless Sensor Networks (EWSN 2004), work-in-progress session.
正在撰写的论文: 讨论在无线传感器网络中使用TCP/IP和uIP.
http://blog.zhaoke.com/data/2007/0120/ewsn2004.pdf

平台移植:

快速向导: 移植uIP到其它的平台

实际的TCP/IP代码无需任何修改, 但是目标网络设备的驱动程序(以太网控制器/串口/其它)和实际的系统集成部分(比如, 主控制循环, 当数据到达或定期时钟超时需调用uIP函数)需要重写.

移植步骤:

1. 阅读上面提供的文档.
2. 在uip-1.0/目录下为你的端口创建新的目录(选择一个简短的CPU架构名称, 比如i386, 用于C编译器).
3. 从unix/子目录拷贝uip_arch.c文件到新创建的目录. ls包含了一个普通的C校验算法实现, 是一个32位的函数).
4. 从unix/子目录拷贝uipopt.h文件.
5. 根据你的项目编辑uipopt.h文件(文件是自描述型的).
6. 为你的硬件写设备驱动.(这大概是最难的部分.) 查阅unix/tapdev.c和uip/slipdev.c实例了解设备驱动如何实现.
7. 写好主控制循环, 然后调用uIP函数. 查阅unix/main.c实例了解主控制循环如何实现. 通过unix/main.c主循环实例了解如何使用ARP协议.
8. 写makefile文件, 然后编译代码. 确认你的项目(在你子目录中的.c文件)包含了../uip/uip.c文件. 如果你正使用web服务器程序, 请记住包含文件../apps/httpd/httpd.c ../apps/httpd/cgi.c ../apps/httpd/fs.c. 如果需支持ARP, 请包含文件 ../uip/uip_arp.c.
9. 发现和纠正所有的程序错误. (这是平台移植中最需技巧的部分:)

uIP程序下载
uip 1.0
http://blog.zhaoke.com/data/2007/0120/uip-1.0.tar.gz

相关网站
IwIP: 更强大的嵌入式TCP/IP协议栈.
http://www.sics.se/~adam/lwip/
Contiki: 使用uIP的嵌入式操作系统.
http://www.sics.se/contiki/
Protothreads: 超轻量级的无堆栈线程.
http://www.sics.se/~adam/pt/
Miniweb: 30字节大小的TCP/IP协议栈和Web服务器原型.
http://www.sics.se/~adam/miniweb/

参考
The uIP TCP-IP Stack for Embedded Microcontrollers
http://www.sics.se/~adam/uip/

备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.
页: [1]
查看完整版本: 开源项目: uIP嵌入式TCP/IP协议栈