DSP

嵌入式系统程式设计重要抉择

2019-07-13 16:29发布

在当今的嵌入式多媒体应用中,系统控制(通常的MCU作用)和信号处理(通常的DSP作用)之间的交互性不断增强。现在推出的一种嵌入式媒体处理器能够同时处理MCU和DSP的任务,从而将那些熟悉用MCU方式进行应用开发的C程式师带入一个新的领域,其中对代码和资料流程的智慧管理会显着提高系统的性能。这对于採用“已经掌握”的编程方法和简单的使用指令高速缓冲记忆体(cache, 简称快取记忆体)和资料快取记忆体来管理这些资料流程的程式师很有吸引力。然而,对媒体处理器的高性能直接记忆体访问(DMA)能力应认真地考虑。因爲懂得在这些应用中对使用快取记忆体和DMA进行权衡将有助于更好地理解如何编程来优化系统。
 

  记忆体结构——对记忆体管理的要求

  当今的媒体处理器具有分级的记忆体结构,用来平衡几种不同容量和性能等级的记忆体。通常,离核心处理器最近的记忆体(称爲“1级”或“L1”记忆体)以全时钟速率工作,通常支援单时钟周期指令的运行。爲了高效地利用记忆体匯流排的带宽,L1记忆体一般分爲指令段和资料段。通常,该记忆体被配置成SRAM或快取记忆体。对于那些许可权最高的应用,在一个单时钟周期内就能够访问片内SRAM。对于要求较长代码的系统,则可以提供附加的片内和片外记忆体——同时增加了等待时间。

  这种层次结构本身作用有限。爲了适应仅配合低速外部记忆体的大部分应用,当今的高速处理器却以很低的速度降级使用。爲了提高性能,程式师可以人工地选择将关键代码移入或移出内部SRAM。另外,将资料快取记忆体和指令快取记忆体加入这种结构使程式师能够更方便地人工管理外部记忆体。快取记忆体减少了将指令和资料流程送入处理器内核的人工管理传送。这样程式师无需考虑如何把资料和指令流送入处理器内核,从而极大地简化了编程模式。
 

  指令记忆体管理——快取记忆体还是DMA?

  对嵌入式媒体处理器市场的快速调查表明,核心处理器的速度大于或等于600 MHz。尽管这种性能可以开闢许多新应用,但只有在从内部L1记忆体中读取代码时才能达到这种最高速度。当然,理想嵌入式处理器可以具有无限容量的L1记忆体,但这不切实际。因此,程式师在爲其实际系统优化记忆体和资料流程时,必须考虑几种可选方案以充分利用置于处理器内的L1记忆体。让我们来考虑一下其中的一些方案。

  第一种方案同时也是最直接的方案,目标应用代码可以完全放入L1指令记忆体。对于这种情况,程式师只需将应用代码直接映射到该记忆体空间,无需特殊操作。这就是爲什麽包含MCU和DSP两种功能的媒体处理器必然在这种体系架构支援的代码密度方面具有独特优势的原因。

  第二种方案,採用一种快取记忆体机构允许程式师访问更大容量、较低成本的外部记忆体。根据需要,这种快取记忆体可以作爲一种将代码自动送入L1指令记忆体的方法。这种方法的主要优点是程式师无需管理代码移入和移出快取记忆体。当执行线性代码时,这种方法达到最好的效果。当执行非线性代码时,快取记忆体线可能会被替换得太频繁,以致于不能提高即时性能。

  指令快取记忆体实际上具有两个作用。第一,它以更有效率的方式从外部记忆体中预取指令。第二,由于快取记忆体一般使用某种“最近使用的指令”的演算法,所以那些用得最频繁的指令往往就被保持在快取记忆体中。这样做很有好处,因爲存在L1快取记忆体中的指令能够在一个单时钟周期内完成,就像指令在L1 SRAM中一样。也就是说,如果该代码一旦被取走,并且还没有被覆盖,即准备在下一个指令周期执行该代码。


 
 
 

Figure 1: A simplified view of an embedded media processor illustrates the multiple pathways between L1 memory and larger, external memories. Code and data stored externally can be cached in L1, or blocks can be moved to L1 memory as an independent background process via the DMA controller.www.tydsyy.com  Peripherals that transmit and receive large data buffers can DMA them directly to external memory without involving L1 memory in the process.

 
 

  大多数严格的即时程式师一般不相信这种快取记忆体能带来最佳的系统性能。他们的理由是如果一系列指令在需要执行的时候却没有在快取记忆体内,将导致影响性能。採用快取记忆体锁定机构能弥补这个问题。一旦将关键的指令装入快取记忆体,快取记忆体线就被锁住,因此指令不会被覆盖。这样,程式师就能够在快取记忆体中保持他们所需指令,并且使该快取记忆体机构管理次要指令。

  最后一种方案,通过使用一个独立于处理器内核的DMA通道将代码移入或移出L1记忆体。当该处理器内核在记忆体的一个存储块运行时,该DMA将代码送入下一个存储块去执行。这种方案通常被称爲一种覆盖技术。

  虽然通过DMA将覆盖代码送入L1指令记忆体可以比快取记忆体方式提供更多的关键指令,但其代价是要增加程式师的工作量。换句话,程式师需要预先安排一种覆盖代码的方法和恰当地配置DMA通道。对于一种能够做有价值的额外管理程式的详细计划,这种性能仍然会提高。

 

  资料记忆体管理

  嵌入式媒体处理器的资料记忆体结构对于整个系统性能的重要性等同于指令时钟速度的重要性。因爲在多媒体应用中的任一时间经常会有多个资料传送任务同时进行,所以其匯流排结构必须支援内核和DMA对所有外部和内部记忆体块的访问。对DMA控制器和内核之间的冲突进行自动处理是非常关键的,否则性能将大大降低。首先要求在内核与DMA之间的建立DMA控制器,然后当要进行处理的资料已经准备时再应该回应中断。

  处理器通常作爲其一项基本功能执行资料读取操作。虽然这通常是传送资料效率最低的机构,但它是最简单的编程方式。小容量、快速方便的记忆体有时可以用来作爲L1资料记忆体的一部分,但对于较大容量、片外缓冲器,如果内核要从外部记忆体读取所有资料,那麽访问时间就长得难以忍受。内核不仅要花掉多个时钟周期去取资料,而且它要花很多时间忙于读取资料。在多媒体和其他大量资料操作应用中,要不断地将大量资料存储移入或移出SDRAM,内核的读取资料操作是无法应付这种情况的。虽然内核的读取资料操作总是需要的,但爲了维持性能,一定要使用DMA或快取记忆体传送大量的资料。


 
 


 
  使用DMA管理资料

  为了在多媒体系统中有效地利用DMA,应该有足够多的DMA通道以充分支援处理器的週边电路,即可以同时传送一对以上的记忆体与DMA之间的资料流程。这一点很重要,因爲考虑到在外部记忆体和L1记忆体之间传送用于内核处理的资料块的同时,必然有一个原始的多媒体资料也会进入外部记忆体(通过高速週边设备)。进一步地,DMA引擎允许週边电路与外部记忆体之间的直接资料传送,而无需在L1记忆体内有一个“中间停留”,因此在大量资料演算法中可以节省外部资料传送。

  随着资料传输速率和性能要求的提高,设计工程师能随意对“系统性能调节”控制就变得非常关键。例如,优化DMA控制器以使每个时钟周期都可传送一个资料字。当向同一方向同时传送多个资料流程时(例如,从内部记忆体向外部记忆体传送全部资料),这通常是最有效的操纵控制器的方式,因爲这种方法可以防止DMA匯流排有空闲时间。


 
 

  但是当传送多个双向视频和音频资料流程时,必须使用“业务量控制”,以防止一个资料流程独佔匯流排。例如,如果DMA控制器总是把DMA匯流排连接到任何一个准备每次传送一个资料字的週边电路(例如,连接到一个SDRAM),一个,那麽总的资料吞吐率会降低。在这种情况中,几乎每一个时钟周期资料传送都改变一次方向,因此在SDRAM匯流排上与来回切换时间相关的等待时间将显着降低吞吐率。这样,具有一个通道可编程传送资料字长度的DMA控制器比那种具有固定传送长度的控制器有明显的优点。因爲每个DMA通道都可以将一个週边设备与外部或内部记忆体相连,所以它还具有的一个重要优点是它能自动地连接到一个能发出紧急匯流排请求的週边设备。

  另一个特性即二维DMA性能,具有几种系统级优点。第一,它允许以一种比较直观的处理顺序将资料放入记忆体。例如,亮度和 {MOD}度资料从一个图像感测器相继传来,但可将它们自动存入各自的记忆体缓冲块。二维DMA的交错和去交错功能在处理视频和图像资料之前节省了多余的记忆体匯流排传送。另外,通过有选择性地进行传送,即只选择需要的输入图像资料块而不是全部图像资料,二维DMA也能够使系统的资料带宽最小。

  其他的重要DMA特性包括爲满足当前的週边设备任务请求区分DMA通道优先等级的能力,以及爲匹配这些优先顺序设置相应的DMA中断的能力。这些功能有助于确保资料缓冲器不会因DMA忙于其他週边设备而溢出,并且它们还使程式设计工程师在每个DMA通道的资料流程通基础上优化整个系统性能时具有更大的自由度。

 
 

  因爲内部记忆体通常分爲几个子存储块,所以DMA控制器和内核同时存取向不同子存储块存放资料的操作均可在一个单时钟周期内完成。例如,当内核对一个子存储块的资料进行操作时,DMA可以向另一个子存储块存放新资料。在某些条件下,甚至可以同时访问同一个子存储块。当访问外部记忆体时,通常只有一个物理匯流排可用,该物理匯流排经常被同步和非同步记忆体所复用。
 

  关于资料快取记忆体

  当前的DMA控制器的灵活性是一把双刃剑。当在两个处理器之间读取一个大的C/C++应用程式时,程式师有时不愿意将DMA功能整合到已经存在的工作代码中。这时,资料快取记忆体就很有用了。通常,资料通过快取记忆体送入L1记忆体以便最快处理。这种资料快取记忆体非常吸引人,因爲它象一个小DMA一样工作,但涉及到程式师的工作量最小。

  因爲典型的快取记忆体线填充特性,所以当处理器对外部记忆体内的连续资料存放块进行操作时,资料快取记忆体就非常有用。这是因爲该快取记忆体不只存储当前正在被处理的立即资料,此外它还向与当前相邻的资料块内予取资料。换句话说,该快取记忆体机构假设当前处理的资料字是即将被处理的一个相邻资料块的一部分的可能性极大。对于多媒体图像、音频和视频流,这是一个合理的假设。

  由于资料缓冲器通常来自週边电路,所以对资料快取记忆体的操作并不总象对指令快取记忆体的操作那样容易。这是由于必须在非“监听”的快取记忆体中人工控制一致性。在使用这些快取记忆体准备对新资料进行任何读取之前都必须使该资料缓冲器无效。

  总之,在一个具体的多媒体系统中对指令和资料传送的最佳机构的选择应该是快取记忆体还是DMA没有一种简单的答案。不过,一旦开发工程师瞭解到这其中的权衡考虑,就能进入到一种“不偏不倚”的状态,从而将使系统性能达到最优化。(本文作者任职于ADI公司公司 Blackfin Blackfin应用组应用组)。