LwIP协议栈开发嵌入式网络的三种方法分析


LwIP
协议栈开发嵌入式网络的三种方法分析web

 

摘要  轻量级的TCP/IP协议栈LwIP,提供了三种应用程序设计方法,且很容易被移植到多任务的操做系统中。本文结合μC/OS-II这一实时操做系统,以创建TCP服务器端通讯为例,分析三种方法以及之间的关系,着重介绍基于raw API的应用程序设计。最后在ST公司STM32F107微处理器平台上验证,并给出了测试结果。编程

关键词  LwIP协议栈;μC/OS-II;嵌入式网络;STM32F107;浏览器

 

      随着嵌入式系统功能的多样化以及网络在各个领域的中的普遍应用,具有网络功能的嵌入式设备拥有更高的使用价值和更强的通用性。然而大部分嵌入式设备使用经济型处理器,受内存和速度限制,资源有限,不须要也不可能完整实现全部的TCP/IP协议,有时只须要知足实际需求就行。LwIP是由瑞典计算机科学研究院开发的轻量型TCP/IP协议栈,其特色是保持了以太网的基本功能,经过优化减小了对存储资源的占用。LwIP是免费、开源的,任何人可使用,可以在裸机的环境下运行,固然设计的时候也考虑了未来的移植问题,能够很容易移植到多任务操做系统中。本文介绍了以ARM微处理器STM32F107和PHY接口DP83848为平台,构建的嵌入式系统中,采用LwIP和嵌入式操做系统μC/OS-II,使用协议栈提供的三种应用程序接口,实现嵌入式设备的网络通讯功能。服务器

 

1   LwIP和μC/OS-II介绍网络

1.1 LwIP协议栈socket

LwIP协议是瑞士计算机科学院的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP含义是light weight(轻型)IP协议,在实现时保持了TCP协议的主要功能基础上减小对RAM的占用,通常它只须要几十K的RAM和40K左右的ROM就能够运行,这使LwIP协议栈很适合在低端嵌入式系统中使用。tcp

LwIP协议栈的设计才用分层结构的思想,每个协议都做为一个模块来实现,提供一些与其它协议的接口函数。全部的TCP/IP协议栈都在一个进程当中,这样TCP/IP协议栈就和操做系统内核分开了。而应用程序既能够是单独的进程也能够驻留在TCP/IP进程中,它们之间利用ICP机制进行通信。若是应用程序是单独的线程能够经过操做系统的邮箱、消息队列等,与协议栈进程通信。若是应用程序驻留在协议栈进程中,则应用程序能够经过内部回调函数和协议栈进程通信。函数

1.2 μC/OS-II实时操做系统测试

μC/OS-II是一个源码公开、可移植、可固化、可裁剪及占先式的实时多任务操做系统,是专门为嵌入式应用设计的实时操做系统内核,已普遍的应用在各类嵌入式系统中。优化

μC/OS-II是多任务系统,内核负责管理各个任务,每一个任务都有其优先级,μC/OS-II最多能够管理64个任务,其每一个任务都拥有本身独立的堆栈。μC/OS-II提供了很是丰富的系统服务功能,好比信号量、消息邮箱、消息队列、事件标志、内存管理和时间管理等,这些功能能够帮助用户实现很是复杂的应用。

1.3     LwIP协议栈移植到μC/OS-II

LwIP协议栈在设计的时候就考虑到了未来的移植问题,所以把全部与硬件、操做系统、编译器有关的部分都所有独立起来,造成了一个操做系统模拟层。操做系统模拟层用进程间的信号量、邮箱机制处理通讯问题,而μC/OS-II是一个基于任务调度的嵌入式实时操做系统,所以移植LwIP协议栈到μC/OS-II,是很容易实现的。

2 LwIP开发嵌入式网络应用程序

LwIP提供了三种应用程序接口:

(1)       低水平的,基于内核/回调函数的API(后面称 RAW API)

(2)       高水平的,连续的API(后面称LwIP API)

(3)       BSD风格的套接字API(后面称BSD socket)

能够在协议栈中经过对宏定义的不一样配置,来决定使用哪一种方式。其中BSD socket方式不是很成熟,RAW API须要编写回调函数,协议栈推荐使用LwIP API这种方式,可是三种方式到了底层都是经过回调函数实现的。本文直接从RAW API入手,以创建TCP服务器端通讯为例,详述底层的调用,而后再讲述后面的两种是如何封装而成的。

2.1基于RAW API的应用程序设计步骤

使用RAW API进行TCP/IP编程,可使应用程序的代码和协议栈的代码很好地结合起来。程序的执行机制是以回调函数为基础的事件驱动的,同时回调函数也是被TCP/IP代码直接调用的,回调函数、数据发送函数都须要本身编写。这种方式是惟一的一种支持设备裸机运行,又能够完成网络通讯完成系统功能。裸机运行实际至关因而一个线程,而协议栈代码和应用程序代码经过前后次序处理,完成数据流转。

图1是使用RAW API方式,多任务系统实现TCP服务器端通讯的步骤。

图1 RAW API方式应用程序设计

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 基于LwIP API的应用程序设计

LwIP API方式的编程,是基于上面的RAW API的,封装了一个netconn的结构,全部操做不在针对TCP块结构,而变成了netconn型的结构变量。操做都须要协议栈去处理,应用程序与协议栈通讯,经过发送消息方式进行,所以这种方式会形成频繁的任务切换,速度相比RAW API慢了许多,使用步骤如图2所示。

图2 LwIP API方式应用程序设计

2.3 基于BSD socket的应用程序设计

BSD socket至关于对LwIP API作了一层封装,而netconn结构有一个变量是socket,这样二者很容易结合起来。Socket方式很容易被理解,编写应用程序也较为容易,可是效率低,消耗的资源更多,使用步骤如

图3 BSD socket方式应用程序设计

3 实际应用与验证

本次验证中使用的开发板,微处理器采用ST公司推出的STM32F107,以太网PHY芯片采用DP83848.STM32F107是一款基于ARM Cortex-M3内核的32位处理器,是面向网络互连型应用的,最大工做频率为72MHz,内置了MAC控制器,能够方便地与以太网PHY芯片链接,构成以太网接口。以太网PHY芯片DP83848采用RMII模式与STM32F107链接。RMII模式能够减小接口之间的引脚链接,下降了绘制电路板的复杂性,同时空闲的引脚可用做其它用途,以太网接口如图4所示。

图4 STM32F107 MAC与DP83848链接图

在开发板上,移植好LwIP协议栈和μC/OS-II操做系统,应用程序中建立一个Web服务器,绑定本地IP地址192.168.1.24一、端口80。在本身编写的数据接收函数中,利用两个字符型数据分别保存HTTP1.0响应消息的相关信息和要在客户端网页中显示的信息。侦听到客户端链接后,判断接收到数据的前5个字节,解析HTTP报头,若是请求方不是GET请求就中断链接,不然将那两个字符型数据的内容一次传送给客户端。在客户端PC机浏览器的地址栏中输入http://192.168.1.241/后,PC的显示结果如图5所示。

 

图5 开发板web服务器验证图

相关文章
相关标签/搜索