优化以太网控制器满足嵌入式联网需求
目前支持消费电子和其它市场的嵌入式系统需要更高级的网络连接能力。非PCI接口的以太网控制器为系统设计师的嵌入式连接方案提供了性能和架构选择的最佳结合。因此,非PCI接口的以太网控制器成为这些嵌入式设计中外设联网的标准解决方案。
一直以来,设计师在对非PCI总线的嵌入式系统增加以太网连接功能的时候面临多种挑战。这些常见的挑战包括:为现有的以太网控制器调整非标准的总线接口,满足TCP/IP数据包处理所要求的CPU带宽,使得由于外设和存储器接口结合带来的固有系统性能下降最小化。
为了更好地克服这些挑战,设计师必须寻求对传统的以太网控制器做出一些改变。其目的是在使用现有的嵌入式CPU的情况下得到一种能提高性能的嵌入式系统解决方案。下面让我们了解如何实现这个目标。
控制器设计基础
图1介绍了典型的嵌入式系统,其中采用了无PCI接口的嵌入式CPU和相关的存储器(SRAM、SDRAM和闪存)以及通过本地总线连接的外设(视频、USB和IDE控制器)。嵌入式CPU和操作系统的例子包括英特尔的XScale、瑞萨的SHx、松下及ST的芯片,这些芯片运行Linux、Windows CE、VxWorks和其它实时操作系统(RTOS)。
从操作系统或软件的角度来理解数据如何从嵌入式系统应用程序到以太网传输非常重要。图2显示了一种嵌入式系统软件结构的实现。软件结构分成应用程序、包含TCP/IP协议栈的操作系统和以太网控制器驱动程序。非PCI接口的以太网控制器通过本地总线与其软件驱动程序连接。
当应用程序通过网络发送数据或控制信息时,它与操作系统一起产生一个指向不同缓冲区的软件数据结构链表,以避免数据复制。此外,缓冲区还保存要放入以太网数据包的数据。每块缓冲区代表一个以太网数据包的一个不同的部分,由以太网控制器驱动程序将这些不同的部分组合起来进行传输。数据缓冲区不是相互邻近的,这意味着每块缓冲区的头和尾不在相同的线性地址空间内。
如图2所示,操作系统将“Tx Data Ptr”变量或软件指针传递到以太网控制器软件驱动程序。“Tx Data Ptr”具有描述符1的地址,描述符1指向描述符2,以此类推。这些描述符都指向数据缓冲区。然后,以太网控制器驱动程序通过本地总线将每一块数据缓冲区转移到以太网控制器。
接收操作按相反的顺序执行。这个过程需要大量软件参与,如果处理不当可能降低性能。同样重要的是不同的数据缓冲区可能没有在存储器中自然地排列,这对于整体的网络系统性能至关重要。
有限的选择
当前,采用以太网连接的消费电子设备只限于下面的三种选择:
1. 外部PCI以太网控制器——大多数嵌入式处理器不支持PCI总线,因此选择一个PCI以太网控制器通常就不可行。如表所示,根据市场研究表明,市场上8位或16位的CPU都不支持PCI,并且只有16%的32位CPU支持PCI,而大多数的嵌入式处理器支持一种本地/存储总线。嵌入式CPU制造商没有“拥抱”PCI是因为几方面的原因。其一是成本。用来实现PCI的额外I/O管脚和电路会增加嵌入式处理器的成本。嵌入式CPU需要一种存储器总线,而在很多情况下,这个总线是与其他外设共享的。因此,增加另外一种宽的并行总线来支持PCI外围设备并不现实。除此之外,通常在这些嵌入式系统中并不需要像即插即用这样的先进PCI功能。
2. 集成以太网。表显示了内部集成了以太网控制器的嵌入式CPU所占百分比。很明显,大多数嵌入式处理器并不支持集成的以太网控制器。
3. 外部的非PCI接口以太网控制器如图1所示,大多数嵌入式处理器支持一种非PCI的本地总线,而且不包含对内部以太网控制器的支持。
图1:支持非PCI以太网连接的典型嵌入式系统
图2:通过以太网发送应用数据
主要设计挑战
在为非PCI嵌入式CPU增加高性能以太网连接功能的挑战通常为那些传统上非PCI接口的以太网控制器所忽略。然而,通过考虑一定的架构改进,非PCI以太网控制器可以提供更高的性能,同时还解决成本和可靠性的问题。三个主要的挑战是缓冲区排列、总线架构以及流控制。下面将仔细地探讨这些问题。
1. 缓冲区排列
当以太网的帧数据存在于嵌入式CPU的系统存储器中的时候,就产生了以太网帧数据缓冲区的排列问题。以太网帧数据会被分割开来并分散到存储器的多个缓冲区中。每个缓冲区片段可以在帧上的任一字节排列上开始和结束,并且可能是任意长度。
未排列的数据对于传统的以太网控制器来说并不理想,因为传统的以太网控制器需要将发送数据以32位排列的形式提交给控制器。因为数据可能以未排列整齐的片断形式到达驱动程序,驱动程序必须用CPU来收集分散的片断,并在写入以太网控制器之前对数据进行重新排列。这个过程的效率很低,因为必须从系统的存储器中读取数据、重新排列并写入到以太网控制器。相比从系统存储器中读取数据并直接写入到以太网控制器,这个过程至少要三步。
最糟糕的负面影响是与直接存储器访问(DMA)控制器不兼容。传统上,在嵌入式CPU中的DMA控制器不能执行数据的重新排列,这使得它们不能在系统中移动以太网数据。数据移动和重新排列的任务就落到了嵌入式CPU上,其所占用的MIPS本来可以在其它应用中得到更好的利用。
理想的以太网控制器会自动地处理数据的重新排列。数据会以自然排列的形式传递,以太网控制器将了解包的数据边界,然后以太网控制器在数据发送之前在内部透明地对数据进行重新排列。这种透明的重新排列通过缓冲区复制使嵌入式CPU从重新排列数据的任务中解放出来。现在系统就可以选择使用简单的DMA控制器来移动数据了。
表1:总线类型和对集成以太网控制器的支持
2. 总线架构
嵌入式CPU为了发送以太网数据包,需要将数据写入到以太网控制器中的缓存内。反之,对于接收以太网数据包,嵌入式CPU必须从以太网控制器的内部缓存中读出收到的数据。嵌入式CPU利用编程I/O(PIO)周期或DMA周期移动数据。
不管是使用PIO或DMA进行发送或者接收操作,数据都是通过嵌入式CPU的外部本地总线传送的。每次操作都需要花费时间,并且花费的时间越多,操作对系统整体性能影响就越大。关键问题是要使访问以太网控制器时间很短,以提高整个系统的速度。传统上,低性能的以太网控制器在读和写访问期间会迫使CPU处于等待状态,这等效于更长的读和写周期。在本地总线上增加更多的等待状态意味着CPU执行其它任务的时间更少,以及用于内部和外部设备的带宽更少。
其它一些不太明显的机制会导致额外的等待状态。例如,很多的传统以太网控制器需要很长的数据和地址建立时间。这可能需要额外的连接逻辑以及锁存器。在这种系统中,可能需要减少系统中每个器件的总线周期时间-包括存储器。
某些嵌入式CPU采用其它机制来减少外部本地总线上的处理时间。这种机制的一个实例是突发模式读处理。这种操作模式通常与DMA控制器有关,可以降低总线周期占用。在突发处理期间,控制信号被维持,在每次读操作时地址都改变。通常与PIO读相关的读周期之间的解除维持时间被消除。传统的以太网控制器不支持突发模式读。大多数嵌入式处理器本身支持SRAM类型的本地总线接口。因此优化以太网控制器以模拟SRAM存储器接口很有意义。这样做优势很明显。这种以太网控制器不仅为大多数嵌入式处理器提供一种无缝的接口,而且所有前面已经讨论过的特性都可以使用,比如快速的整体总线周期时间、最小的地址和数据建立时间以及支持突发模式读取等。
3. 流控制
另外一种增加非PCI接口以太网控制器性能的方式是优化以太网流量情况。这可以通过支持以太网流控制实现。
以太网流控制容许以太网接收器减缓其对应的发送器的速度,这能够防止接收器缓存溢出。中断延迟或其它原因会导致嵌入式CPU无法跟上以太网数据接收的速度,这会导致接收缓存溢出。一旦出现溢出,接收到的数据便会丢失,从而导致严重的系统性能下降。
很多以太网设备使用一种“暂停控制”帧支持全双工流控制。暂停操作在规定的时间段内禁止发送数据帧。暂停操作由由一个暂停控制帧组成,这个帧包含全局分配的多播地址、暂停操作码以及指出数据禁止传输的持续时间的参数组成。当接收到包含预留的多播地址和暂停操作码的帧时,以太网设备就禁止在指定的时间段内传输数据。在半双工模式,反压(backpressure)用于流控制。以太网控制器通过“堵塞”接收数据和故意产生冲突来调节数据接收。在检测到冲突后,远端站点将停止发送数据。
理想的以太网控制器需要能检测其内部缓存空间,然后在没有处理器的干预下自动地发送一个暂停帧,或者发生堵塞。而且,设备应该能发送一个“零时间”的暂停帧,以在内部缓存有可用空间时重新发起数据传送。自动流控制通过减少处理器中断次数和开销提高了系统的整体性能。恰当地实现流控制还能避免网络两端的接收缓存溢出。
本文小结
消费电子设备、娱乐音视频设备以及传统的家庭网络设备(例如PC和打印机)正在向一个网络融合,很明显以太网成为家庭中实现连接的网络选择。在很多情况下,关于可以选择哪种嵌入式CPU用于消费电子或音视频设计,系统设计者的选择有限。因此,在不换用高成本的CPU方案的条件下,实现期望的性能水平的唯一办法是优化现有的非PCI接口以太网控制器。通过优化非PCI接口以太网控制器的架构,可以提高要求苛刻的应用的整体系统性能。
作者:Charlie Forni
工程总监,charles.forni@smsc.com
Paul Brant
高级首席系统架构师,paul.brant@smsc.com
SMSC公司
以太网控制器嵌入式 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)