LwIP协议栈开发嵌入式网络的三种方法分析
LwIP协议栈开发嵌入式网络的三种方法分析
摘要 轻量级的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协议栈
LwIP协议是瑞士计算机科学院的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP含义是light weight(轻型)IP协议,在实现时保持了TCP协议的主要功能基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM就可以运行,这使LwIP协议栈很适合在低端嵌入式系统中使用。
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.241、端口80。在自己编写的数据接收函数中,利用两个字符型数据分别保存HTTP1.0响应消息的相关信息和要在客户端网页中显示的信息。侦听到客户端连接后,判断接收到数据的前5个字节,解析HTTP报头,如果请求方不是GET请求就中断连接,否则将那两个字符型数据的内容一次传送给客户端。在客户端PC机浏览器的地址栏中输入http://192.168.1.241/后,PC的显示结果如图5所示。

图5 开发板web服务器验证图
LwIP协议栈开发嵌入式网络的三种方法分析的更多相关文章
- 体温数据上传程序开发+获取时间的三种方法+DB Browser下载及安装
		
今天开始了体温上传程序的开发 今日所学: 获取时间 (21条消息) (转)安卓获取时间的三种方法_sharpeha的博客-CSDN博客_安卓获取时间 DB Browser安装教程 (20条消息) sq ...
 - STM32中AD采样的三种方法分析
		
在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式.三种方法按照处理复杂方法DMA模式处理模式效率最高 ...
 - VMWARE虚拟机无法访问的三种方法分析
		
bridged(桥接模式). NAT(网络地址转换模式) host-only(主机模式). 理论认识: 1.bridged(桥接模式) 在这个地方模式.虚拟机等同于网络内的一台物理主机,可对手动设置I ...
 - 转载:VMWARE虚拟机无法访问的三种方法分析
		
bridged(桥接模式).NAT(网络地址转换模式)host-only(主机模式).理论认识:1.bridged(桥接模式)在这个地方模式.虚拟机等同于网络内的一台物理主机,可对手动设置IP,子网掩 ...
 - 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
 - C#中??和?分别是什么意思?  在ASP.NET开发中一些单词的标准缩写  C#SESSION丢失问题的解决办法  在C#中INTERFACE与ABSTRACT CLASS的区别  SQL命令语句小技巧  JQUERY判断CHECKBOX是否选中三种方法  JS中!=、==、!==、===的用法和区别  在对象比较中,对象相等和对象一致分别指的是什么?
		
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
 - python网络编程调用recv函数完整接收数据的三种方法
		
最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...
 - 痞子衡嵌入式:大话双核i.MXRT1170之在线联合调试双核工程的三种方法(IAR篇)
		
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170下在线联合调试双核工程的方法(基于IAR). 前段时间痞子衡写过一篇<双核i.MXRT1170之单独在线调试从 ...
 - 部署vc2008开发的程序(三种办法,但是我觉得这种办法最不好)
		
如果你编译了一个VC2008的默认的CRT/MFC的应用程序,如果目标部署电脑上没有安装相应的VC2008的动态库,当运行你的程序的时 个,会出现如下错误信息. 这是因为程序使用了基于VC2008 ...
 
随机推荐
- 初识http2.0
			
初识http2.0 HTTP2.0性能增强的核心:二进制分帧 HTTP 2.0最大的特点: 不会改动HTTP 的语义,HTTP 方法.状态码.URI 及首部字段,等等这些核心概念上一如往常,却能致力于 ...
 - 使用 WireShark 分析 TCP/IP 三次握手  和 四次挥手
			
TCP 三次握手 示意图 Wireshark 抓包注意事项 为了演示一个TCP三次握手建立连接的过程,我们通过 Chrome 访问一个网页. 已知 HTTP 协议就是建立在TCP链接上的 比如访问以下 ...
 - CAP理论-解析
			
分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值.(等同于所有节点访问同一份最新的数据副本) ...
 - 在C#中执行带有GO的批量sql语句
			
引用 思海网络 在用C#中调用ADO执行批量SQL语句的时候,会出现无法识别GO语句的错误.这个时候,我们以GO语句为分割点,把整个批量语句分割成N块独立的SQL语句代码块(不包含GO语句),然后再 ...
 - <Android 应用 之路> 百度地图API使用(1)
			
简介 详情请看百度地图官方网站 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction 使用方式 申请密钥,针对移动 ...
 - Web.py报错:OSError: No socket could be created -- (('0.0.0.0', 8080):
			
web.py报错 Python代码: import web urls = ( '/(.*)', 'hello' ) app = web.application(urls, globals()) cla ...
 - 【Python】Sublime text 3 搭建Python IDE
			
背景: 最经遇到一件很苦恼的事情,就是在Sublime text 3中写的Python代码直接挪到python原生的ide中老是报格式的错误(有时让人讨厌的缩进),没有办法,看到Sublime tex ...
 - mac安装brew, bower
			
Mac安装Brew 安装命令如下:curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/loc ...
 - 线程 Z
			
原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加 ...
 - iOS文件处理类
			
iOS文件处理类 这是一个用来简化iOS中关于文件操作的一个类,所有方法都为类方法. Source File.h // // File.h // FileManager // // http://ho ...