引言
LM3S9B96是德州仪器针对工业应用设计的Cortex—M3核的微控制器,应用领域包括远程监控、电子贩售机、测试和测量设备、网络设备和交换机、工厂自动化以及火警安防等。LM3S9B96的主频最高为80 MHz,性能可达100 DMIPS,其以太网控制器集成了媒体访问控制器和物理层接口,以太网控制器遵循IEEE 802.3规范,完全支持10BASE—T和100BASE—TX标准。
德州仪器为微控制器LM3S9B96提供了轻量级TCP/IP协议lwIP下的网络驱动程序,该驱动程序使用数据拷贝方式实现网络层与发送FIFO(TX FIFO)和接收FIFO(RX FIFO)之间的数据交换,效率低,无法满足高速网络通信的要求。文中详细描述了实时操作系统μC/OS—II环境下,基于微型直接存储器访问(Micro Direct Memory Access,μDMA)传输的LM3S9B96网络驱动程序的设计,以提高网络层与底层FIFO之间数据交换的效率,实现高速网络通信。
1 LM3S9B96的以太网控制器
LM3S9B96的以太网控制器包含媒体访问控制器(Media Access Controller,MAC)层和网络物理层(Network Physical,PHY)2个部分,如图1所示,以太网控制器内部结构如图2所示。
LM3S9B96的以太网控制器包含了网络物理层的自动交叉校验MDIX、自动协商、时钟参考、MAC LED控制、媒体独立接口(Media Indepen dent Interface,MII)寄存器组、发送编码、脉冲整形、时钟恢复、接收解码、载波感应和冲突检测等单元,用于实现10 BASE—T/100BA SETX的自动协商、MDI与MDIX校验、数据的编码发送和解码接收,以及网络接口指示灯的控制;也包含了MAC层的TX FIFO、RX FIFO、接收控制、发送控制、数据访问、独体媒体接口控制、定时器支持、MAC地址寄存器、中断控制等单元,用于实现MAC地址的设置、物理层MII寄存器组的设置、中断的产生和控制、网络层与MAC层FIFO之间数据的传输。
2 网络驱动程序的作用
网络驱动程序是网络层与物理层硬件的直接接口,它屏蔽了物理层硬件的细节,利用物理层硬件,为网络层提供了接收和发送数据的接口,如图3所示。
网络数据发送时,网络驱动程序从网络层接收数据包后,检查数据发送缓冲队列和TX FIFO是否为空,若均为空,程序会通过TX FIFO发送数据包;否则将数据包放入发送缓冲队列,等待TX FIFO为空时,网络中断触发数据发送。网络数据接收时,RX FIFO从物理层接收数据包后,触发网络接收中断,网络驱动程序从RX FIFO读取数据包,并交由网络层处理。
3 基于μDMA的网络驱动程序的设计
LM3S9896内置一个直接存储器访问(Direct Memory Access,DMA)控制器,称之为微型DMA(μDMA)控制器。μDMA控制器所提供的工作方式能够分载处理器参与的数据传输任务,从而更加高效地使用内核以及总线带宽。
LM3S9B96的以太网控制器支持μDMA功能,具有专用的μDMA通道,通过合理的编程配置,通过μDMA控制器,当需要时自动在网络控制器的TX FIFO、RXFIFO与存储器之间传输数据,使得以太网MAC具有更高的性能,并大大减轻LM3S9B96内核的数据传输负担。
LM3S9B96的μDMA网络驱动程序主要包含4个单元:初始化程序、数据包发送程序、数据包接收程序和中断处理程序。
3.1 初始化程序
网络驱动初始化程序主要用于初始化网络接口、设置μDMA参数和网络中断,具体工作如下:
①初始化网络接口结构体的各个参数,如网络接口名称、MAC地址、接口层发送函数地址等。
②设置MAC地址及其长度、最大传输单元大小、网络接口时钟。
③配置以太网控制器操作参数,此处需要使能双工传输、发送填充、自动CRC校验产生、多播数据接收等。
④使能μDMA单元并设置μDMA控制表基地址。
⑤禁止以太网发送通道μDMA,并设置该通道μDMA控制参数一一传输大小32位,源地址以32位大小自增,目标地址不增加,仲裁大小8位。
⑥禁止以太网接收通道μDMA,并设置该通道μDMA控制参数——传输大小32位,源地址不增加,目标地址以32位大小自增,仲裁大小8位。
⑦设置网络中断类型,并使能网络中断等功能,为了简化中断处理,此处仅使能网络接收和发送中断,禁止发送错误、接收错误、接收溢出等其他中断类型。
3.2 数据包发送程序
网络数据的发送,是在中断处理程序的协助下由网络数据包发送程序实现。
数据包发送程序主要包含2个函数:网络数据输出函数stellarisif_output()和网络数据传输函数stellarisif_transmit(),函数流程如图4(a)、(b)所示。
stellarisif_output()函数并不进行实际的数据发送,它只是将数据包放入缓冲队列,或者是调用网络数据传输函数进行数据发送。如图4(a)中标注,该函数需要注意:
①一个新的网络数据包,必须检查当前发送缓冲区是否为空。如果发送缓冲区不为空,即使TX FIFO为空,也要把待发送的网络数据包放入发送缓冲区,这样才能保证网络数据先进先出的发送次序。
②表明实际进行网络数据发送的是stellarisif_transmit()函数。
stellarisif_transmit()函数进行实际的网络数据发送,它以DMA方式复制网络数据到TX FIFO,标识中断处理程序设置网络发送标志,启动网络数据的物理层传输;或以内核执行拷贝方式复制网络数据到TX FIFO,并置位网络发送标志,启动网络数据的物理层传输。如图4(b)中标注,需要注意:
③由于以太网发送通道μDMA的传输大小被初始化32位(即传输数据宽度为4个字节),而μDMA传输要求源地址、目的地址必须按照传输数据宽度对齐。因此进行μDMA传输前,应首先判断数据的源地址(即被传输的净荷数据地址)是否为4字节边界对齐(以太网发送通道μDMA的目的地址为TX FIFO的地址,即0x40048010,已为4字节对齐,无需检查)。若为4字节地址对齐,才能进行μDMA数据传输,否则不能进行μDMA传输,只能进行由LM3S9B96内核执行的数据拷贝。需要说明的是,通过合理分配LWIP协议栈的堆内存、缓冲及待发送数据的地址,是可以保证净荷数据地址为4字节对齐的。
④设置μDMA通道为以太网发送通道,自动传输模式,源地址为净荷数据地址,目的地址为TX FIFO地址,传输长度(以传输数据宽度为单位,即以32位或4字节为单位,实际传输的字节总长度=传输长度x传输数据宽度)。
3.3 数据包接收程序
网络数据的接收,是在中断处理程序的协助下,由网络数据包接收程序(主要由网络数据接收函数stellarisif_receive()构成)实现。
stellarisif_receive()函数负责以μDMA或内核执行拷贝方式,从RX FIFO读取网络数据帧到接收缓冲区pbuf。其流程如图4(c)所示,该函数实现需要以下说明:
⑤即使分配接收缓冲区pbuf失败,也需要从RX FIFO中清空该数据帧,以免影响后续的数据帧接收。
⑥进行以太网接收通道的μDMA传输前,也需要检查接收缓冲区pbuf的地址是否为4字节边界对齐。在LWIP协议栈的堆内存、缓冲分配合理时,每次都以4字节整数倍的长度申请分配接收缓冲区pbuf,是能保证pbuf地址为4字节边界对齐的,从而实现每次网络数据接收都通过μDMA实现RX FIFO至pbuf数据拷贝,无需LM3S9B96内核参与。
⑦设置μDMA通道为以太网接收通道,自动传输模式,源地址为TX FIFO地址,目的地址为接收缓冲区pbuf地址,传输长度(以传输数据宽度为单位,即以32位或4字节为单位,实际传输的字节总长度=传输长度×传输数据宽度)。
⑧需要等待中断处理程序发送的网络接收μDMA传输结束信号量,成功获取该信号量,才能标志此次μDMA传输的结束。
3.4 中断处理程序
中断处理程序为lwIP协议栈处理以太网中断,从底层接收网络数据包,提交给上一层来处理,检查网络发送缓冲队列、通过以太网MAC层进行数据包发送。
中断处理程序主要包括2个部分:以太网中断服务程序lwIPEthernetIntHandler()和以太网中断任务lwIPInterruptTask(),流程如图5所示。
LM3S9B96的以太网中断产生时,内核自动跳转至中断向量表的57号处(LM3S9B96的以太网中断向量号),该处定义了“DCD lwIPEthernet IntHandler”,进而转入中断服务程序lwIPEthernetIntHandler()执行。如图5(a)中标注,此程序根据3种不同类型的中断源进行相应的处理:
①处理网络接收和发送中断。网络接收、发送中断产生后,程序释放一个网络中断服务信号量,以太网中断任务获取该信号量后,调用stellarisif_receive()函数读取数据帧,或调用stellarisif_transmit()函数发送数据帧。
②处理网络接收通道的μDMA中断。该中断产生,表明从RX FIFO至接收缓冲区pbuf的μDMA传输结束,此时应释放传输结束信号量,以解除stellarisif_receive()函数的传输结束等待。
③处理网络发送通道的μDMA中断。该中断产生,表明从发送缓冲区pbuf至TX FIFO的μDMA传输结束,此时应置位网络发送请求标志,启动网络数据的物理层传输。
lwIPinterruptTask()函数负责从RX FIFO读取网络数据帧,并提交上层协议处理;或者从发送缓冲队列读取并调用stellarisif_trans mit()函数发送网络数据帧,其流程如图5(b)所示,该函数实现也需要注意:
④以太网中断任务以阻塞模式等待网络中断服务信号量,直至网络接收或发送中断产生时,lwIPEthernetIntHandler()释放该信号量,任务才解除阻塞,开始执行网络数据帧的接收、发送操作。
⑤无论以太网中断源为接收中断,还是发送中断,以太网中断任务总是首先调用stellarisif_receive()函数读取网络数据帧(若成功读取数据帧,则提交上层协议处理),然后检查TXFIFO和网络发送缓冲队列,满足发送条件时,进行数据帧发送操作。此种处理方式,貌似没有对网络发送与接收中断进行有效地区分处理,但事实上,在同时处理大量网络数据的接收、发送时,具有极高的执行效率。
结语
本文针对德州仪器的微控制器LM3S9B96,提出了一种面向高速网络的、基于μDMA的网络驱动程序设计方案,该设计方案充分利用了LM3S 9B96的μDMA、网络中断等资源,大大提高了TCP/IP协议栈的网络层与底层FIFO之间数据交换的效率。实验测试表明,该网络驱动设计方案较之内核拷贝方式实现的网络驱动程序,通信效率提高了十余倍。
由于大多数德州仪器Cortex—M3核的微控制器的以太网控制器结构都非常相似,因此文中针对微控制器LM3S9B96提出的网络驱动程序设计方案,可适用于大多数德州仪器Cortex—M3核的微控制器的网络驱动程序设计。