LwIP

2024-09-17

LwIP(共6篇)

LwIP 篇1

引言

随着数字化时代的到来, 嵌入式技术迅猛发展, 嵌入式产品已经充斥于我们生活的各个角落。同时Internet技术也取得了巨大的发展, 网络已成为人们日常工作与生活中不可或缺的一部分。在这样的应用背景下, 嵌入式设备连接网络与外界通信, 实现信息共享成为人们当下的最大需求。

1 嵌入式协议栈的现状

要使得嵌入式设备与网络互连, 最关键的是要实现TCP/IP协议的精简。现在想要完全针对于嵌入式系统开发一个适用于它的精简协议栈是相当麻烦的一项工作, 既浪费财力又浪费人力。因为该协议栈的大量代码及其各种复杂情况, 会使得开发工作相当耗时耗力。但是现在的TCP/IP技术已经发展的特别成熟。有比较多的源代码公开并且适应于大部分操作系统的TCP/IP协议栈供我们在设计和学习的时候使用。

Lw IP (light weight IP) 是现在研究学习比较多的一个开放源代码的协议栈, 它是由Swedish Institute of Computer Science的Adam Dunkels等开发的一套用于嵌入式系统的TCP/IP协议栈。该协议栈在有操作系统或者无操作系统的环境下都可以运行, 并且支持多网络接口下的IP转发, 支持ICMP协议, 实验性扩展的UDP (User Datagram Protocol, 用户数据报协议) , 以及拥塞控制、RTT估算、快速恢复和快速转发的TCP (Transmission Control Protocol, 传输控制协议) , 还提供专门的内部回调接口 (Raw API) 使得应用程序的性能大大提高, 可选择的Berkeley接口API (多线程情况下) 在最新的版本中支持PPP, 新版本中增加了的IPfragment的支持, 支持DHCP协议, 动态分配IP地址。Lw IP协议栈由于它的可移植性在以后的嵌入式发展中将会得到研究人员更大的关注。

2 嵌入式系统调试现状

Lw IP协议栈是应用于嵌入式系统中的, 用来完成嵌入式设备与Internet的互联性质。嵌入式系统的厂商一般会考虑到嵌入式开发是一个系统的工程, 所以在推出系统的同时, 也着重于将开发环境作为重点推广。

他们在提供嵌入式硬件系统的时候, 也会相应地提供更为全面的硬件开发工具和支持的软件包。比如我们常见的Embedded VC++开发工具就是Window CE在主推系统时提供的, 还有Vxworks的Tonado开发环境, 以及Delta OS的Limda编译环境等, 都是嵌入式开发是一项系统工程的体现。

嵌入式系统的网络应用在前期的开发和调试的环境一般都是利用相应的开发调试工具连接于计算机和目标机进行的。例如经常被使用的开发工具Tornado就是针对于Vx Works嵌入式实时操作系统的, 它是一套效率高, 易上手的交叉开发工具, 让用户对目标机上的嵌入式应用程序的调试直接在计算机的图形界面上进行。但就是如此强大的、优秀的像Tornado这样的嵌入式开发环境, 在对比较大的程序如协议栈或者网络应用进行交叉调试时还是有些使不上力气的感觉, 用户的时间大部分消耗在了调试上而不是开发上, 使得整个系统的开发周期延长, 开发的难度加大, 工作进度停滞不前。

而且厂商推出的开发环境一般不好上手, 需要调试员有丰富的理论知识及实战经验。然而对于只想进行嵌入式系统软件开发和学习的人经常会出现以下问题:

虽然厂商一直在推出新的开发环境软件, 但是一般的学习人员会因为缺少经费, 缺少足够的硬件开发板和完备的软件开发环境, 而新推出的软件又不能快速上手, 缺乏全面的相关书籍资料的分析, 导致无法深入研究和开发嵌入式软件。

在嵌入式协议栈的研究和开发其上的应用程序的过程中, 研究人员的主要精力应该是放在高层次的软件开发和设计上, 不要因为直接处于具体的硬件环境中, 而去过多的考虑底层硬件的实现细节不能自拔, 这样是得不偿失的。假如又碰上硬件开发环境不太稳定 (这种情况经常见到) , 且对硬件不是很了解, 则可能在排除问题上花费大量不必要的时间。

想要深入了解这个协议, 学习该协议, 并开发其上的网络应用, 对于嵌入式系统来说, 调试和开发是相当的麻烦, 速度慢、效率低。对于只想学习该协议, 而且没有嵌入式系统设备的高校学习而言, 更是不能直观的展示该协议的工作过程。网络协议的学习是枯燥和抽象的, 但是借助于仿真系统, 就可以方便的、深入的理解该协议并且使用该协议。

软件仿真就是在我们普通的计算机上面模拟网络环境和工作过程。目前的软件网络仿真一般有两种方法来实现:

利用计算机语言自主开发仿真系统。针对于不同的研究内容, 使用vc++、java、delphi、umj或socket、winpcap等语言工具进行仿真开发。

借助已有的网络仿真软件进行仿真。例如经常被使用的开发工具Tornado就是针对于Vx Works嵌入式实时操作系统的, 它是一套效率高、易上手的交叉开发工具, 让用户对目标机上的嵌入式应用程序的调试直接在计算机的图形界面上进行。但是该软件一般比较昂贵, 而且使用者必须经过培训, 熟悉该软件的操作流程, 才能掌握。

由于嵌入式系统本身的资源有限, 调试工作相当费时费力。如果构建一个Lw IP协议栈的运行平台, 研究Lw IP原理及其源代码的实现, 可以很方便的开发和调试Lw IP协议栈及其之上的网络应用, 大大降低了开发的效率和周期。对于想要学习Lw IP但是又缺乏硬件设备的高校实验室, 也是一个很不错的方法。

3 结语

通过分析嵌入式网络调试的现状, 提出了解决在windows平台上构建调试应用的想法。

摘要:文章主要说明了LwIP协议栈在嵌入式系统中的应用及针对于lwIP协议栈开发的嵌入式网络应用存在的现状。通过分析嵌入式网络调试的现状, 得出网络协议栈和网络通信及其复杂性, 所以直接在嵌入式平台上调试程序有很多不便, 费时费力。而PC系统上的嵌入式调试环境要强大得多, 可以实现嵌入式代码的单步调试与跟踪。但现有PC调试器具有封闭性, 无法进行交互式测试, 因此在PC系统上调试嵌入式网络程序, 很不方便。

关键词:LwIP协议栈,pc系统,嵌入式平台

LwIP 篇2

关键词:嵌入式系统,LwIP协议栈,网络驱动

设计了一套基于Windows操作系统的Lw IP网络应用开发平台系统。用户可以更方便的开发和调试基于Lw IP协议栈的网络程序。

1 系统整体设计

系统包含的四个模块如下:(1)网络应用模块:提供可视化的参数配置和数据统计。(2)Lw IP协议栈模块:实现网络通信的核心模块。(3)网络驱动模块:与操作系统驱动适配,实现硬件级别的数据收发控制在图1中所示,居于中间的模块为Lw IP协议栈,是这个软件的核心部位,它通过与windows的系统接口连接,实现该软件在windows系统上的运行;在核心模块之上,是实现了基本的数据发送和接收的网络应用模块;置于最底层的模块是负责让协议栈与windows网络驱动互相适配的数据驱动模块,主要功能是通过windows设备驱动将该Lw IP协议栈构造的报文发送到网络,并将WINDOWS设备驱动收到的报文递交给Lw IP协议栈处理。

2 网络应用子模块

网络应用模块的设计目标是,基于Lw IP协议栈提供的三种调用模式,提供了可视化的网络应用配置和操作界面。通过应用子模块,用户可以直观的配置并查看网络程序的运行状况;通过查看源代码,用户也可以获得直接的可参考的Lw IP网络程序代码示例。

主界面使用MFC开发,包含参数配置区和数据统计区。参数配置区提供了实现网络通信需要的参数选项;数据统计区则提供数据传输统计,方便进行传输性能测试与对比。

3 Lw IP协议栈子模块

这个系统软件是搭建在windows平台上的,这个软件的核心部分就是Lw IP协议栈。所以最重要的自然就是如何将该协议栈移植于windows操作系统中。因为嵌入式系统操作系统和windows操作系统是由很大的不同的,所以在移植中,如果想要确保移植后的lwip顺利运行并且执行命令,必须注意以下关键点:(1)内存:因为我们最终目的是将在windows平台上调试好的lwip网络应用移植到嵌入式系统中去运动,但是由于windows操作系统和嵌入式系统的内存配置是不同的,所以如果不考虑内存限制,则会在后面的嵌入式调试中出现各种问题,所以在windows平台下的需要为内存调试预留一定条件,必须对lwip内存的相关接口和参数配置进行强调和注意。(2)线程:进程和线程在windows系统中存在,所以我们要考虑该协议栈在这种多线程运行下的共享变量问题,需要将windows的线程lwip的工作线程来适配的。对于如何记录和管理线程的参数需要专门来定义线程结构。(3)通知与保护:因为该协议栈支持多线程,所以我们必然要考虑线程之间的通信和全局变量的访问保护。而lwip提供了信号量,邮箱和临界区这三种不同的通知和保护机制。

4 网络驱动子模块

4.1 通信模块技术方案

主要内容:这个网络应用的开发最关键的部分就是如何让lwip协议栈网络通信,即解决如何接受和发送报文的这个问题。

该开发平台在网络应用子模块和lwip协议栈子模块完成之后,就表示我们已经实现了该协议和上层应用构造ip或以太网报文的功能。这个平台的核心是网络程序的测试,所以系统联网是必不可少的。主要就是让该协议栈构造的报文调动windows的网卡驱动往网络中传送数据,反之,windows的网卡驱动也能将收到的数据交付给lwip协议栈来处理分析。

winpcap是一个免费的代码可以随时查看的第三方网络操作库,用它来实现在windows网络设备上的操作是很方便的,因为winpcap基于windows平台专门有一组接口用于使用,只要能熟练应用这些接口,就可以轻松的实现对网络数据包的捕获和分析。

Win Pcap的层次结构是怎么样的呢?它主要由三部分构成:内核级数据包过滤器,底层的设备动态链接库(packet.dll),对WIN-DOWS系统的封装库(wpcap.dll)。因为winpcap也有两种难度不同的接口可以编程。一个是功能特别抽象但是庞大的基于libpcap的wpcap.dll,另一个则是功能简单的较底层的packet.dll。

4.2 通信模块设计

首先下载winpcap并且在windows平台上安装winpcap驱动软件,然后直接让winpcap操作网络适配器,完成收发数据包的作用。

由于本文的目的主要是实现以太网数据的收发。因为该平台对于winpcap提供的别的网络功能没用什么特别的要求,基于开发程序的省时省力性考虑,决定使用好用的libpcap接口。

5 结语

LwIP 篇3

Free RTOS具备良好的实时性、多任务功能, 可移植裁剪, 可灵活配置调度策略, RAM占用小, 对系统资源要求低。最重要的是Free RTOS完全开源免费, 而且移植方法简单, 在当前小型嵌入式操作系统市场使用率很高。Lw IP是由瑞典计算机学院开发的一个开源的轻量级TCP/IP协议栈。Lw IP的特点是在有无操作系统环境下都可以运行, 提供完备的API接口, RAM消耗低。本文基于市面上的网络转发模块, 进行Free RTOS操作系统和Lw IP协议栈的移植, 并在移植好的工程上测试DHCP服务器、TCP通讯功能等, 验证这种可靠实用的网络通讯解决方案。

1 硬件平台

本文采用的设备是一种能够将RS232串口数据转成网络数据的转发模块, 模块的单片机采用ARM架构的STM32F429芯片, STM32F429基于Cortex-M4架构, 具有浮点运算单元, 2MB容量的FLASH, 256KB的RAM, 系统时钟频率能达到180MHz, 外设丰富, 最主要的是它具有以太网MAC接口, 通过外接PHY芯片可以实现网络通讯功能。该模块的PHY芯片采用的是LAN8720, LAN8720是低功耗的10/100M以太网PHY芯片, 支持通过RMII接口与以太网MAC层通信, 内置10/100M全双工传输模块, 支持HP Auto-MDIX自动翻转功能。转发模块网络部分硬件连接图如图1所示。

2 移植Free RTOS操作系统

首先从官网下载Free RTOS-8.2.3版本源码;然后在已有的工程模板 (keil软件) 上创建Free RTOS相关文件夹, 添加源码文件到相应目录, 添加后的工程目录如图2所示, 红框内的文件就是添加的Free RTOS源码, Source目录下主要是任务调度、消息队列、定时器等操作系统基本功能的实现, Ports目录下是操作系统与处理器平台架构相关的接口文件, Port.c是支持Cortex-M4架构的, Heap_4.c是一种动态内存使用方法。

Free RTOSConfi g.h是操作系统的配置文件, 配置选项至关重要, 决定了系统的功能和性能。移植后主要的配置功能有:使能抢占式调度器;系统主频180MHz;系统时钟节拍1KHz, 即1ms;系统最大优先级号;定义堆大小, 用于动态内存申请, 任务栈;定义系统可以使用信号量。除此之外, 移植中需要注意的地方是要加入三个宏定义, 将STM32F429原本的SVC_Handler, Pend SV_Handler, Sys Tick_Handler中断函数定义为Free RTOS内部定义的三个函数, 因为Free RTOS对这三个系统中断有特殊的处理过程。至此, Free RTOS移植基本完成, 可以在后续软件工程中使用创建线程, 创建信号量、消息队列等API函数来实现任务间的调度和通信了。

3 移植Lw IP协议栈

首先从官网下载Lw IP-1.4.1源码, 然后在软件工程中添加Lw IP相关目录, 工程结构如图3所示。Lw IP_src目录下是Lw IP源码, 实现基本的Lw IP协议功能。Lw IP_port目录下的文件主要实现了Lw IP协议栈与系统的接口, ethernetif.c文件实现Lw IP协议和以太网驱动的接口, sys_arch.c文件 (位于arch目录下) 实现Lw IP协议和操作系统的接口。

ethernetif.c主要功能是初始化MAC相关工作环境、初始化DMA描述符链表。实现Lw IP最底层的发送和接收一帧数据的函数。

sys_arch.c文件包含了Lw IP要用到的必要的基于Free RTOS机制的函数, 主要有创建线程函数sys_thread_new, 创建信号量函数sys_sem_new, 创建邮箱函数sys_mbox_new等。这些函数需要对Free RTOS的API做简单的封装, 如sys_thread_new函数的本质是调用x Task Create来实现创建线程。

APP目录属于应用层的文件。netconf.c文件实现Lw IP协议栈的初始化并开启DHCP服务器, tcp_echoclient.c文件实现指定的通讯协议任务。

stm32f429_eth.c, stm32f429_phy.c由ST公司官方提供, 属于以太网标准库, 用于实现ETH外设的配置, 包括GPIO初始化, RMII、SMI接口初始化, MAC控制器工作环境配置, PHY状态获取等。

4 网络通讯测试

测试DHCP服务器软件流程如图4所示, 首先硬件初始化, 初始化系统时钟、GPIO引脚、以太网ETH模块、串口等;然后创建Free RTOS任务, 指定任务优先级, 栈大小;启动Free RTOS调度, 至此以后系统开始轮询调度任务。

在DHCP任务中首先执行Lw IP_Init函数初始化Lw IP协议栈, 设置ip地址、子网掩码、网关;添加以太网设备;设置以太网设备为默认网卡;启动网卡;设置链路回调函数, 用于获取链路状态。然后以250ms的周期查询DHCP的状态, 当DHCP状态为DHCP_START时, 启动DHCP功能, Lw IP会向DHCP服务器申请分配IP请求。当DHCP状态为DHCP_WAIT_ADDRESS时, 先判断IP地址是否为0, 如果不为0说明已经有IP地址, 将停止DHCP功能;如果IP地址总是为0, 就需要判断超时时间, 并响应超时错误。

使用网线把网络模块和电脑连入同一个路由器, 保证路由器可以提供DHCP服务器功能。打开串口调试助手, 为系统上电, 可以看到在使能DHCP功能后, 能够动态获取的IP地址, 用电脑ping这个地址可以ping通, 说明基于Free RTOS和Lw IP协议的DHCP功能调试成功。

TCP是一种可靠的、面向连接的通信协议, 建立连接时需要通过“三次握手”建立连接。本文基于Lw IP的socket编程接口实现TCP协议网络通讯, 电脑作为客户端, 网络模块作为服务器, TCP软件流程如图4所示, 初始化软件流程与DHCP相同, 区别是是创建的任务是TCP任务:创建socket套接字;调用bind函数绑定套接字的地址和端口号;调用listen函数监听客户端的连接请求;调用accept函数, 确立连接;通过recv、send函数接收发送数据, 与客户端通讯。在网络调试助手中确定客户端和服务器的IP和端口号, 输入一行内容, 可回显服务器的响应, 即将输入内容打印出来, 证明TCP通讯正常。

5 结语

在嵌入式操作系统和网络协议栈百花齐放的今天, 选择一种简单实用的网络通讯方式能够很大的提高产品的可靠性和质量。本文基于开源免费, 移植简单的Free RTOS和Lw IP协议栈, 为嵌入式设备提供一种新的实现网络通讯功能的设计流程, 具有一定的参考价值。

参考文献

[1]李少杰, 马晓辉.基于Free RTOS和Lw IP的SNTP设计[J].单片机与嵌入式系统应用, 2013 (09) .

[2]谢鹏程.基于STM32和Free RTOS的独立式运动控制器设计与研究[D].广州:华南理工大学, 2012 (05) .

LwIP 篇4

随着工业现场控制智能化的发展,以太网应用于工业控制方面得到了广泛的应用[1]。但由于在小型嵌入式终端上通过软件实现TCP/IP协议栈和小型的嵌入式系统,消耗了处理器大部分的资源和处理时间[2],使现场监控的实时性得不到足够的保证。

LWIP[3]是瑞士计算机科学院的Adam Dunkels等开发的嵌入式TCP / IP协议栈,这是一套既可以移植到操作系统上,也可以独立运行的轻型TCP/IP协议栈,在保持TCP协议的主要功能的基础上减少了对RAM的占用,适合在32位的低端嵌入式系统中应用。为此,在使用低端处理器的远程终端中研究和使用轻型TCP/IP就显得很重要,为了更好地解决实时性的问题,将通讯模块和实时控制模块分开也很有意义,这样提高了系统的实时性和扩展性。

1 系统架构

如图1所示,在远程监控项目中,远程监控室通过上位服务软件发送控制命令,通过Internet与现场以太网通讯模块建立连接,通过命令的解析和执行,以太网通讯模块与采集控制模块通过CAN总线,获取采集信息和分发控制命令,然后以太网通讯模块将采集器的数据,参数等有用信息,上传给上位服务器端。

系统的MCU采用ARM7内核的芯片LPC2136,该芯片具有256 K的FLASH,32 K的RAM,多种串行通讯接口。网络控制器采用的是Microchip公司的ENC28J60,符合IEEE 802. 3的全部规范,工作频率为25 MHz,有一个8 KB的缓冲器,分成单独的接收和发送缓冲空间。CAN总线采用的是Microchip公司推出的MCP2515,是具有SPI接口的独立CAN控制器。它完全支持CANV2. 0B技术规范,通信速率最高可达1 Mbps,它的SPI接口时钟频率最高可达10 MHz。本系统的硬件结构图见图1。

采集控制模块负责现场实时数据的采集和处理,以及所需控制逻辑的实时执行,然后将采集量的结果和控制逻辑的结果通过CAN总线上传给网络通讯模块。在网络通讯模块中,将开辟一个虚拟的设备状态缓冲,用于保存当前的采集控制模块的状态。网络通讯模块还可通过RS232总线和RS422总线与现场的智能设备通讯,响应上位服务器端的命令和请求,回复相应的数据。

2 系统软件设计

如图2所示,具体的工作可分为3个步骤:( 1)嵌入式操 作系统μCOS - Ⅱ和网络协议栈LWIP的移植工作。( 2 )ENC28J60的设备驱动开发。( 3) 网络上层端口服务程序的开发。

2. 1 软件平台的移植

系统软件平台的移植工作主要有两个方面: 一个是操作系统μCOS - II的移植[4],一个是协议栈LWIP的移植。LWIP协议栈把所有与硬件OS编译器相关的部份放在 /src/arch目录下,因此LWIP在μCOS - II上的实现就是修改这个目录下的文件。图3所示是LWIP在μCOS - II系统上的移植内容和步骤。

移植首先要修改/src/arch/include/arch目录下cc. h,cpu. h,perf. h中有一些与CPU或编译器相关的定义。同时要使用 _packed关键字声明结构体struct,便于LWIP读取pbuf结构体中不同长度的数据。

其次,LWIP要实现信号量的操作函数,主要有sys_sem_new( ) 创建一个信号量; sys_sem_signal( ) 发送信号量; sys_sem_free( ) 释放信号量; sys_arch_sem_wait( ) 等待信号量。这些进程间的通讯函数,只需要将μCOS - II的信号量操作函数封装到对应的LWIP信号量操作函数中即可。

LWIP为每一个与网络连接的线程都提供了超时属性,分配了sys_timeout数据结构,并把这个数据结构存在sys_timeouts链表中。线程在超过等待时间之后会调用sys_arch_timeouts( ) 函数,它的功能是返回当前任务指向定时事件链表的起始地址。

LWIP是可以单线程运行的,即只有一个tcpip_thread处理所有的tcp/udp连接,但是这种处理效率低下,程序的耦合性很大,编程复杂。这时就需要通过实现创建新线程的函数sys_thread_new( ) ,通过封装μCOS - II的API函数OSTask Create( ) 来实现新线程创建,但LWIP中的线程没有优先级的概念,所以在实现时需要预先为LWIP分配好优先级。

2. 2 ENC28J60 的设备驱动开发

LWIP协议栈已经做好了驱动的接口,并提供了一个驱动的模板ethernetif. c,驱动的移植主要就是完成ethernetif. c的函数的实现。在Lw IP中每个网络接口都对应了一个struct netif,这个netif含了相应网络接口的属性、收发函数以及中断处理函数。Lw IP调用netif方法netif - > input( ) 及netif - > output( ) 进行以太网packet的收、发等操作。

驱动程序工作在IP协议模型的网络接口层,它给IP层提供了ethernetif_init( ) 、ethernetif_input( ) 、ethernetif_output等接口函数,完成对网卡的初始化、接收、发送和中断处理等功能。如图4所示是LWIP的驱动接口数据流。

当网络芯片中断发生时,系统进中断处理函数,通过sys_sem_signal( ) 发送一个信号量,通知接收处理线程,接收处理线程通过low_level_input( ) 函数,调用pbuf_alloc申请获得pbuf的一段缓冲区,并调用EMACPacketReceive( ) 将ENC28J60的接收缓冲里面的包数据复制到buffer里面。最后返回pbuf的指针给ethernetif_input( ) 函数,ethernetif_input( ) 函数去识别数据包的类型是ARP包还是IP包,如果是IP包则更新ARP表,通过驱动接口netif - > input( ) 将数据传递给网络层。IP模块调用netif - > output( ) 函数,向以太网上发送一个数据包,函数要先通过IP地址获得硬件地址,然后发送数据包。

ethernetif_init ( ) 在建立网络接口时被调用,初始化底层接口,设置函数指针,并调用low_level_init( ) ,将MAC地址设置到netif - > hwaddr数组中,设置最大传输单元mtu的值,调用EMACInit( ) 函数,完成ENC28J60的芯片初始化。

3 网络上层端口服务程序的开发

LWIP提供三种API接口函数: ( 1 ) RAW API ( 2 ) LWIP API( 3) BSD API。对于多任务系统而言,因为LWIP采用的是将TCP / IP协议放在一个单独的线程里面,那个线程是tcpip_thread。采用RAW API回调技术,就得把应用层程序写在tcpip_thread这个线程里面[5],作为同一个任务运行。而采用LWIP API,就可以将TCP/IP协议和应用层程序放在不同的任务里面,通过调api_lib. c提供的函数,编写相应的应用层代码。

下面的程序是个简单的Websever的服务程序代码:

系统启动时,在LWIP的任务中初始化协议栈,配置网络接口,创建Http服务器任务,设置通讯模块的服务器端口为3000,IP地址为192. 168. 0. 88,设置PC的IP地址为192. 168. 0. 92,子网掩码为255. 255. 255. 0,默认网关为192. 168. 0. 1。在PC端命令行下输入ping 192. 168. 0. 88,能收到返回包,证明了ICMP协议正常。

Http服务器任务,使用netconn_new( ) 函数建立一个连接,用netconn_bind( ) 函数绑定IP地址和服务端口号,这个连接被绑定在80端口,netconn_listen( ) 函数进行监听,等待连接。netconn_accept( ) 函数,一直等待这个连接的信号量,一旦有连接进来,函数将返回netconn结构。netconn_recv( ) 函数获得连接的数据指针,并通过netbuf_data( ) 将data指向数据处,随后便可以对网络数据进行处理。当使用完毕后,使用netbuf_delete( ) 函数删除这个数据结构,最后使用完用netconn_close( ) 函数关闭这个连接。

开发过程中,可使用wireshark软件,捕捉两个IP地址间的数据帧,如图5所示。

4 结束语

本文在远程终端的小型化和模块化的需求下,设计了一个以ARM7 + ENC28J60的嵌入式终端,经实践证明:

( 1) 针对小型系统处理μCOS - II和LWIP消耗系统资源高,实时性差的特点,将系统分为通讯模块和实时采集与控制模块的方案是可行的,有效的解决了通讯慢和IO实时控制的矛盾,增加了终端的可扩展性。

( 2) 通讯模块采用移植μCOS - II和LWIP,满足了低档嵌入式设备接入以太网的需求,有推广价值。

摘要:针对远程监控系统中,终端的小型化和模块化的需求,设计了一个以ARM7+ENC28J60为核心的远程监控终端。分析了网络通讯服务和数据采集与逻辑控制的实时性问题,将系统分成了以太网转CAN的通讯模块和数据采集与控制模块两部分。模块间通过CAN总线通讯和扩展,通讯模块应用了实时操作系统μCOS-II,移植了LWIP轻型TCP/IP协议栈。实验证明,解决了以太网通讯和现场实时监控之间的矛盾,也符合嵌入式系统模块化设计的理念,易于扩展和修改。

LwIP 篇5

LWIP是瑞士科学院开发的用于嵌入式的TCP/IP协议栈, 是一种轻便型的TCP/IP协议栈, 整个代码占用内存空间小, 并且LWIP内核运行在同一个任务中, 避免了使用多个任务实现TCP/IP分层协议栈, 从而避免了任务的上下文切换, 极大地降低了整个代码的复杂性。LWIP还能够在裸机的环境中运行, 避免了使用操作系统移植LWIP的复杂性和工作量, 从而大大降低了LWIP的移植难度和成本, 具有很好的市场价值。目前, LWIP已经在工业网络中广泛使用。

LM3S8962具有内嵌的网口通讯功能, 标准的以太网格式通讯, 能够实现MAC链路层和PHY物理功能。因此, 本设计采用LM3S8962作为LWIP协议栈移植的硬件平台, 只要实现LWIP操作系统与LM3S8962硬件接口函数, 就能够实现LWIP在LM3S8962上的运行。

1 LWIP移植要点

LWIP的系统调用通过信号量或者邮箱与内核进行通信, 因此, 要在操作系统环境下移植LWIP, 就必须在操作系统中完成信号量或者邮箱传递的相关函数, 本设计在裸机环境下直接移植LWIP协议栈, 因此, 不需要编写LWIP信号量或者邮箱传递相关函数, 直接使用LWIP内核函数自带的信号量和邮箱函数即可。

LWIP在不带操作系统环境中移植必须完成以下2个关键函数: (1) cc.h (与硬件平台及编译器相关的环境变量及数据类型声明) ; (2) sys_arch.c (操作系统模拟层函数) 。

1.1 cc.h的编写

LWIP使用的数据类型主要有:u8_t、s8_t、u16_t、s16_t、u32_t、s32_t、mem_ptr_t, 这与LM3S8962硬件平台和keil编译器支持的数据类型不一致, 因此, 在cc.h中必须声明数据类型, 使得LWIP的数据类型能够与硬件平台和编译器的数据类型兼容。

在cc.h中还需要完成编译器与LWIP的结构体封装, 取消了LWIP代码在操作时的边界对齐问题, 保证了LWIP正常数据读取。我们只需要在cc.h中添加代码:

1.2 sys_arch.c的编写

sys_arch.c主要完成LWIP操作系统的模拟层编写, 主要完成4个函数的编写:LWIP_send () 、LWIP_rec () 、LWIP_init () 、LWIP_interruput () 。

LWIP_init () 是LWIP初始化函数, 主要完成LWIP的初始化, 在LWIP初始化完成之后, LWIP才能够在LM3S8962上正常的运行。LWIP中有一个函数netif_add () , 在这个函数加入LM3S8962网口初始化函数, 即可完成整个网口通信硬件的初始化。

LWIP_send () 是发送数据函数, LWIP数据发送函数必须按照以太网标准编写, 按照以太网数据标准格式发送LWIP传递的TCP/IP数据包。同样, 在LWIP_rec () 接收函数中也必须按照以太网标准格式解析TCP/IP数据包。

LWIP_interruput () 是LM3S8962以太网中断函数, 在LM3S8962网口接收和发送中断产生时调用该函数。

2 系统设计流程图

整个系统设计流程图如图1所示。首先, 对LM3S8962初始化, 主要完成系统启动文件的加载和PLL时钟的初始化。系统启动文件负责启动LM3S8962, 包含设置堆和栈的大小、设置中断向量表等;PLL时钟模块初始化主要是为整个硬件系统内核提供工作时钟, 同时, 网口工作时钟也由PLL时钟模块提供。网口和GPIO口初始化, GPIO口初始化是为了点亮网口工作指示灯, 网口的初始化包含:网口控制模块复位和使能、网口工作时钟配置、网口工作模式设置、设置IP地址、设置网关和设置子网掩码, 最后使能网口中断。LWIP初始化包含初始化LWIP协议栈、设置MAC地址、加入网口设置的IP地址、网关和子网掩码, 最后把底层硬件接口函数加入到LWIP操作系统模拟层中, 使整个LWIP协议栈能够在LM3S8962上运行。整个初始化过程完成, 开始等待侦听TCP连接。TCP通讯首先要在LWIP协议栈中建立一个TCP通讯的PCB, 即建立一个TCP通讯块, 然后将该TCP服务器绑定一个端口号, 用来分辨不同TCP进程与IP层的分用和复用关系, 然后就可以侦听TCP客户端的连接了。如果有TCP客户端申请连接, 则发送一个ACK握手信号, 等待对方返回握手成功信号, 这样就建立了一个TCP数据通讯通道, 可以开始TCP通道传输数据了。本设计测试是直接将PC发送过来的数据返回到PC上直接显示。

3 仿真结果与分析

本设计将LM3S8962设置为TCP服务器, IP地址为192.168.1.25, 端口号为60023。仿真结果如图2、图3所示。在图2的PC网络调试助手中, 首先将PC机上的网络调试助手设置好相关参数, 然后在网络调试助手的TCP发送区输入“TCP TEST IS PASS”, 点击发送, 然后, 可以看到在PC机网络调试助手的接收区接收到同样的字符串;同时, 在图3的LM3S8962数据接收memory调试界面截图中可以看到, 网络调试助手TCP发送区输入的字符串在0x20003180地址和0x20003190地址这2行中已经接收到, 说明整个TCP通讯成功, 表明LWIP移植成功。

4 结语

基于LWIP协议具有代码小, 能够在不带操作系统的裸机上运行的优点, 整个LWIP的移植只需要完成数据类型与硬件环境匹配、编译器环境匹配和操作系统模拟层与硬件环境模拟层函数的连接, 就能够实现LWIP成功运行。本设计是在LM3S8962上移植LWIP协议的, 完成了LM3S8962网口发送接收函数、初始化函数和中断函数与LWIP操作系统模拟层之间的连接, 并且完成了LWIP与LM3S8962之间数据类型的匹配, 实现了LWIP在LM3S8962上的移植, 最后使用LWIP协议成功实现了PC机与LM3S8962硬件板的TCP通讯, 整个设计正确、可靠, 并且具有很好的稳定性, 能够在现实的嵌入式产品中使用, 具有良好的市场前景。

摘要:针对LWIP协议具有代码小, 并且能够在不带操作系统的环境中直接运行的优点, 结合LM3S8962具有内嵌的网口通讯功能, 实现了LWIP协议在LM3S8962上的TCP通讯功能。实验结果证明, 所提出的方案稳定、可靠。

关键词:LWIP,LM3S8962,TCP/IP,TCP

参考文献

[1]张翠, 邓志良.LWIP协议栈在UC/OS‖上的移植和应用[J].微计算机信息, 2010 (26) :84~86

[2]李国辉, 范科峰.基于ARM+DM9000的TCP/IP协议的移植与实现[J].电子科技, 2008 (21) :66~69

[3]袁安富, 夏生凤.基于ARM和Li nux的DM9000网络接口设计及驱动实现[J].计算机工程与科学, 2011 (33) :27~31

LwIP 篇6

随着嵌入式系统和单片机技术的发展,嵌入式以太网的设计越来越受关注。美国贝尔实验室总裁Arun Netravali等一批科学家曾经作出了预测:未来"将会产生比PC 时代多出成百上千倍的瘦服务器和超级嵌入式瘦服务器,这些瘦服务器将与我们这个世界你能想象到的各种物理信息、生物信息相连接,通过Internet 自动地、实时地、方便地、简单地提供给需要这些信息的对象" [1]。 因此,研究和设计嵌入式网络通信将具有十分重要的价值。本文以LPC1768、DP83848CVVP芯片搭建硬件平台,构建以μC/OS-Ⅱ、LwIP为基础的软件系统,在此基础上实现web服务,从而达到通过浏览器对其进行访问的目的。

1 μC/OS-Ⅱ系统分析及移植

μC/OS-Ⅱ是由美国人Jean J.Labrosse编写的一个公开源代码的微内核嵌入式实时操作系统,其实时性能和内核的健壮性早已经在大量的实际应用中得到了证实。具有如下特点:①公开源代码,②移植性好,③可裁剪,④稳定性和可靠性高。

1.1 μC/OS-Ⅱ系统分析

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

1.2 μC/OS-Ⅱ移植

μC/OS-Ⅱ作为操作系统,全部源代码大约是6 000~7 000行,文件结构如图1所示,移植主要是处理与处理器相关的源文件,即os_cpu_c.c,os_cpu_a.s,os_cpu.h。其中os_cpu.h主要包含编译器相关的数据类型的定义、堆栈类型的定义以及几个宏定义和函数说明,为了便于移植,须重新定义数据类型,因为不同的编译器所提供的同一数据类型的数据长度并不相同。os_cpu_c.c文件中主要实现任务堆栈的初始化函数OSTaskStkInit(),任务创建函数通过调用函数OSTaskStkInit()初始化任务堆栈结构。在os_cpu_a.s文件中需要根据具体的硬件处理器实现几个汇编函数OSstartHighRdy()、OSCtxSw()、OSIntetxsw以及临界处理函数OS_CPU_SR_Save,OS_CPU_SR_Restore。尤其需要注意的是,由于LPC1768是cortex-m3内核,故OSCtxSw()、OSIntetxsw函数都是通过触发pendsv(可挂起中断服务)来完成,它负责μC/OS-II的全部上下文切换。

2 LPC1768的网络接口设计

由于LPC1768的以太网控制器只集成了介质访问控制器(MAC),缺少物理层(PHY),故本系统选用的PHY芯片为DP83848CVV芯片,由National Semiconductor公司生产,RJ45接口选用HanRun公司生产的HR911105A接口。DP83848CVV、HR911105A与LPC1768的硬件连接示意图如图2所示。1768的以太网模块使用RMII(简化的媒体独立接口)协议和片上MIIM(媒体独立接口管理)串行总线、MDIO(管理数据输入/输出)来实现与片外PHY之间的连接,MIMM接口可对PHY寄存器进行访问。RMII对应的引脚为ENET_TX_EN、ENET_TXD[1:0]、ENET_RXD_[1:0]、ENET_RX_ER、ENET_CRS、ENET_REF_CLK,接口MIMM对应的引脚为ENET_MDC、ENET_MDIO。需要注意的是使用DP83848CVV芯片的RMII模式必须外接50MHz的有源晶振。

3 LwIP介绍

LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。

3.1 LwIP协议栈的体系结构

LwIP的体系结构如图3所示,由图可知:LwIP由一些相对独立的模块组成,除TCP/IP协议的实现模块(IP、ICMP、UDP、TCP)外,还包括许多相关的支持模块,这些支持模块包括操作系统模拟层、缓冲与内存管理模块、网络接口函数以及一组Intemct校验和计算函数、API接口函数。

3.2 LwIP移植:实现操作系统模拟层

LwIP的操作系统模拟层(sys_arch)是底层操作系统和LwIP之间的一个接口,为LwIP提供信号量和邮箱2种进程间通信方式。当用户移植LwIP时,只需修改这个接口即可。主要实现以下几种类型的函数,分别是信号量操作函数、邮箱操作函数、临界保护函数、sys_thread_new()函数、sys_arch_timeouts()函数。由于μC/OS-II提供了创建任务函数、临界保护函数以及丰富的信号量和邮箱操作函数,所以只需对这些函数稍加修改,便可实现LwIP操作系统模拟层的函数。

3.3 LwIP协议栈的TCP通信流程

TCP属于传输层协议,它为应用层提供可靠的字节流服务,建立在TCP协议之上的应用层协议有HTTP等。本文采用的是HTTP协议。基本的TCP处理过程被分割为6个功能函数来实现:tcp_input()、tcp_process()、tcp_receive()、tcp_write、tcp_enqueue、tcp_output。实现框图如图4所示。

3.4 LwIP主线程tcpip_thread

主线程tcpip_thread是一个主控循环,底层接口函数通过tcpip_thread和lwip的内部函数进行通信,比如在进行tcp传输时,底层接口函数通过传递邮箱mbox的方式进入到tcpip_thread,然后在该函数中,进入tcp层的tcpip_input函数中,实现tcp层的传输。

3.5 LwIP API

LwIP API专为LwIP设计,所以它可以充分利用LwIP的内部结构以实现其设计目标,不需要在应用程序和协议栈之间复制数据,因此应用程序可以巧妙地直接处理内部缓冲区。LwIP API使用2种数据类型,分别为:①、netbuf,描述网络缓存的数据类型,对应的函数为netbuf_new()、netbuf_delete()、netbuf_alloc()等;②、netconn,描述网络连接的数据类型,对应的函数为netconn_new,netconn_delete()、netconn_bind,netconn_connect()、netconn_accept()等。LwIP的上层应用程序是基于LwIP API编写的。

4 HTTP协议

超文本传送协议(HTTP)是实现www的应用层协议,HTTP负责web服务器与web客户(浏览器)之间的实际超文本文档的传送。

4.1 HTML语言

网页就是一个HTML语法格式的纯文本文档,HTML是网络所基于的标准的格式化语言。HTML文档与网页在浏览器的显示并不相同,浏览器显示的是对HTML文档的解释。

4.2 HTTP报文格式

一个HTTP事物包含一个HTTP请求和一个HTTP应答报文,这两种报文都遵循一个通用结构,被称为HTTP报文格式,如图5所示。由图可知,请求行是HTTP请求报文的起始行,用于指示命令或客户要求服务器执行的动作、方法、要引用的资源以及客户使用的HTTP版本。该行格式如下: ,其中方法(method)告知服务器要执行的动作。方法的种类有"get"、"post"、"HEAD"等。本系统实现的是利用"get"请求向服务器提取网页。

5 系统实现

本系统的实现是通过在μC/OS-Ⅱ下建立的4个任务完成,分别是:① 起始任务task_start(),优先级为0,用于创建其他3个任务并进行LwIP、EMAC的初始化,执行之后被挂起,永不再执行;② 底层硬件接收任务ethernetif_input(),优先级为4;③ tcpip_thread()任务,优先级为1;④ http_server任务,优先级为10。任务②、③、④依靠μC/OS-Ⅱ下的信号量sem和邮箱mbox进入就绪态,否则被挂起。如图6所示:

当本系统上电时,由于此时浏览器并没有发送数据,网络接口没有数据,故没用中断发生,sem和mbox无法投递,所以此时这3个任务完全由μC/OS-II内核的系统定时器中断依据优先级而发生切换,程序流程如图7。tcpip_thread的优先级最高,tcpip_thread首先被运行,但由于没有邮箱被投递,故该任务随之被挂起,在内核调度的作用下,ethernetif_input()任务开始运行,同理,sem也没有投递,随之挂起,然后进入到http_server任务,随之也被挂起,此时系统进入空闲任务,等待中断的发生,即等待浏览器的访问。

web服务器的实现:

http_server任务是基于lwip API编程的,程序流程如图8所示,由图可以看出,在进入到netconn_accept函数时,等待邮箱accept_mbox的到来,否则被挂起。accept_mbox邮箱是在浏览器和服务器三次握手之后由accept_function()投递,此时程序进入netconn_recv()函数,等待recv_mbox的到来。recv_mbox的投递发生在数据被传至tcp层时,由recv_tcp函数投递的。一旦recv_mbox被post,则进入到netbuf_data()函数,用于获得接收数据指针,这个指针指向netbuf的第一个数据片段且这个片段包含HTTP请求,若是"get"请求,则发送网页,若不是则关闭连接,等待下一个连接到来。

6 结束语

本文详细介绍了利用LPC1768以太网控制模块,在μC/OS-II操作系统的基础上,移植LwIP协议栈,搭建嵌入式web服务器的过程。由于搭建的web服务器具有网页数据动态显示功能,可以满足一般的嵌入式设备进行远程监控,所以本系统实现对嵌入式设备的远程检测和控制具有很好的借鉴意义。

参考文献

[1]李纪栓.嵌入式INTERNET接入模块的设计[J].机械管理开发,2006,5.

[2]焦海波,刘健康.嵌入式网络系统设计-基于Atmel ARM7系列[M].北京:北京航空航天大学出版社,2008.4.

[3](美)JEAN J.LABROSSE.嵌入式实时操作系统μC/OS-II(第2版)[M].邵贝贝译.北京:北京航空航天大学出版社,2003.5.

[4]郑巨明,张和生,贾利民等.基于μC/OS II和LwIP的嵌入式以太网接口设计[J].计算机测量与控制,2009,17(11).

[5]熊海泉.μC/OS II下LwIP协议的移植实现[J].科技广场,2005.2.

【LwIP】推荐阅读:

上一篇:学生反馈问题下一篇:舞蹈与身心健康发展

本站热搜

    相关推荐