- UID
- 1023166
- 性别
- 男
- 来自
- 燕山大学
|
相关阅读:如何实现高性能的DSP处理(上)
Blackfin 的存储器体系
为了使第一部分的讨论更加透明化,现在对Blackfin的存储器结构加以描述。Blackfin的存储系统也提供一些“按钮”,以便开发者可以将其打开从而提高系统性能。我们将要讨论怎样才能最充分地利用这些“按钮”。
Blackfin有三级存储结构。第1级(L1)存储器离内核最近,其工作速率为处理器的内核时钟频率(Blackfin典型频率为600MHz),并为指令和数据提供单周期存取操作。典型的L1存储器可存储几十KB,还可根据SRAM 或 cache进行调配。
芯片內部的第2级(L2)存储器位于芯片内部但离处理器内核较远。对该存储器中指令和数据的访问可能要用几个周期。芯片內部L2级存储器容量一般为几百KB,典型的有128KB和256KB。
芯片外部L2级存储器位于芯片外部,因此所提供的存取操作也最为耗时。它工作频率为系统时钟,该时钟频率通常为133MHz。但是芯片外部L2级存储器容量往往很大,典型的有几百兆字节。
中断处理
大多数嵌入式系统都含有中断,因此适当地处理中断非常重要。一般需要了解两个问题:每个中断服务程序耗费多少时间,以及一个中断服务程序是否正在阻止其他关键代码的执行。如果系统支持中断嵌套,例如能够中断一个正在执行的低优先权的中断,就还有必要知道如何实现最好的嵌套中断。
在Blackfin中,如果一个中断正在执行,其他中断默认是关闭的。然而,开发者可以通过将正在运行的中断服务子程序(ISR)的返回地址存入堆栈中来激活一个更高优先权的中断(即嵌套中断)。中断嵌套保证了优先权高的中断不会被优先权低的中断阻止。为了使这一过程更加简单,ADI公司提供了一个“回调管理器”,它能保证中断被的及时响应,且不会被阻止优先权高的中断。与DMA优先权类似,Blackfin开发者也可以为中断指定优先权以满足开发需求。
存储器注意事项
首先讨论指令放置,也就是应该把写好的指令放在存储器的哪个地方?前面已经讨论过要尽可能地将程序代码放置在最快速运行的存储区中这一思想,当整个应用程序都能放置于内部存储器时,所有工作就变得十分简单。但遗憾的是,情况通常并非如此,很有可能要将程序代码配置在内部存储器和外部可通过缓存访问的存储器。
这一过程应如何入手处理呢?首先就是应该确定关键程序代码段的长度(以字节为单位),所谓“关键”,是指执行最频繁的程序代码子集。而利用软件仿真或程序代码评测工具是一个很好的办法,它可以确定哪部分程序代码执行最为频繁,这一部分程序代码应放入最快速的内部SRAM存储器(即L1存储器)。
ADI公司提供了一款名为PGO链接器的配置工具,可以实现该功能。该工具在VisualDSP++开发环境下运行,实现了链接时间配置导引优化(PGO)。它能将应用程序的运行配置与程序优化技术结合起来,从而得到最有效的代码布局(如图3)。程序代码被划分为越小的函数,该工具就越能灵活地将执行最频繁的程序放在最快的存储器。一种极端情况是,如果你的程序代码只包含一个函数,且大小超出了内部存储器容量,该工具只能将整个模块都放在外部存储器。
当关键程序代码太大,不能完全配置到内部L1存储器时怎么办?某些处理器上还有片内L2存储器,虽然L2比L1存储器慢,但仍比外部存储器快得多。如果片内L2存储器可用,它就是关键程序代码的第二配置目的地。要是片内存储空间还不够用,就必须使用外部存储器,并将其定义为可高速缓存。
作为另一重要的存储器配置技术,如果你使用设置代码,比如执行一次性设置程序的库函数,你可能需要一个引导过程将该程序代码导入片内存储器,然后执行该程序代码,最后将你的应用程序载入并覆盖初始引导程序代码。这样将使在L1存储器中运行的程序代码数在稳定的应用中达到最大。
同样在一些操作系统中,如uClinux,整个操作系统和相应的应用程序都驻留在可高速缓存的外部存储器中。
如果可能,尽量将程序代码分配到一个没有用作其他用途的外部存储区,例如处理器连接到有四个内部存储块的DDRSDRAM,就可以选择一个存储区来专门存放程序代码。如果能确定大部分关键程序代码在内部SRAM存储区和(或)高速缓存中,那么你可以更加灵活地使用这种配置建议。如需测定cache的命中率是否足够,可以了解处理器提供的选项和工具套件。例如,VisualDSP++就在它的模拟环境中提供了一个Cache查看应用程序(如图2),而Blackfin处理器中同样有性能监控寄存器可用于计算命中率。
数据传送注意事项
现在将注意力转向数据传送。一般来讲,对需要按照精确时间间隔运行才可以维持系统的处理流的数据传输,采用基于寄存器的(“自动缓存”)DMA传输是最佳选择。基于描述符的DMA方式也可配置为类似自动缓存DMA操作方式,这对于音频和视频数据流需要同步输出的系统十分有用。描述符规定传输的是什么,以及数据的来源和/或目的地。如果可能,描述符应放入内部存储器,这样可在访问该信息时,DMA控制器读取的效率达到最高。
现考虑一个涉及像素解码及显示的视频应用。假定一个并行的视频端口提供时钟和数据驱动到LCD控制面板或视频解码器。每个数据帧都必须放置在存储器中,这样便于视频端口输出,DMA通道就可以从该存储缓冲区中及时读取数据,从而保持显示屏的完美显示。从处理器外部来看,如果DMA通道被拖延而视频端口的FIFO空闲,显示“毛刺”将会发生。主要因为没有可用的新数据时,旧的数据将被重复显示。但从处理器的角度来看,视频端口将出现下溢。当然,这种情况可以通过使能错误/状态中断而被检测出来。
对于一个视频显示系统,至少需要两个(通常会更多)缓冲区进行操作。理由有以下几点。首先,当向某一缓冲区写入数据时,同时视频端口可以从另一个缓存器读取数据进行显示。之所以称为“多个缓冲区”,是因为大量处理后的数据帧都将通过它发送出去。如果可能,应尽可能当数据还在L1存储器中时就完成对数据的所有处理,而且,也最好采用存储器到存储器的DMA传输通道将处理后的数据传送到外部存储器。
应该将视频缓冲区放在外部存储器的哪里呢?所有操作都有取舍,要视具体情况而定,但这里可以给出一个经验性方法:如果显示刷新率和像素处理率为系统中的最高速率,则应该将输入和输出缓冲区分别放在不同的外部DRAM存储区中,这样能保证在DRAM中页面的打开和关闭数达到最少。外部存储控制器能够跨越相互分离的存储区跟踪哪些行是打开的,因此,可以尽可能利用这一功能。如果显示的帧与帧之间没有多大变化,则可以将输入和输出缓冲区放在同一存储区中。
还有一点:如果一个系统中的视频附有音频同步,则尽量将声音源数据放入内部存储器(L1或片上L2存储器)中,这可以减少其与视频数据流在输入和输出外存储器时产生“拥挤”,从而避免外围设备出现欠运转或超负荷运转。 |
|