首页 理论教育三重缓冲存储器优化方案

三重缓冲存储器优化方案

【摘要】:所有相关的存储器转移将导致相当多的浪费。基于帧的实时处理中更有效的办法是应用一个著名的叫作“三重缓冲”的方法。图6.4 三重缓冲存储器说明最简单的三重缓存的使用方法是用一个输入中断服务程序和一个输出中断服务程序,这与我们编写的基于采样的处理是一样的。中断服务程序另一个典型的应用是检查处理缓存中的数据是否完成,或者是否发生了用户不知道的其他错误输出。

对基于帧的实时处理来说,在特定的时刻我们需要至少3个存储缓存器:1个用来装载新的采样帧数据,另1个用来装载正在被DSP处理的帧数据,最后1个用来装载已经处理完毕需要输出的帧数据。我们称它们为缓存A、缓存B和缓存C。然后让我们用通过系统一帧数据来说明这个基本的处理过程。来自于ADC的采样值将被强行存储到缓存器A中,然后复制缓存器A中的数据到缓存器B等待处理(释放缓存器A等待接收下一帧数据)。处理完毕的数据从缓存器B中复制到缓存器C中,然后缓存器C中的数据被发送到DAC等。但这种方法的效率非常低。所有相关的存储器转移将导致相当多的浪费。

基于帧的实时处理中更有效的办法是应用一个著名的叫作“三重缓冲”的方法。相应的方法叫作“乒乓缓存”,它使用4个缓存(2个输入,2个输出),我们关注的是相对于三重缓存它具有更高的效率。在这个方法中不需要存储器之间复制内容,我们要做的是定义3个指针,用于指向输入地址、处理地址和输出缓存地址。当输入缓存填满以后我们只改变指针代替缓存中内容的物理。最形象的方法是用图说明这个处理过程。图6.4所示为典型的指针更新顺序。我们可以把它看作是环形缓存(在本书第3章中首次进行了讨论),在这里旋转的是帧而不是采样值。

978-7-111-33881-9-Part01-175.jpg

图6.4 三重缓冲存储器说明

最简单的三重缓存的使用方法是用一个输入中断服务程序和一个输出中断服务程序,这与我们编写的基于采样的处理是一样的。输入中断服务程序把来自于ADC的采样值装载到输入缓存中,输出中断服务程序把输出缓存中的采样值发送到DAC,主程序无论运行什么算法都需要在处理缓存中进行,没有被中断服务程序所中断。两个中断服务程序之一(典型的是输入中断服务程序)必须对帧数据进行跟踪,当数据聚集满一帧时中断服务程序必须做出反应,并且设置一个标志以便主程序更新指针分配缓存。中断服务程序另一个典型的应用是检查处理缓存中的数据是否完成,或者是否发生了用户不知道的其他错误输出。

在这个方案中有一个小的变化,这就是只用一个中断服务程序执行数据的输入输出并跟踪帧的填充和处理状态,如前所述。这样使用可以稍微提高一点效率,但是却不合常规。为了让我们的代码容易理解,我们把输入输出函数分配到独立的中断服务程序中。