新闻  |   论坛  |   博客  |   在线研讨会
开源项目: uIP嵌入式TCP/IP协议栈
lionwq | 2008-01-21 09:07:23    阅读:14128   发布文章

uIP开源项目介绍

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占用, 单位字节

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

配置实例

对上图做一点补充, 注意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实现.

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.

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.

平台移植:

快速向导: 移植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

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

参考
The uIP TCP-IP Stack for Embedded Microcontrollers

备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.

关键字: kernel, stack, tcpip, uIP, 内核

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
淡泊以明志 宁静以致远
推荐文章
最近访客