kaiyun官方注册
您所在的位置: 首页> 嵌入式技术> 设计应用> LwIP在LPC23/24XX以太网MAC控制器上的移植与应用
LwIP在LPC23/24XX以太网MAC控制器上的移植与应用
2014年微型机与应用第19期
施纯启,吴景东
福州大学 数学与计算机科学学院,福建 福州 350108
摘要:针对嵌入式设备接入以太网的需求,搭建了基于LPC23/24XX微控制器和DM9161A器件的硬件平台,在对LPC23/24XX以太网MAC(介质访问控制层)控制器的特性进行分析的基础上,开发和移植LwIP协议栈的网络接口层和操作系统模拟层,实现了一个低成本嵌入式网络系统。通过对该系统进行TCP性能测试并在上面实现一个简单的WEB服务器,表明了该系统效率较高,具有实用价值。
Abstract:
Key words :

 摘 要: 针对嵌入式设备接入以太网的需求,搭建了基于LPC23/24XX微控制器和DM9161A器件的硬件平台,在对LPC23/24XX以太网MAC(介质访问控制层)控制器的特性进行分析的基础上,开发和移植LwIP协议栈的网络接口层和操作系统模拟层,实现了一个低成本嵌入式网络系统。通过对该系统进行TCP性能测试并在上面实现一个简单的WEB服务器,表明了该系统效率较高,具有实用价值。

 关键词: LPC23/24XX;DM9161A;LwIP;嵌入式网络技术

0 引言

  随着Internet的广泛应用和通信技术的飞速发展,越来越多的应用场合需要将嵌入式设备接入以太网。得益于微电子技术的进步,许多嵌入式控制芯片集成了以太网MAC控制器,NXP公司推出的LPC23/24XX系列微控制器便是其中的代表,该系列微控制器在嵌入式领域使用量大,应用范围广。LwIP轻量级TCP/IP协议栈是一套用于嵌入式网络系统的开放源码[1],具有较完整的TCP/IP功能,特别适合在资源紧张的微控制器上使用。本文以LPC23/24XX系列微控制器和DM9161A以太网PHY器件为硬件基础,根据LPC23/24XX以太网MAC控制器的特性来移植LwIP协议栈,实现一个低成本的嵌入式网络系统。

1 系统硬件设计

  LPC23/24XX系列微控制器使用了一个可在72 MHz频率下运行的ARM7内核,包含1个10/100 Mb/s以太网模块,该模块位于独立的AHB总线上,有16 KB的SRAM和DMA控制器[2]。本文采用该系列中的LPC2378进行实验。

  DM9161A是目前常见的一款低成本物理层收发器,在以太网PHY层使用,通过介质无关接口MII或简化介质无关接口RMII连接到以太网MAC层[3]。DM9161A的接线图如图1所示。

001.jpg

  LPC2378微控制器的以太网模块通过10个引脚与DM9161A相连,如图2所示。

002.jpg

2 LPC23/24XX以太网控制器结构与模块功能描述

  LPC23/24XX微控制器的以太网模块包含一个全功能的10/100 Mb/s以太网MAC控制器,通过配置DMA硬件来提高性能[4]。以太网模块通过操作控制寄存器组,实现半双工或全双工操作、流量控制、接收包过滤以及LAN上唤醒等各种功能,其结构如图3所示。

003.jpg

  MAC控制器通过RMII接口与DM9161A进行连接,RMII接口可以在几乎不修改代码的情况下兼容大部分PHY器件。以太网模块中的DMA管理器利用描述符数组和状态数组来工作。描述符和状态充当以太网硬件和驱动程序之间的接口,描述符用来设置对应缓冲区的首地址和控制信息,状态符存储着对应收发数据最新的状态信息。描述符数组和状态数组在逻辑上是一个环形队列结构,在接收和发送数据的过程中,它们会有3种不同的状态:空状态、部分满状态和满状态,如图4所示。

004.jpg

  对描述符数组的操作采用生产者/消费者模式,在接收过程中,以太网MAC控制器是生产者,RxProduceIndex寄存器为数组索引;驱动程序是消费者,RxConsumeIndex寄存器为数组索引。在发送过程中,驱动程序是生产者,TxProduceIndex寄存器为数组索引;MAC控制器是消费者,TxConsumeIndex寄存器为数组索引。描述符还有一个拥有者的属性,只有描述符的拥有者才能对它的值进行读写。驱动程序通过将TxProduceIndex/RxConsumeIndex寄存器加1,能够将描述符和状态的拥有权移交给MAC控制器。MAC控制器通过更新TxProduceIndex/RxConsumeIndex寄存器将描述符和状态的拥有权移交给驱动程序。

3 LwIP协议栈的移植

  LwIP协议栈的移植工作分两个部分,分别是网络接口层的实现和操作系统模拟层的移植。

3.1 网络接口层的实现

  LwIP源码给出了网络接口驱动程序的整体框架,用户需要自己完成的函数主要有3个[5],分别是:

  ⑴网络接口初始化函数low_level_init()。该函数用来对网络接口进行初始化,任何与初始化网络接口有关的操作都可以在该函数内实现。如对网络接口有关参数进行配置、完成网络芯片硬件上所需的初始化操作等。

  ⑵网络接口输入函数low_level_input()。该函数为到达的数据包分配pbuf,并将数据包从网络接口转移到pbuf链中。

  ⑶网络接口输出函数low_level_output()。该函数实现真正的数据包发送过程。当需要发送数据包时,数据包装载在事先已分配好的pbuf中,由该函数负责将数据包发送至指定的网络接口中。

  这3个函数的实现都与网络接口的硬件特性密切相关,其实就是相当于为以太网MAC控制器编写驱动程序。初始化函数low_level_init()对应的是控制器的初始化配置过程,输入函数low_level_input()对应的是控制器的数据接收过程,输出函数low_level_output()对应的是控制器的数据发送过程。下面只详细讨论以太网MAC控制器的初始化和数据接收过程,而数据发送过程与接收过程的实现相似,本文不进行详述。

 3.1.1 初始化过程

  驱动程序在初始化过程需要为DMA管理器分配描述符数组和状态数组。发送和接收功能都有各自的描述符和状态数组,这些数组的基址存放在TxDescriptor/TxStatus和RxDescriptor/RxStatus寄存器中。而描述符数组中描述符的数目需使用减1编码写入到TxDescriptorNumber/RxDescriptorNumber寄存器中,状态与描述符的数目相同。在初始化数组之后,需要为描述符分配帧缓冲区,描述符的Packet字段使用对应缓冲区的基址来填充,而其Size字段需要填入缓冲区的大小。缓冲区的大小根据具体情况而定,范围在1 B ~ 2 KB之间,缓冲区太小缓冲效果不明显,影响网络性能,太大则会占用太多的控制器存储空间。

 3.1.2 接收过程


005.jpg

  以图5为例,在初始化之后,这个例子中的描述符和状态数组长度为4,描述符数组的基址为0x7FE010EC,状态数组的基址为0x7FE011F8,每个描述符分配到的帧缓冲区大小为8 B。

  假设帧数据共有19 B,因为帧缓冲区大小为8 B,因此帧数据将存储在3个缓冲区中。在将最初的8 B帧数据写入1号缓冲区之后,接收DMA管理器将继续填充2号缓冲区。因为帧数据还没结束,1号缓冲区的状态中的LastFrag位应为0,RxSize字段应为7(8个字节,采用减1编码)。2号缓冲区的操作与1号缓冲区相同。在将最后3 B帧数据写入3号缓冲区之后,帧数据到达末尾,3号缓冲区状态应为:LastFrag=1,RxSize=2。

  依据前面提到的生产者/消费者操作模式,在上述例子中,当驱动程序没有将RxConsumeIndex加1时,接收DMA管理器不能读取新的描述符,因为描述符数组处于满状态。只有在驱动程序将接收数据传送给了LwIP主线程并且对RxConsumeIndex进行更新之后,DMA管理器才能继续读取描述符并接收数据。接收完一帧数据后,驱动程序将把3个缓冲区中的信息组成的完整帧数据封装为pbuf的形式,提交给协议栈内核进行处理。

3.2 操作系统模拟层的移植

  为了提高可移植性,LwIP协议栈源码并不实现操作系统中的具体操作,而是定义了协议栈与操作系统之间的接口函数,称之为操作系统模拟层。本文使用μC/OS-II开源实时操作系统来实现操作系统模拟层。

  操作系统模拟层主要实现以下4大功能:

  ⑴进程同步。此功能提供了多个进程之间的同步操作,可以使用信号量来实现这个功能。其结构和函数接口如表1所示。

006.jpg

  ⑵消息传递。提供了进程之间传递数据的功能,具体可以使用邮箱方法来传递。其结构和函数接口如表2所示。

007.jpg

  ⑶定时与超时处理。LwIP在初始化时会为协议栈进程注册多个定时与超时处理函数,当定时与超时事件发生时便会调用相应的函数进行处理,操作系统模拟层提供的接口函数能返回这些定时与超时事件的所在位置。其函数接口如表3所示。

008.jpg

  ⑷进程管理。对LwIP协议栈的进程进行管理和维护,主要指创建进程。具体结构和函数接口如表4所示。

  μC/OS-II操作系统中包含了关于邮箱、信号量和队列机制的操作函数,在这些函数的基础上进行简单的封装和修改,可以实现LwIP系统模拟层中邮箱与信号量的操作[6]。但需要注意的是LwIP和μC/OS-II对邮箱机制的实现不一样。在LwIP中,为了提高协议栈通信的效率,要求邮箱中能够存放多条消息,而μC/OS-II中的邮箱最多只能传递一条消息。所以这里采用μC/OS-II提供的队列操作函数,因为队列中可以存放多条消息。

  接下来要实现的是与等待超时相关的函数。协议栈的稳定运行需要设定多种内部定时器,如TCP定时器、ARP定时器等。

  最后,初始化协议栈时,系统要为内核创建一个主进程,这里可以对μC/OS-II的任务创建函数OSTaskCreate做简单的封装,便可以得到所需要的进程创建函数。

3.3 TCP性能测试

  移植工作完成后,为了测试TCP的性能,在系统上建立了一个简单的TCP回显服务器,接着利用网络性能测试工具Jperf进行TCP带宽测试,测试结果如图6所示。可以看出带宽稳定在3 342 kb/s左右。

009.jpg

4 嵌入式WEB服务器的实现

  为了验证系统的实用性,这里实现了一个简单的嵌入式WEB服务器,该WEB服务器可以响应来自浏览器的HTTP GET请求,并在发送请求的浏览器上显示请求页面。在PC上的浏览器中输入服务器的IP地址,测试结果如图7所示,表明该系统运行良好,具有实用价值。

010.jpg

5 结论

  本文介绍了一种采用集成以太网MAC的微控制器和外接PHY器件,实现嵌入式以太网接口的方案,并在上面完成了LwIP协议栈的移植与应用。本方案采用了较新的电子器件和计算机技术,具有高效率、兼容多种PHY器件、低成本与易于实现等优点,适合中低档的嵌入式设备接入以太网的应用领域。

参考文献

  [1] 肖乐,李兵,邱雅.一种高速嵌入式远程监控系统的研究与实现[J].微型机与应用,2010, 29(5):55-57.

  [2] LPC23XX User manual(Rev. 4.1)[EB/OL].[2012-9-05] http://www.nxp.com/documents.

  [3] 张东,胡荣贵,徐海. ARM7芯片W90N740以太网接口设计及驱动开发[J].微型机与应用,2010,29(10):18-21.

  [4] 扶文树,何军,陈国胜,等.LPC23xx的自适应以太网通信接口设计[J].单片机与嵌入式系统应用,2008(6):72-74.

  [5] 朱升林.嵌入式网络那些事:LwIP协议深度剖析与实战演练[M].北京:水利电力出版社,2012.

  [6] JLabrosse J.嵌入式实时操作系统μC/OS-II[M].邵贝贝,译.北京:北京航空航天大学出版社,2003.


此内容为AET网站原创,未经授权禁止转载。
Baidu
map