|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
随着嵌入式多媒体应用的不断发展,系统控制和信号处理之间的交互性不断增强。最新的嵌入式多媒体处理器已能够同时处理MCU和DSP的任务,从而将那些熟悉用MCU方式进行应用开发的C程序员带入了一个新的领域。其中对代码和数据流的智能管理会显著提高系统的性能。然而,对多媒体处理器的高性能直接内存访问(DMA)能力应认真地考虑,懂得在这些应用中对使用高速缓存和DMA进行权衡将有助于更好地理解为优化系统如何编程。
存储器结构
——对存储器管理的要求
媒体处理器通过分级的存储器结构,来平衡几种不同容量和性能等级的存储器。离核心处理器最近的存储器(L1存储器)通常支持单时钟周期指令的运行,以全时钟速率工作。为了高效地利用存储器总线的带宽,L1存储器一般分为指令段和数据段,被配置成SRAM或高速缓存。对于那些权限最高的应用,在一个单时钟周期内就能够访问片内SRAM。对于要求较长代码的系统,则可以提供附加的片内和片外存储器——这会增加等待时间。
这种层次结构本身作用有限,为了适应仅配合低速外部存储器的大部分应用,高速处理器通常不得不以很低的速度降级使用。这时为了提高性能,程序员可以人工地选择将关键代码移入或移出内部SRAM。另外,还可以通过将数据高速缓存和指令高速缓存加入进这种结构,从而使程序员能够更方便地人工管理外部存储器。由于高速缓存减少了将指令和数据流送入处理器内核的人工管理,从而极大地简化了编程模式。
指令存储器管理
——高速缓存还是DMA
对嵌入式媒体处理器市场的调查表明,核心处理器的速度不低于600 MHz。尽管这种性能可以开辟许多新应用,但只有在从内部L1存储器中读取代码时才能达到这种最高速度。当然,理想嵌入式处理器可以具有无限容量的L1存储器,但这不切实际。因此,程序员在为其实际系统优化存储器和数据流时,必须考虑几种可选方案以充分利用置于处理器内的L1存储器。
第一种方案是目标应用代码可以完全放入L1指令存储器。对于这种情况,程序员只需将应用代码直接映射到该存储器空间,而无需特殊操作。这就是为什么包含MCU和DSP两种功能的媒体处理器必然在这种体系架构支持的代码密度方面具有独特优势的原因。
第二种方案是采用一种高速缓存机构允许程序员访问更大容量、较低成本的外部存储器。这种方法的主要优点是程序员无需管理代码移入和移出高速缓存。当执行线性代码时,能达到最好的效果;但当执行非线性代码时,高速缓存线可能会因替换频繁,而导致实时性能变差。
指令高速缓存实际上具有两个作用。第一,它以更有效率的方式从外部存储器中预取指令。第二,由于高速缓存一般使用某种“最近使用的指令”的算法,所以那些使用最频繁的指令往往被保持在高速缓存中。这样做很有好处,因为存在L1高速缓存中的指令能够在一个单时钟周期内完成。
大多数严格的实时程序员一般不相信这种高速缓存能带来最佳的系统性能。理由是如果一系列指令在需要执行时却没有在高速缓存内,将导致性能下降。采用高速缓存锁定机制能弥补这一问题,一旦将关键的指令装入高速缓存,高速缓存线就被锁住,因此指令不会被覆盖。这样,程序员就能够在高速缓存中保持他们所需的指令,而使该高速缓存机制来管理次要指令。
最后一种方案是通过使用一个独立于处理器内核的DMA通道将代码移入或移出L1存储器。当处理器内核在存储器的一个存储块运行时,该DMA将代码送入下一个存储块去执行。这种方案通常被称为一种覆盖技术。
虽然通过DMA将覆盖代码送入L1指令存储器可以比高速缓存方式提供更多的关键指令,但程序员需要预先安排一种覆盖代码的方法和恰当地配置DMA通道,这会显著增加程序员的工作量。
数据存储器管理
嵌入式媒体处理器的数据存储器结构对于整个系统性能的重要性等同于指令时钟速度的重要性。因为在多媒体应用中经常会有多个数据传送任务同时进行,所以其总线结构必须支持内核和DMA对所有外部和内部存储器块的访问。对DMA控制器和内核之间的冲突进行自动处理时,首先要求在内核与DMA之间建立DMA控制器,然后当要进行处理的数据已经准备好时,响应中断。
处理器的一项基本功能是执行数据读取操作。虽然这通常是传送数据效率最低的机制,但却是最简单的编程方式。小容量、快速方便的存储器有时可以用来作为L1数据存储器的一部分,但对于较大容量的片外缓冲器,如果内核要从外部存储器读取所有数据,那么访问时间就会太长。所以在多媒体和其它存在大量数据操作的应用中,要不断地将大量数据存储移入或移出SDRAM,虽然内核的读取数据操作总是需要的,但为了维持性能,必须要使用DMA或高速缓存来传送大量的数据。
使用DMA管理数据
为了在多媒体系统中有效地利用DMA,应该有足够多的DMA通道以充分支持处理器的外围电路,从而达到在存储器与DMA之间可以同时传送一对以上的数据流,这一点非常重要。同时,随着数据传输速率和性能要求的提高,设计工程师能随意对“系统性能调节”进行控制也变得非常关键。例如,通过优化DMA控制器使每个时钟周期都可传送一个数据字。当向同一方向同时传送多个数据流时,这通常是最有效的操纵控制器的方式,因为这种方法可以防止DMA总线有空闲时间。
但是当传送多个双向视频和音频数据流时,就必须使用“业务量控制”,以防止一个数据流独占总线。例如,如果DMA控制器总是把DMA总线连接到任何一个准备每次传送一个数据字的外围电路,那么总的数据吞吐率就会降低。在这种情况下,几乎每个时钟周期的数据传送都改变一次方向,因此在SDRAM总线上与来回切换时间相关的等待时间将显著降低吞吐率。此时,具有一个通道可编程传送数据字长度的DMA控制器比那种具有固定传送长度的控制器有明显的优势。因为每个DMA通道都可以将一个外围设备与外部或内部存储器相连。
DMA控制器的另一个特性是二维DMA性能。首先,这种性能允许以一种比较直观的处理顺序将数据放入存储器。其次,二维DMA的交错和去交错功能在处理视频和图像数据之前能减少存储器总线的传送时间。另外,通过有选择性地进行数据传送,即只选择需要的输入图像数据块而不是全部图像的数据,二维DMA还能够使系统的数据带宽降低到最小。
其它的DMA控制器特性还包括为满足当前的外围设备任务请求,区分DMA通道优先级的能力,以及为匹配这些优先级设置相应的DMA中断的能力。这些功能有助于确保数据缓冲器不会因DMA忙于其它外围设备而溢出,并且还使程序设计工程师在每个DMA通道的数据流通基础上优化整个系统性能时具有更大的自由度。
由于内部存储器通常分为几个子存储块,所以DMA控制器和内核同时访问时将会通过把数据存放在不同子存储块中而使整个操作在一个单时钟周期内完成。
数据高速缓存
DMA控制器的灵活性是一把双刃剑。当在两个处理器之间读取一个大的C/C++应用程序时,程序员有时不愿意将DMA功能整合到已有工作代码中,这时,往往是将数据通过高速缓存直接送入L1存储器以便最快处理。这种数据高速缓存的作用像一个小DMA一样,但涉及到程序员的工作量却大大减少。
由于高速缓存具有线填充特性,所以高速缓存不只存储当前正在被处理的数据,它还向与当前相邻的数据块内预取数据。这在对连续数据存放块进行操作时非常有用。这是因为对于多媒体图象、音频和视频流,这是一个合理的假设。
但是,由于数据缓冲器通常来自外围电路,所以对数据高速缓存的操作并不总象对指令高速缓存的操作那样容易。这是因为必须在非“**”的高速缓存中人工控制一致性。因此在使用这些高速缓存准备对新数据进行任何读取之前都必须使该数据缓冲器无效。 |
|