搜档网
当前位置:搜档网 › 嵌入式TCPIP协议栈LWIP在ARM平台上的移植与应用

嵌入式TCPIP协议栈LWIP在ARM平台上的移植与应用

382008年第06期,第41卷 通 信 技 术 Vol.41,No.06,2008

总第198期 Communications Technology No.198,Totally

嵌入式TCPIP 协议栈LWIP 在ARM 平台上的移植与应用

孔 栋, 郑建宏

(重庆邮电大学,重庆 400065)

【摘 要】LWIP 是一套用于嵌入式系统的开放源代码的轻量级TCP/IP 协议栈,它具有移植性强、资源占用率低的优点。S3C2410A 是以ARM9处理器为内核的硬件平台,在嵌入式领域有广泛的应用。文中详细介绍了将嵌入式TCPIP 协议栈LWIP 移植到ARM 平台上过程和方法,并通过网络应用对移植效果及其性能做了简单测试和验证。

【关键词】TCPIP 移植;LWIP;ARM;嵌入式

【中图分类号】TP316.8 【文献标识码】A 【文章编号】1002-0802(2008)06-0038-03

Transplant and Application of LWIP in ARM Platform

KONG Dong, ZHENG Jian-hong

(Chongqing University of Posts and Telecommunications, Chongqing 400065, China)

【Abstract】LWIP is a light-weight TCP/IP protocol stack. Lwip is source-opened and can be transplanted very easily. ARM9 is the kernel of S3C2410A, which is widely used in the embedded systerm. This paper presents the process and method for transplanting LWIP into ARM platform. The test and verification of transplanting effects and capability by some network application is also done.

【Keywords】TCPIP;transplant;LWIP;ARM;embedded

0 引言

lwIP是瑞士计算机科学院的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。1wIP的含义是light weight(轻量型)IP协议,它可以被移植到各种操作系统中,也可以在无操作系统的情况下独立运行。1wIP实现的重点是在保持TCP/IP协议主要功能的基础上,减少对RAM 的占用。一般情况下,它只需要几十kbit的RAM 和40 kbit 左右的ROM就可以运行,这使得1wIP协议栈适合在低端嵌入

式系统中使用。[1]

uC/OS—II系统本身没有TCI/IP协议栈,

文中将LWIP移植到uC/OS—II中,使其具有网络通信功能。移植成功后在ARM平台上进行了网络通信的应用测试。

1 硬件环境

S3C2410A 是一款16/32位RISC 微处理器,它采用了

ARM920T 内核,内部带有全性能的 MMU(内存处理单元) [2]

它适用于设计移动手持设备类产品,具有高性能、低功耗、接口丰富和体积小能优良特性。

作者使用的开发板与S3C2410A 相关的部分集成了以下外围设备:FPGA;LCD;ARM JTAG ;外部存储控制器(EMIF)

接2M FLASH 和8M SDRAM 做为存储器。

图1 开发板结构

2 LWIP 到 uC/OS—II 的移植

uC/OS—II 是一种可移植、可固化、可裁减以及可剥夺型的多任务实时性内核,适用于各种微处理器和微控制

器。[3]

在LWIP 的移植前,uC/OS—II 已经稳定的运行在

S3C2410A 开发平台上。 2.1 LWIP 简介

LWIP 以协议的分层作为参照实现协议栈,每个协议作为一个单独的模块。此外还有一些支持模块,如操作系统模拟层模块、缓冲与内存管理子系统、网络接口模块、INTERNET 校验和计算模块。作为一款轻量级的TCPIP 协议栈,LwIP 特

别适合应用在较为低端的嵌入式系统中,它具有以下特性:[4]

收稿日期:2008-01-23。

基金项目:国家863计划引导项目课题(编号:2004AA123150)。 作者简介:孔 栋(1982-),男,硕士研究生,主要研究方向为第三代移动通信;郑建宏,男,教授,硕士生导师。

(1)支持多网络接口下的IP转发;(2)支持ICMP协议;(3)包括实验型扩展的UDP;(4)包括拥塞控制、RTT 估算、快速恢复以及快速转发的TCP;(5)提供专门的内部回掉函数接口(RAW API)用于提高应用程序性能;(6)提供在多线程环境下的Berkeley接口API。

2.1.1 IP层实现

IP协议是TCPIP协议栈中最重要、最为核心的,所有的TCP、UDP以及ICMP数据都是以IP数据报文格式传输。LWIP 实现了IP协议的基本功能,可以接收、发送、转发数据报文,满足大部分应用的要求。对于分块的报文或者带有扩展选项的报文,LWIP目前还未支持。

2.1.2 TCP层实现

TCP层收到数据包时,需要进行ACK处理。它负责通知网卡缓存丢弃已经确认的数据,当ACK对当前连接状态做出改变时,需要对TCP状态做特殊处理。

2.1.3 应用层API实现

LWIP为应用程序提供了两种接口,序列API和内部回调API。前者提供了一种普通的编程接口,其执行按照打开、读取、写出、关闭的顺序。这于我们熟悉的unix中的socket接口类似。TCPIP协议栈是事件驱动的,所以这种结构导致lwip和应用程序必须在不同的线程中执行。回调API调用了协议栈中的回调接口函数,因此应用程序和协议栈是在同一个进程内运行。

2.2 移植过程

嵌入式TCPIP协议栈有两种普遍的实现方法。一种是将协议族中的每个协议作为一个单独的进程,并指定进程之间的通信点。此方法的优点是结构清晰代码易懂,调试方便,缺点是数据跨层传送时要产生频繁的进程切换,比如传送一个TCP数据段,要经过网络设备驱动层到IP层,IP层到TCP 层,TCP层到应用层3次进程切换。在资源受限的嵌入式系统中,这种代价是昂贵的。另外一种方法是将协议栈驻留在操作系统内核中,应用程序通过系统调用和协议栈通讯。

作为一款适合于嵌入式系统的轻量级协议栈,LWIP采用所有协议在同一个任务TCPIP_thread中实现,即驻留在一个进程当中,从而独立于操作系统内核之外。应用程序可以是独立的任务,也可以在协议栈的任务中利用内部回调函数RAW API实现。这种设计方法使得LWIP非常易于移植到不同的操作系统中。

2.2.1 操作系统模拟层

为了方便LWIP移植到不同的操作系统,其代码中并不涉及具体的操作系统的系统调用和数据结构,取而代之的是操作系统模拟层(sys_arch)。该层通过统一的接口提供如定时器、进程间同步、消息传递机制等系统服务。

按照LWIP开发者之一Adam Dunkels编写的系统模拟层编写说明,我们要实现对信号量、邮箱、创建线程、超时机制、临界保护等函数的改写。

(1)API接口定义。LWIP操作系统模拟层函数是通过调用uC/OS—II 的底层函数实现功能的。首先要编写接口层文件osi_api.c,定义接口函数,方便LWIP的调用。

(2)进程间通信。Sys_arch为LWIP提供两种进程间通信的方式(IPC),信号量和邮箱。信号量既可以是计数信号量,也可以是二值信号量。邮箱用来传递消息,可以以消息队列的方式传送,也可以一次只允许传送一个消息。

(3)创建线程。LWIP创建线程,实际上就是利用uC/OS的系统函数创建了一个任务,因此sys_thread_new函数实现比较简单。LWIP中TCPIP、PPP、SLIP线程的优先级都为1,显然需要调整。因为uC/OS—II中任务优先级别不能相同,而且优先权过高。

(4)临界保护。LWIP中的临界保护函数sys_arch_ protect,负责完成临界区域保护和返回原来的状态,该函数支持递归调用,即在临界保护区内可以被再次调用。uC/OS 系统中采用开关中断的方式实现临界保护,并提供了OS_CPU_SR_Save()和OS_CPU_SR_Restore(cpu_sr)两个函数。为了方便,我们可以直接定义宏SYS_ARCH_PROTECT 和SYS_ARCH_UNPROTECT,来代替sys_arch_protect和sys_arch_unprotect函数。

(5)超时处理。LWIP中每一个有网络连接作用的线程都具有超时属性,即维护了一个sys_timeouts链表。包括超时时间长度,超时调用函数。如果线程对应的sys_timeouts为空,那说明该线程将永久等待。移植时需要编写sys_arch_timeouts(void)函数,该函数返回线程的当前sys_timeouts结构体指针。

(6)编译器相关。ARM处理器系统中访问内存时规定:一次访问4个字节内容,该内容的起始地址必须在4字节对齐的位置上;一次访问2个字节内容,该内容的起始地址必须在2字节对齐的位置上。如果我们设计的结构体不能以4字节对齐,那么ARM编译器会自动调整。但是我们保存网络数据包结构体时,要按照实际成员边界来访问结构体。因此我们必须关闭编译器的这一优化选项。针对此问题,LWIP中预留了几个PACKED_ FIELD_xxx宏定义,默认初始值都时空的。移植时我们需要添加ADS集成开发环境下CodeWarrior 编译器的_packed关键字。

经过上述6个步骤,操作系统模拟层的编写已经完成。

2.2.2 LWIP初始化配置[5]

首先建立LWIP入口函数,调用基本初始化和基本设置函数。初始化完成后进入应用阶段。

(1)LWIP基本初始化。LWIP的基本初始化包括系统初始化、内存初始化、TCPIP层初始化等,由LWIP提供的初始化函数完成。

(2)LWIP初始化配置。此步骤完成网络驱动程序和LWIP 的接口,即建立数据的接收入口并完成和LWIP接口对接。主要功能是在iLv_SetLwIP函数中完成,函数实现过程如图2所示。

图2 LWIP初始化配置流程

39

402.2.3 网络驱动程序

S3C2410A 开发板中采用了RTL8139网络接口芯片,LWIP 为此类型芯片提供了网络驱动模板,移植时只需要按照模板的框架完成与底层物理硬件芯片相关的内容[6]。网络驱动程序包括网卡的初始化、中断处理函数、接收和发送线程、网卡的读取和发送数据处理。 2.3 移植结果和验证

在uC/OS 的入口函数中建立LWIP 的测试任务,建立简单的WEB 服务器和FTP 服务器,用ARM Developer Suite 开发套件的CodeWarrior 下对工程进行编译和链接,将生成的Bin 文件通过USB 烧写到FLASH 中。用网线连接电脑和开发板,设置开发板和PC 机网卡的IP 地址。运行windows 的PING 程序,经测试,连接正常。利用FlashGet 进行FTP 下载,并用浏览器访问WEB 服务器,上层协议测试正常,移植工作成功。

3 结语

文章详细介绍了将轻量级TCPIP 协议栈LWIP 移植到ARM 嵌入式平台上的方法,使uC/OS—II 获得了TCP/IP 网络通信功能。

参考文献

1 Dunkels A.Design an implementation of the lwIP TCP/IP Stack[EB /OL].http://www.sics.se/~adam/1wip/doc/1wip.pdf.[2006-06].

2 杭州立宇泰电子,S3C2410A 中文数据手册[EB/OL]. http: //www. https://www.sodocs.net/doc/349791468.html,,2007.

3 JEAN J Labross.uC/OS 一Ⅱ源码公开的实时嵌入式操作系统[M].邵贝贝,译.北京:中国电力出版社,2001:30-31.

4 张来君. 基于LWIP 平台的无线TCP 性能研究[D]. 2006-3-15:21-25.

5 焦海波. uC/OS 下的LWIP 移植[EB/OL]. http://groups.google. com/group/marsstory,2006-11.

6 李鸿强,苗长云. LWIP 移植到uC/OS 下的实现[J]. 天津工业大学学报,2006,(04):38-39.

(上接第37页)

在每一个接入路由器中存储的接入地址和路由地址映射表如表1所示。表2、表3、表4是每个路由器上的保存的路由表。

表1 接入地址和路由地址映射

接入地址

交换路由地址 192.168.10.1 192.168.11.1 192.168.20.1 192.168.22.1 192.168.30.1

192.168.33.1

表2 R1路由器上的路由

Destination Gateway Genmask Iface 192.168.11.0/24 *

255.255.255.0 Eth1192.168.22.0/24 192.168.5.2255.255.255.0 Eth0192.168.33.0/24 192.168.4.2

255.255.255.0 Eth2

表3 R2路由器上的路由

Destination Gateway Genmask Iface 192.168.11.0/24 192.168.5.1

255.255.255.0 Eth1 192.168.22.0/24 *

255.255.255.0 Eth0 192.168.33.0/24

192.168.6.1

255.255.255.0

Eth2

表4 R3路由器上的路由

Destination Gateway Genmask Iface

192.168.11.0/24 192.168.4.1 255.255.255.0 Eth1 192.168.22.0/24 192.168.6.2

255.255.255.0 Eth2 192.168.33.0/24

*

255.255.255.0

Eth0

图2 接入地址和路由地址分离方案的实验拓扑 在如图2所示的实验环境中,主机A、B 和C 通过路由器R1、R2和R3上的映射表项能够相互访问,主机能够

准确获得接入地址和交换路由地址之间的映射关系,并且能够及时更新,即具有接入地址和交换路由地址之间映射机制的可得性、精确性和时效性。同时,该方案没有引入服务器,从而减少了数据包通过服务器时的系统开销,并且满足了在普适计算环境下的直达路由的需求。

3 结语

文中提出了一个基于路由器的NAT 系统的接入地址和交换路由地址分离的方案,并实现了该方案。实验结果表明,该方案具有可得性、精确性和时效性,适用于IPv4及IPv6网络,在域内使用时不需要引入新的服务器,且满足了普适计算环境下的直达路由的需求。同时,该方案中接入地址和交换路由地址分离,对于研究未来分组网络如何提供较好的移动性支持具有较大意义。

参考文献

1 RFC 1631, The IP network address translator(NAT)[S].

2 RFC3022, Traditional IP Network Address Translator(Traditional NAT)[S].

3 RFC3489, STUN – Simple Traversal of User Datagram Protocol Through Network Address Translators[S].

4 J. Rosenberg, C. Huitema, R. Mahy. Traversal Using Relay NAT (TURN)[EB/OL].https://www.sodocs.net/doc/349791468.html,/midcom_turn.html, 2007-

10-11

5 李鸿彬,杨雪华,雷为民.TURN 服务器原型系统的设计与实现[J].计算

机应用,2005,25(07): 1688-1691.

6 Zhang Jianwei, Pi Renjie, Yao Fuzhou,et al. Router UDP Switch support NAT Traversal[C]. The 2nd International Conference on Pervas- ive Computing and its Application(ICPCA07), Birmingham, England. July 2007.

B

A

C

192.168.20.1

192.168.2.2eth1

192.168.5.2

eth2

192.168.4.1eth1

192.168.3.2192.168.30.1

192.168.10.1

192.168.1.2

相关主题