用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

DMA在实时图像处理中的应用

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:32:56
值由全局索引寄存器控制。全局索引寄存器含2个控制域,其中高16位为帧索引域(FRAME INDEX),其值为帧间的地址偏移量,也就是传输完1帧后的地址调整量;低16位为数据单元索引域(ELEMENT INDEX),其值的帧内地址偏移量,也就是每传输完1个数据单元的地址调整量。

3 几种典型的DMA操作及其应用

3.1 块移动

块移动能够将1块连续数据块从一个地址传输到另一个地址,通常用于将数据或程序从外部存储器移到内部存储器。这种块移动是最简单、最常见的DMA工作方式。例如,将1块1K连续的32位数据块从外存(0x02000000)移动至内存(0x80000000),如图1所示。
javascript:window.open(this.src);" style="cursor:pointer;"/>
    相关寄存器的值设置:

Primary control register =0x00000050

Transfer control register =0x00000400

Source control register =0x02000000

Destination control register =0x80000000

其中主控寄存器各控制域设置与意义如下:

DST RELOAD =00 无目标地址重载

SRC RELOAD =00 无源地址重载

EMOD =0

FS =0 无帧同步

TCINT =1 允许中断

PRI =1 DMA优先

WSYNC =00000 无读同步

RSYNC =000 无写同步

RSYNC =00 无写同步

FRAME COUNT =0X000

ELEMENT COUNT =0X0400

INDEX =0 全局计数重载寄存器A

CNT RELOAD =0 全局计数重载寄存器A

SPLIT =00 无分裂地址

ESIZE =00 数据单元4BYTES

DSTDIR =11 索引寄存器方式

SRCDIR =01 地址递增

STATUS =00此位只读

START =00 DMA停止

在主控寄存器的START读中写入01b就可以开始DMA的传输。

3.2 数据重排

往往数据的格式并不符合运算的要求。在这种情况下,可以通过DMA进行数据重新排列,以满足运算的要求。数据重排主要是利用DMA的帧传输方式。数据重排所必需的、最关键的一步是设置全局寄存器,所以,以下讨论的重点就是全局寄存器的设置。

3.2.1 求矩阵转置

图2显示了将一个位于外存16bit的连续数据区,开始地址(0x02000000),数据重排并移至片内存储区,首地址为(0x80000000)前后的排列情况。
javascript:window.open(this.src);" style="cursor:pointer;"/>
    在数据重排中,主要是正确设置全局索引寄存器。在这里,可以将1帧看作1个数组,那么数据单元就是数组的元素。因此,如果假设共有F×E的矩阵,即有F帧数据,每帧E个数据单元,每个元素为S(Byte),重排为E×F的矩阵。在这种情况下,源地址递增,目标地址根据全局索引寄存器的值进行调整。在帧内相邻的数据单元传输时,目标地址偏移应为F×S,所以传输完1帧后的地址总偏称为(E-1)×F,因此,下一帧的第1个数据单元地址为在当前的地址减去((E-1)×F-1)×S。也就是说,

*FRAME INDEX应设为-((E-1)×F-1)×S

*ELEMENT INDEX应设为F×S

在上例中寄存器的设置为:

*FRAME INDEX =-((2-1) ×4-1) ×2=0xFFEE

*ELEMENT INDEX=4×2=8

因此,寄存器设置如下:

Primary control register =0x030001D0

Transfer control register =0x00040002

Source control register =0x02000000

Destination control register =0x80000000

Global index register A =0xFFFA0008

Global count reload A =0x00000002

3.2.2 取图像子图

图像处理中,往往要从图像中抠取一定大小的子图,然后对子图进行处理。对于大型图像,尺寸往往超过了DSP系统的片内存储器的大小,这种抠取的操作成了必不可少的步骤。这可以通过使用全局索引寄存器来完成。例如,从一个8×4的图像中抠取一个2×4的子图,如图3所示,其中每个数据单元为1Byte。
javascript:window.open(this.src);" style="cursor:pointer;"/>
    可以这样描述:有F1帧数据,每帧数据有E1个数据单元,每个数据单元为S(Byte);从中抠取部分为F2帧数据,每帧数据E2个数据单元,数据单元为S(Byte)。这种情况下,因为完成数据传输后,目标存储区为连续数据,因此目标地址递增;源地址根据全局索引寄存器的值进行调整。帧内相邻的数据单元传输时,源地址偏移应为S;当读完帧的最后一个数据单元,源地址指针跳过(E1-E2)个数据单元,即帧间的地址调整量为((E1-E1)+1)×S。这样全局寄存器的设置:

**FRAME INDEX =((8-4)+1×1=4

*ELEMENT INDEX=1

*FRAME COUNT =2

*ELEMENT INDEX=4

因此,寄存器设置如下:

Primary control register =0x03000270

Transfer control register =0x00020004

Source control register =0x02000000

Destination control register =0x80000000

Global index register A =0x00050001

Global reload register A =0x00000001

结束语

作为实时系统,选取合理有效的核心算法是至关重要的,同时,选择有效的数据传输方法也是不容忽视的。我们在实际工作中发现,在大多数情形下,数据传输所花费时间往往超过数据处理的时间,成为实时图像处理系统中的瓶颈。因此,合理使用DMA提高数据传输效率,是很有实际价值和意义的。



上一页  [1] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:19,203.13000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号