LwIP协议栈开发嵌入式网络的三种方法分析_第1页
LwIP协议栈开发嵌入式网络的三种方法分析_第2页
LwIP协议栈开发嵌入式网络的三种方法分析_第3页
LwIP协议栈开发嵌入式网络的三种方法分析_第4页
LwIP协议栈开发嵌入式网络的三种方法分析_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

LwIP协议栈开发嵌入式网络的三种方法分析摘要轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操作系统中。本文结合gC/OS-II这一实时操作系统,以建立TCP服务器端通信为例,分析三种方法以及之间的关系,着重介绍基于rawAPI的应用程序设计。最后在ST公司STM32F107微处理器平台上验证,并给出了测试结果。关键词LwIP协议栈;gC/OS-II;嵌入式网络;STM32F107;随着嵌入式系统功能的多样化以及网络在各个领域的中的广泛应用,具备网络功能的嵌入式设备拥有更高的使用价值和更强的通用性。然而大部分嵌入式设备使用经济型处理器,受内存和速度限制,资源有限,不需要也不可能完整实现所有的TCP/IP协议,有时只需要满足实际需求就行。LwIP是由瑞典计算机科学研究院开发的轻量型TCP/IP协议栈,其特点是保持了以太网的基本功能,通过优化减少了对存储资源的占用°LwIP是免费、开源的,任何人可以使用,能够在裸机的环境下运行,当然设计的时候也考虑了将来的移植问题,可以很容易移植到多任务操作系统中。本文介绍了以ARM微处理器STM32F107和PHY接口DP83848为平台,构建的嵌入式系统中,采用LwIP和嵌入式操作系统gC/OS-II,使用协议栈提供的三种应用程序接口,实现嵌入式设备的网络通信功能。1LwIP和uC/OS-II介绍LwIP协议栈LwIP协议是瑞士计算机科学院的AdamDunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP含义是lightweight(轻型)IP协议,在实现时保持了TCP协议的主要功能基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM就可以运行,这使LwIP协议栈很适合在低端嵌入式系统中使用。LwIP协议栈的设计才用分层结构的思想,每一个协议都作为一个模块来实现,提供一些与其它协议的接口函数。所有的TCP/IP协议栈都在一个进程当中,这样TCP/IP协议栈就和操作系统内核分开了。而应用程序既可以是单独的进程也可以驻留在TCP/IP进程中,它们之间利用ICP机制进行通讯。如果应用程序是单独的线程可以通过操作系统的邮箱、消息队列等,与协议栈进程通讯。如果应用程序驻留在协议栈进程中,则应用程序可以通过内部回调函数和协议栈进程通讯。pC/OS-II实时操作系统gC/OS-II是一个源码公开、可移植、可固化、可裁剪及占先式的实时多任务操作系统,是专门为嵌入式应用设计的实时操作系统内核,已广泛的应用在各种嵌入式系统中。gC/OS-II是多任务系统,内核负责管理各个任务,每个任务都有其优先级,gC/OS-II最多可以管理64个任务,其每个任务都拥有自己独立的堆栈。gC/OS-II提供了非常丰富的系统服务功能,比如信号量、消息邮箱、消息队列、事件标志、内存管理和时间管理等,这些功能可以帮助用户实现非常复杂的应用。LwIP协议栈移植到pC/OS-IILwIP协议栈在设计的时候就考虑到了将来的移植问题,因此把所有与硬件、操作系统、编译器有关的部分都全部独立起来,形成了一个操作系统模拟层。操作系统模拟层用进程间的信号量、邮箱机制处理通信问题,而gC/OS-II是一个基于任务调度的嵌入式实时操作系

统,因此移植LwIP协议栈到以C/OSIL是很容易实现的。2LwIP开发嵌入式网络应用程序LwIP提供了三种应用程序接口:(1) 低水平的,基于内核/回调函数的API(后面称RAWAPI)(2) 高水平的,连续的API(后面称LwIPAPI)(3) BSD风格的套接字API(后面称BSDsocket)可以在协议栈中通过对宏定义的不同配置,来决定使用哪种方式。其中BSDsocket方式不是很成熟,RAWAPI需要编写回调函数,协议栈推荐使用LwIPAPI这种方式,但是三种方式到了底层都是通过回调函数实现的。本文直接从RAWAPI入手,以建立TCP服务器端通信为例,详述底层的调用,然后再讲述后面的两种是如何封装而成的。2.1基于RAWAPI的应用程序设计步骤使用RAWAPI进行TCP/IP编程,可以使应用程序的代码和协议栈的代码很好地结合起来。程序的执行机制是以回调函数为基础的事件驱动的,同时回调函数也是被TCP/IP代码直接调用的,回调函数、数据发送函数都需要自己编写。这种方式是唯一的一种支持设备裸机运行,又可以完成网络通信完成系统功能。裸机运行实际相当于是一个线程,而协议栈代码和应用程序代码通过先后次序处理,完成数据流转。图1是使用RAWAPI方式,多任务系统实现TCP服务器端通信的步骤。系统初始化匕任务启动_完成板级支持包初始化_系统初始化匕任务启动_完成板级支持包初始化_调用协议栈接口,完成协议栈初始化、网卡初始化,创建协议栈任务创建网口数据接收任务 "力・。'创建止仁?块结构 tcpbind绑定本地卬、_端口tcplisten,处于侦听状态1_ ,tcp_accept,注册自己编写 的接收函数 tcp_recv,注册自己编写的 数据接收函数 编写网口数据发送函数TaskInitStart协议栈任务 「 网口数据接收任务■■—If---网卡有数据到来是调用协议栈网络接口函数 ethernet|if_input 等待数据到来发送消息,类型是一调用与协议栈任务通信等待数据到来TCPIP_MSG_INPKT 函数tcpip_input_数据到IP层 = 连接时,回调接收函数,数据到TCP层一 全局的TCP块指针指向与客户端通信的块结构有数据到来时,

回调数据接收函数将接收到的数据处理后,交给应用程序任务处理•要发送数据时调用'图1RAWAPI有数据到来时,

回调数据接收函数将接收到的数据处理后,交给应用程序任务处理•要发送数据时调用'LwIP协议栈中的tcp块结构有两种TCP_PCB和TCP_PCB_LISTEN,前者在内存池中的默认个数是5,后者是8,其中listen型的结构占用少量的内存,专门用于处理在侦听状态的tcp块结构°tcp_listen函数中,释放tcp_new创建的块结构,而是返回一个listen型的tcp块结构。客户端连接,到达TCP层,在tcp_listen_input函数中,重新创建一个TCP_PCB块结构,专门用于和客户端通信。侦听到客户端连接,完成三次握手后,回调自己编写的接收函数,然后将全局的指针指向与客户端通信的块结构,在数据发送时,

使用这个指针,就是在用这个块结构与客户端通信。由上面看出,这种方式最大的特点是减少了任务之间的切换,只要数据来到协议栈线程,通过回调的方式就可以完成数据的处理。2.2基于LwIPAPI的应用程序设计LwIPAPI方式的编程,是基于上面的RAWAPI的,封装了一个netconn的结构,所有操作不在针对TCP块结构,而变成了netconn型的结构变量。操作都需要协议栈去处理,应用程序与协议栈通信,通过发送消息方式进行,因此这种方式会造成频繁的任务切换,速度相比RAW人?1慢了许多,使用步骤如图2所示。应用程序任务协议栈任务netconn_new

创建一个新的连接netconn_bind

绑定本地应用程序任务协议栈任务netconn_new

创建一个新的连接netconn_bind

绑定本地IP、端口TCPIP_MSG_API,, z消息类型TCPIP_MSG_INPKTdo_newconn,建立TCP结构 卜注册数据接收函数recv_tcp

do_bind调用tcp_bind函数 ]TaskNetDataRecv

网口数据接收任务netconnlisten开始侦听netconn_accept

等待客户端连接,成功则

返回一个新的netconn

netconnlisten开始侦听netconn_accept

等待客户端连接,成功则

返回一个新的netconn

结构,用于客户端通信dolisten,注册接收函数

accept_function■■给连接的acceptmbox发送消息、 客户端连接时回调日acceptfunctionnetconnrecv等待数据♦—给连接的recvmboxnetconnrecv等待数据♦—给连接的recvmbox发送消息客户端有数据到来,.回调recvtcp数据接收并处理完毕

后,需要发送数据do_recv,告诉协议栈,已经获取数据+|netconn_write|netconn_write发送数据|do_write,发送数据到TCP层1图2LwIPAPI方式应用程序设计2.3基于BSDsocket的应用程序设计BSDsocket相当于对LwIP人?【做了一层封装,而netconn结构有一个变量是socket,这样两者很容易结合起来。Socket方式很容易被理解,编写应用程序也较为容易,但是效率低,消耗的资源更多,使用步骤如图3所示。Seek前函数创建一个套接字—调用netconn_new_with_callback一Socket函数创建个套接字1 创建一个netconn型的连接bind绑定本地叩、端口调用netconn_bind实现listenlisten开始侦听调用netconn_listen_with_backlogaccept接收客户端连接'调用netconn_accept实现read等待客户端数据到1|来调用netconn_recv实现数据接收并处理完毕

后,需要发送数据write发送数据write发送数据'调用netconn_write实现图3BSDsocket方式应用程序设计3实际应用与验证本次验证中使用的开发板,微处理器采用ST公司推出的STM32F107,以太网PHY芯片采用DP83848.STM32F107是一款基于ARMCortex-M3内核的32位处理器,是面向网络互连型应用的,最大工作频率为72MHz,内置了MAC控制器,可以方便地与以太网PHY芯片连接,构成以太网接口。以太网PHY芯片DP83848采用RMII模式与STM32F107连接。RMII模式可以减少接口之间的引脚连接,降低了绘制电路板的复杂性,同时空闲的引脚可用作其它用途,以太网接口如图4所示。MII_TX_ENMII_TXD0-MII_TXD1-MII_MDC-STM32F107以太网模块,MII_MDIO"MII_RXD1♦MII_RXD0MII_RX_DV/iRMIICRSDVTX_ENTXD_0TXD_1MDCDP83848接口'MDIO'RXD_1'RXD_0-RX_DV/MIIMODE图4STM32F107MAC与DP83848连接图在开发板上,移植好LwIP协议栈和以C/OSII操作系统,应用程序中创建一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论