鉴于现在市面上的嵌入式媒体处理器既可以处理MCU的工作也可以完成DSP的任务,非常熟悉MCU模型应用开发的C语言程序员正在转入一个新领域,在此领域中代码和数据流的智能管理可以显著改进系统性能。有必要仔细考虑媒体处理器的高性能直接存储器存取(DMA)功能。对在这些应用中是采用高速缓存还是采用DMA进行仔细权衡、折衷将有助于更好地理解系统最优化编程。
目前的媒体处理器具有分层化的存储器架构,力争使具有不同容量和性能水平的各个级别的存储器相平衡。一般来说,最靠近核心处理器的存储器(即“一级”或“L1”存储器)工作在全时钟频率下,通常支持单周期指令的执行。
充分利用L1存储器
一项对嵌入式媒体处理器市场的调查表明,核心处理器的工作速度达到600MHz或更高。尽管这种性能为许多新应用打开了大门,但只有在代码取自内部L1存储器时才能达到最高运行速度。当然,理想的嵌入式处理器也许会有无限数量的L1存储器,但这完全不切实际。因而,程序员必须考虑多种方式以便充分利用该处理器中存在的L1存储器,同时优化其特定系统的存储器和数据流程。让我们来考察一些情形:
第一种情形最简单,就是目标应用代码完全适合放进L1指令存储器。对于这种情况,不需要特别的行动,程序员只须把应用代码直接映射进该存储器空间。这就是提供MCU和DSP功能的媒体处理器为什么必须在架构级代码密度方面表现很突出的原因。
在第二种情形中,一种高速缓存机制被采用,以使程序员可以存取更大但更便宜的外部存储器。该高速缓存的一个作用就是可以根据需要自动把代码送进L1指令存储器。此过程的关键优点就是程序员不必管理进、出高速缓存器的代码流动。当正被执行的代码从本质上讲多少有点线性的话,这种方法最有效。对于非线性代码,高速缓存线也许会被更换的太频繁,以致于无法实现任何实质的性能改进。
大部分严格的实时程序员通常不会依赖高速缓存器来获得最好的系统性能。他们的理由是如果一组指令在需要执行时不在高速缓存器中,那么就会有一个显著的性能损失。利用高速缓存锁定机构有可能解决这个问题。一旦关键的指令装入高速缓存器,高速缓存线就可以被锁定,从而不能被更换。这给了程序员在高速缓存器中保存他们所需东西的能力,而且能使该高速缓存机构管理不太关键的指令。
在最后一种情形中,代码进、出L1存储器是靠一条独立于处理器内核的DMA通道实现的。当处理器内核正在对存储器的一部分操作时,DMA则在引入待执行的下一部分。这种方法通常叫做重叠技术。
尽管通过DMA实现进入L1指令存储器的重叠代码比高速缓存代码的确定性要高,但其代价是程序员参与的程度要增加。换句话说,程序员需要制订一个重叠策略并适当地配置相应的DMA通道。不过,良好规划带来的性能改善确实让程序员额外的参与工作物有所值。
数据存储器管理
因为在多媒体应用中,某一时刻常常会进行多重数据传输,所以总线结构必须既支持处理器内核又支持DMA存取全部内、外部存储器空间。
为了在多媒体系统中有效使用DMA,必须要有足够的DMA通道以便充分支持处理器的外设集, 要有超过一对的存储器DMA数据流。这是重要的一点,因为它考虑到注定有通过高速外设进入外部存储器的原始媒体流,与此同时,数据块还会往返于外部存储器和L1存储器之间以便内核进行处理。此外,DMA引擎允许外围电路和外部存储器之间进行直接数据传输,并不需要在L1存储器里“中转”,这节省了数字密集算法里额外的数据流通量。
随着数据率和性能要求的升高,设计人员拥有一些方便其处置的“系统性能调节”控制将变得非常重要。例如,DMA控制器可以优化到每个时钟周期传输一个数据字。当在同一个方向上有多条数据传输时,比如全都从内存向外存传数据,这通常是操作控制器的最有效方法,因为它避免了DMA总线上的空闲时间。
但对于涉及多重双向视频和音频流的情况,为了防止一条数据流完全占据DMA总线,必须要有“交通控制”。例如,如果DMA控制器总是把DMA总线交给准备传输一个数据字的任何外围器件,那么在连接SDRAM这样的器件时,总吞吐量就会下降。对于数据传输几乎在每个时钟周期都改变方向的情况,在SDRAM总线上与转向时间有关的延时将明显降低吞吐量。其结果就是,具有通道可编程突发长度的DMA控制器相比那些具有固定传输长度的DMA控制器,优势更加明显。因为每条DMA通道都可把一个外设连到内存或外存上,所以能够自动为发出紧急请求总线的外围器件服务也是很重要的。
目前DMA控制器具有的灵活性是一把双刃剑。当一个大的C/C++应用程序在处理器之间移植时,程序员有时会犹豫要不要把DMA功能集成到已在工作的代码之中。在这种情况下数据高速缓存器可以非常有用。一般来说,数据高速缓存器可用来把数据送进L1存储器以便进行最快速处理。数据高速缓存器是有吸引力的,因为它就像一个微型DMA,但它和程序员只有极少的互动。
鉴于典型高速缓存器线的填满本性,当处理器对外部存储器中连续的数据位置进行操作时,数据高速缓存器是非常有用的。这是因为高速缓存器不只是存当前正被处理的立即数据,而且它会预取靠近当前数据区里的数据。换句话说,高速缓存器机制假定存在这样一个好机会:当前数据字是将要处理的相邻数据块的一部分。对于多媒体图像、音频和视频流而言,这是一个合理的假定。
由于数据缓冲通常来自外围器件,操作数据高速缓存器不总像操作指令高速缓存器那样容易。这是鉴于这样一个事实:在非“识别”高速缓存器中必须人工管理互容性。对于这些高速缓存器来说,在试图存取任何新数据之前,数据缓冲肯定是无效的。
简而言之,对于一个特定的多媒体系统而言,到底该选高速缓存器还是DMA机制决不存在单一的答案。然而,一旦开发人员意识到所涉及的性能折衷问题,他们就很有可能选择一种“中间立场”,即系统所需的最佳点。
作者:David Katz,Rick Gentile
高级DSP应用工程师
Blackfin应用集团
ADI公司