LwIP协议栈的学习与应用docx- nxp-lpc

2020-04-14 16:51

LwIP协议栈的学习与应用

前言

LWIP(Light Weight Internet Protoco1)是瑞士计算机科学院(Swedish Institute of Computer Science)AdamDunkels等人开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LWIP的含义是Light Weight(轻型)IP协议。LWIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LWIP TCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用。一般它只需要几十KB的RAM和40 KB左右的ROM就可以运行,这使LWIP协议栈适合在小型嵌入式系统中使用。 LwIP的主要特性如下:

(1)支持多网络接口下的IP转发; (2) 支持ICMP协议;

(3) 包括实验性扩展的的UDP(用户数据报协议);

(4)包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议); (5)提供专门的内部回调接口(Raw API)用于提高应用程序性能; (6)可选择的Berkeley接口API(多线程情况下);

1

(7)在最新的版本中支持ppp;

(8)新版本中增加了的IP fragment的支持; (9) 支持DHCP协议,动态分配ip地址。

第一部分 协议栈的移植

第一章 准备工作

本文的硬件环境采用LPC2468作为主控MCU,LPC24xx是NXP半导体公司(由Philips公司创建) 推出的基于ARM7TDMI-S内核的微控制器,它在片上集成了10 Mbps/100 Mbps以太网控制器。PHY芯片采用DM9161AEP。 操作系统方面,我们选用的μC/OS II 2.88。开发环境采用KEIL MDK3.8。

第二章 操作系统适配层

为了使lwIP便于移植,与操作系统有关的功能函数调用和数据结构没有在代码中直接使用。而是当需要这样的函数时,操作系统适配层将加以使用。操作系统适配层向诸如定时器、处理同步、消息传送机制等的操作系统服务提供一套统一的接口。原则上,移植lwIP到其他操作系统时,仅仅需要实现适合该操作系统的操作系统模拟层。

操作系统适配层提供了由TCP使用的定时器功能。操作系统适配层提供的定时器是一次性的定时器,当超时发生时,调用一个已注册函数至少要200ms的间隔。

进程同步机制仅提供了信号量。即使在操作系统底层中信号量不可用,也可以通过其他信号原语像条件变量或互锁来模拟。

信息传递的实现使用一种简单机制,用一种称为“邮箱”的抽象方法。邮箱做两种操作:

2

邮寄和提取。邮寄操作不会阻塞进程;邮寄到邮箱的消息由操作系统模拟层排入队列直到另一个进程来提取它们。即使操作系统底层对邮箱机制不支持,也容易用信号量实现。

信号量多用于任务间同步和互斥。 邮箱用于大数据的传送。 队列多用于处理有序的事件。 做比较“粗俗”的比喻,信号量就是中央政府发给官人做一方大员的官印,有很多种官印但是不能一印多发,得到官印者才能掌权鱼肉一方百姓(任务得到信号量才能运行),否则你就只要等官跑官。邮箱,就好给比当差的下达的抄家、拆房、收监等红头文件,拿到啥样的文件就干啥。消息队列,就是给任务发了一连串的邮件,官员(任务)拿到这一大摞文件,可以从底部或者顶部(LIFO or FIFO)一个一个拆开处理。(注:来自www.ouravr.com)

操作系统适配层的移植主要是在sys_arch.c里面,主要有以下几部分: 信号量相关:

sys_sem_t sys_sem_new(u8_t count)

创建一个新的信号量,并给信号量赋予初值 count。

void sys_sem_signal(sys_sem_t sem) 向指定的信号量发送信号。

void sys_sem_free(sys_sem_t sem) 释放指定的信号量

u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)

邮箱(MailBox)相关:

sys_mbox_t sys_mbox_new(int size) 函数

建立一个空的邮箱,如果创建成功,则返回邮箱的地址,如果创建失败则返回为空。 void sys_mbox_free(sys_mbox_t mbox) 函数

void sys_mbox_post(sys_mbox_t mbox, void *msg) 函数

3

err_t sys_mbox_trypost(sys_mbox_t mbox, void *msg) 函数

u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout) u32_t sys_arch_mbox_tryfetch(sys_mbox_t mbox, void **msg) 函数 这个函数是1.3后新有的,

第二章 网卡驱动层

网卡的驱动层主要分为2个方面:MAC和PHY的初始化,数据的收发控制。下面先介绍MAC和PHY的初始化:

以太网接口的自适应能力由DM9161AEP的自动协商功能体现出来。自动协商功能提供了一种在网络连接的两端之间交换配置信息的机制,在该机制下,这两端将自动选择最优的配置, DM9161AEP支持4种不同的以太网工作方式(10 Mbps半双工、10 Mbps全双工、100 Mbps半双工和100 Mbps全双工),自动协商功能在芯片配置的基础上自动选择性能最高的工作方式。

为了进行数据高效率的收发,我们设计了接收和发送两个线程进行并发处理。数据接收线程采用信号量机制,一直在等待ISR的数据接收信号。

4

第三章 应用示例

LwIP的应用程序接口

通常情况下TCP/IP协议栈的数据处理流程一般有几种方式:

(1) TCP/IP协议的每一层是一个单独进程。链路层是一个进程,IP层是一个进程,TCP层是一个进程。这样的好处是网络协议的每一层都非常清晰,代码的调试和理解都非常容易。但是最大的坏处数据跨层传递时会引起上下文切换(context switch)。对于接收一个TCP segment要引起3次context switch(从网卡驱动程序到链路层进程,从链路层进程到ip层进程,从ip层进程到TCP进程)。通常对于操作系统来说,任务切换是要浪费时间的。过频的context swich是不可取的。

(2) TCP/IP协议栈在操作系统内核当中。应用程序通过操作系统的系统调用(system call)和协议栈来进行通讯。这样TCP/IP的协议栈就限定于特定的操作系统内核了。如windows就是这种方式。

(3) TCP/IP协议栈都在一个进程当中。这样TCP/IP协议栈就和操作系统内核分开了。而应用层程序既可以是单独的进程也可以驻留在TCP/IP进程中。如果应用程序是单独的进程可以通过操作系统的邮箱,消息队列等和TCP/IP进程进行通讯。

LwIP采用的是第三种的实现方式,更具体的,LwIP提供以下三种应用程序接口: (1)RAW API。应用程序直接调用TCP/IP协议栈中的回调函数,应用程序和协议栈代码集成在同一个任务中,这样相对于普通的BSD API来说,速度更快,内存消耗更少。LwIP的后两种API的实现也是基于RAW API。RAW API的缺点是编程较为复杂;

(2)正式的API。这种实现方式是在系统中单独建立了一个TCP/IP任务,由这个任务调用RAW API来处理网络通信,其它的网络任务都是利用消息机制与这个任务通信来收发数据。

5


LwIP协议栈的学习与应用docx- nxp-lpc.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:聚四氟乙烯的表面处理与粘接(hao)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: