Blackfin533的DMA技术及其在图像处理中的应用
关键词:Blackfin533;DMA;实时图像处理;数据传输
直接存储器存取(Direct Memory Access,简称DMA?对计算机系统是非常重要的。它可以使CPU在运行指令的同时从外部存储器或设备中存取数据,也可以在CPU不参与的情况下,由专用的DMA控制器存取数据。
1 Blackfin533中的DMA
Blackfin系列DSP产品包括ADSP-BF535和ADSP-BF533/2/1两类,都是AD公司最新的基于微信号体系结构的DSP,这些器件含有两个MAC,并集成了大量的外围设备和存储器接口,每秒运算速度最高可达1200MMAC,因而比较适用于各种视频、音频、通信领域。
BF533处理器有多个独立的DMA控制器,它能以最小的处理器内核消耗支持数据的自动传输。DMA传输可以发生在BF533处理器的内存与支持DMA的任一外设之间。此外,DMA还可以完成有DMA功能的外设与连接在外部存储器接口上的外部设备(包括SDRAM控制器和异步存储控制器)之间数据传输。BF533处理器可利用DMA在存储器空间内部,以及在一个存储器空间和外围设备之间传输数据,并可以指定传输操作,以便完全集成化的DMA控制器独立于处理器完成数据传输时返回到正常的处理。
BF533处理器的DMA控制器同时支持1D和2D DMA传输,其DMA传输初始化可以通过寄存器状态描述符块中的一组参数来实现。2D DMA行和列最大可支持64k64k个元素任意数。而且列的步长可小于行的步长,并可执行交叉存取的数据流。这一个特点在某些视频应用场合特别有用。
Blackfin533有12个通道DMA控制器。有DMA功能的外设包括SPORTs、SPI、UART和PPI。每个支持DMA的外设至少有一个专用的DMA通道。DMA控制器可以完成的几种数据传输类型如下:
(1)存储器和存储器之间(MDMA);
(2)存储器和串行外设接口(SPI)之间;
(3)存储器和串行接口 (SPORT)之间;
(4)存储器和通用异步收发器UART接口之间;
(5)存储器和并行外设接口(PPI)之间;
BF533处理器上的DMA传输可以基于描述符,也可以基于寄存器。基于描述符的DMA传输需要用存放在存储器内的一组参数来初始化一个DMA序列。这种传输允许多个DMA序列链接在一起。在基于描述符的DMA操作中,一个DMA通道可以通过编程自动建立起来,并可在当前序列完成后开始另一个DMA传输。基于寄存器的DMA允许处理器直接对控制寄存器编程来启动一个DMA传输。传输完成后,为了连续传输数据,也可以用它们原来设置的值自动更新控制寄存器。
2 DMA在数字图像处理中的应用
DMA是数字信号处理器(DSP)中用于快速数据交换的重要技术,它具有独立于CPU的后台批量数据传输能力,能够满足实时图像处理中的高速数据传输要求。由于图像处理的原始数据量很大,同时图像处理中也会产生等量的中间数据,对于片内存储资源有限的高速DSP芯片来说,一般需要借用外部存储空间。为了提高系统的实时处理能力,可以将数据在不同存储空间的转移任务交给DMA来完成,从而使CPU只专注于数据的计算。同时DMA对数据的重排功能可以优化图像数据在内存中的存储,这不仅可以提高内部存储空间的利用效率,也可以提高数据的传输效率。虽然图像数据的传输也可由软件实现,但会消耗大量的CPU时钟周期,从而使DSP的高速性能难以发挥。而由DMA来进行同样的工作却不占用CPU的时钟周期。
BF533内部专门为适应视频数据处理而增加的二维DMA及相关寄存器有以下几种:
(1)配置寄存器(DMAx CONFIG/MDMA yy CONFIG)主要用来设置二维DMA方式使能和中断产生方式,其中中断可以在一行结束时产生,也可以在整个DMA结束时产生。
(2)内层循环计数寄存器(DMAx X COUNT/MDMA yy X COUNT)用于在二维DMA时保存内层循环的数目(或称行数),该数目必须大于等于2。
(3)内层循环地址增量寄存器(DMAx X MODI-FY/MDMA yy X MODIFY)用于在二维DMA时保存每一次内层循环计数器加1之后(也就是在内层每传输完一个元素,但不包括每个内层的最后一个元素),DMA操作(读或写)地址在内存中的增量,此增量应该是二维DMA操作的数据单元长度的整数倍,如二维DMA进行16位读写时,此增量必须是2N?N≠0?倍。
(4)外层循环计数寄存器(DMAx Y COUNT/MDMA yy Y COUNT):该寄存器仅在二维DMA中使用,任务是保存外层循环的数目(或称位列数)。
(5)外层循环地址增量寄存器(DMAx Y MODI-FY/MDMA yy Y MODIFY):该寄存器也仅在二维DMA中使用,任务是保存每次外层循环计数器加1后,DMA操作地址在内存中的增量,该值可以为负,且应为二维DMA操作数据单元长度的整数倍。3 应用举例
存储器的有效利用对系统设计者来说是需要着重考虑的问题。外部存储器比较昂贵,而且其存取时具有较长的延迟。为了克服上述问题,Blackfin处理器片上集成有SDRAM控制器,可支持片外存储器。因为视频数据率要求非常苛刻,帧缓冲区必须设立在外部存储器上。这样,当处理器操作一个缓存时,另一个缓存便可以存储通过PPI并用DMA传输的数据,见图1。
下例可将BF533的PPI接口上从图像采集芯片ADV7183传送过来的视频流中的一场视频图像(720288像素)存储到外部存储器SDRAM中。
具体程序代码如下:
Init_DMA() ?
{
*pDMA0 START ADDR = 0x0; //把图像存放在SDRAM中的起始地址//0x00000000处;
*pDMA0 X COUNT = 720; //图像的行数;
*pDMA0 X MODIFY = 0x4; //在内层每次传完一个元素后地址的增量,因为每次传输32位,所以是0x4?
*pDMA0 Y COUNT =72; //外层循环的数目,因为总的缓存为720288字节,所以288/4=72?
*pDMA0 Y MODIFY = 0x4; //传完一行数据后DMA的地址增量,因为是存储空间是连续的,所以是0x4?
*pDMA0 PERIPHERAL MAP = 0x0?
//外设PPI的DMA开启;
*pDMA0 CONFIG = DMAEN |DI EN|WNR|WDSIZE 32|RESTART|DMA2D|DI EN;
//使能DMA,整个DMA结束产生中断,存储器写。32位传输,重新开始前丢失FIFO中的数据。
}
当一个完整的图像帧存放在SDRAM后,数据将传输到内部L1数据存储器中,这样,处理器内核用一个时钟周期的延迟就可以访问到数据。为此,DMA控制器可以用二维传输获得像素块。图2所示是一个1616“宏块”的传输示意图。
图2
为了有效地从原图像中传输一个图像块,一般需要控制四个参数:X Count、Y Count、X Modify和Y Modify。其中X Count和Y Count分别表示水平和垂直方向上读入/读出的元素数。在此应用中“水平”和“垂直”是抽象的概念,因为图像数据在外存中实际上是线性存储的。另外两个参数X Modify和Y Modify是在传输了必需的X Count和Y Count后跨越的数据量。从性能上看,任何时候最多四个唯一的SDRAM内部子组(bank)都是活动的。这意味着在视频结构中,PPI填充一个子组(bank)时,2D到1D DMA只是把数据从一个子组(bank)拖进来,而没有额外的子组(bank)激活延迟。下面是一个2D到1D的DMA传输代码:
2Dto1D_DMA()
{
unsigned char *p;
p=0x0;
*pMDMA_D0_START_ADDR=p+L1buffer;
//L1buffer是L1缓冲区的地址
*pMDMA_D0_X_COUNT=64;
//1616/4=64;
*pMDMA_D0_X_MODIFY=4;
pMDMA_S0_START_ADDR =p+Sourcebuffer; //Sourcebuffer是1616图像块在SDRAM中的地址
*pMDMA_S0_X_COUNT=4;
*pMDMA_S0_X_MODIFY=4;
*pMDMA_S0_Y_COUNT=16;
*pMDMA_S0_Y_MODIFY=708;
// 720-16+4=708
*pMDMA_S0_CONFIG=WDSIZE32|DMAEN|DMA2D;
*pMDMA_D0_CONFIG=DI EN|WDSIZE32|WNR|DMAEN;
*pMDMA_D0_IRQ STATUS=0x1;
//消除中断;
4 BF533中DMA的使用注意事项
下面两种情况会导致DMA总线错误:
(1)数据没有对齐
当要传送的数据与当前地址不相符时,可能发生数据没有对齐的错误。数据不对齐包括有情况:第一是当DMA CONFIG 寄存器的WDSIZE为1(16bit)时,地址的最低位不等于0;第二是当WD-SIZE为2(32bit)时,最低两位地址不等于00。如果出现上述错误,IRQ寄存器中的位2应被置位。
(2)非法存储器访问
发生非法存储器访问时(如访问MMR空间),处理器将得到一个错误响应并导致以下结果:第一是DMA通道会结束当前的单个或突发式传送;第二是DMA信道的使能位(配置字的bit0)将被清零;第三是产生一个总线错误中断并使IRQ 状态寄存器中的位2被置位。
还有一点就是要保证对MDMA中MDMA_S0_CONFIG(MDMA S1 CONFIG?位的写入一定要在写入MDMA_D0_CONFIG(MDMA_D1_CONFIG)之前。
5 总结
一般情况下,图像处理系统的最大特点是运算数据量大,数据量往往大于片内存储器容量,所以必须借助DMA在片内高速存储区与片外低速存储区之间进行数据交换,以提高数据处理速度。多数情形下,数据传输所花的时间往往超过数据处理的时间。因此,合理使用DMA来提高数据传输率,可起到很好的作用。
评论