啥是DMA通道?

DMA(DirectMemoryAccess,直接内存存?。??顾名思义DMA功能就是让设备可以绕过处理器,直接由内存来读取资料 。打开硬盘的DMA模式将大幅度的提高硬盘系统的功能,使我们能更快更好的进行视频处理和文件传输 。打开刻录机的DMA选项,可以保障刻录品质,并降低刻录时的CPU占用率 。所以在我们首次连接好DVD刻录机,进入Windows系统后要做的第一件事情就是要确认DVD刻录机的DMA模式已打开 。
DMA控制器的DMA控制器的基本组成1 DMA概述
直接内存存?。―MA)对计算机系统是非常重要的 。它可以使CPU在运行指令的同时,系统能实现从外部存储器或设备中存取数据,也可以在CPU不参与的情况下 , 由专用的DMA设备存取数据 。
对于浮点DSP芯片来讲,DMA的作用更是重要 。众所周知,DSP芯片主要是面向实时的信号处理,其核心的运算部件具有很高的运算速度 , 常以MFLOPS(每秒百万次浮点运算)来衡量 。ADSP2106x为120MFLOPS,但该速度是以存储在芯片内部存储器中的程序和数据为前提的 。在DSP内部往往采用多总线的哈佛结构,数据总线和程序总线相互独立,即指令的存取和数据的存取并行不悖;另外在ADSP2106x内部还有各种接口总线,用以提高数据的流通能力 。但在芯片的外部,所有的总线都合并在一起了 。因此为了发挥DSP核心运算单元的高速运算能力,首先必须把程序和数据传输到芯片的内存中,这通常需要DMA操作来实现 。
另一方面,DSP系统总要与各种外部信号打交道,它从外部输入数字信号,经过各种算法的处理后,再输出给其他设备 。不仅如此 , 对于浮点DSP系统,数据的输入和输出常常是连续不断的 。试想,如果用DSP的核心部件来完成数据的输入和输出,它高速的运算能力又如何发挥得出来呢?所以,浮点系列的DSP芯片大都把DMA控制部分直接集成到了芯片上,用DMA来完成数据的输入和输出 。
高效的DSP系统通常采用图1所示的结构 。在内存中开辟出四块缓存区,两个作为输入缓存,两个作为输出缓存,用来实现输入、输出的乒乓切换 。核心处理单元直接从输入缓存中取数运算,然后把运算结果写入输出缓存;而数据从外部接口的输入和输出则完全由DMA来实现,不需核心处理单元的参与 。只要核心处理单元的运算速度和DMA的数据率满足要求 , 图1所示的结构就可以完成连续的数据流输入和输出 。当然,从外部看,数据的输入和输出是连续的,但在芯片内部却是分段处理的 。分段处理虽然带来一些误差,但只要缓存的数据足够长 , 就可以使误差降到允许的范围 。因为间隔越长,前后数据间的相关性越小,相互间的影响就越?。?故分段处理是可行的 。由于分段处理 , 也给DSP芯片的结构带来了一个重要影响,那就是尽可能地增加其内部存储器的容量 。对于ADSP21060,其内部的SRAM容量达4Mbit,可以满足大多数分段处理的需要 。
下面首先对ADSP2106x中的DMA做概要介绍,然后对几种典型的DMA操作进行详细分析 。
2 ADSP2106x中的DMA
ADSP2106x中的片内DMA控制器可以同时控制10个通道的DMA,完成下列类型的数据传输操作:
·内存?外存或外部存储器映射设备
·内存?其他ADSP2106x的内存
·内存?主机接口
·内存?串行口
·内存?link口
·内存?外部设备
·外存?外部设备
丰富的数据流向可以使ADSP2106x实现对各种外设的接口;另外,由于ADSP2106x的内存是双口SRAM,因此在进行上述DMA操作的同时,核心处理单元仍可以读写内存,使DMA操作与内部运算处理达到高度的并行性 。当然,应尽量避免二者同时对同一内存地址进行读写 。
每个DMA通道都有一个(或两个)用FIFO实现的数据缓存器,最大的缓冲深度为6级,用以提高DMA数据传输率 。所有的DMA数据传输都是通过这10个数据缓存器来完成的,这些缓存器如表1所示 。其中通道1、3、6、7都是两个缓存器共用一个DMA通道 。所有数据缓存器作为I/O寄存器被映射到内存的前256个地址中 。
DMA的编程是通过内部核心处理单元或外部主机对片内有关的I/O寄存器设置来实现的,这些I/O口寄存器也被映射到内存的前256个地址上 。与DMA操作有关的I/O寄存器除了前面的数据缓存器外,主要还包括:
·DMA控制寄存器:DMAC6~9,LCTL , STCTL0~1,SRCTL0~1 。
·地址-计数寄存器:II0~9,IM0~9,C0~9,EI6~9,EM6~9 , EC6~9 。
·链式操作指针寄存器:CP0~9 。
·二维操作寄存器(也可作DMA通用寄存器):GP0~9 , DA0~5,DB0~5 。
·DMA状态寄存器:DMASTAT 。
DMA设置传输过程一般如下:
(1)设置对应通道的地址-计数寄存器 。
(2)设置对应通道的DMA控制寄存器 , 并将其中的DMA使能位设为有效 。
(3)开始DMA数据传输 。
(4)DMA传输结束后,产生对应的中断,程序对中断进行处理 。
3 几种常用的DMA操作
在基于ADSP2106x的DSP系统的开发过程中,最常用到以下几种DMA操作:内存与外存、内存与主机、内存与外设、内存与link口间的数据交换 。
3.1 内存与外存间的DMA
内存与外存间的DMA传输可用DMA通道6~9这四个通道中的任一个 。这里用一个例子来说明 , 假如要把内存地址0x26000~0x263ff中的1024个数用DMA通道6传送到外存0x400000~4003ff中,可用下面的编程来实现:
/*设置内存地址-计数寄存器*/
R0=0x26000;
DM(II6)=R0;? /*设置内存起始地址*/
R0=1
DM(IM6)=R0;? /*设置内存地址增加值*/
R0=1024;?
DM(C6)=R0? /*设置内存读数次数*/
/*设置外存地址-计数寄存器*/
R0=0x400000;?
DM(E16)=R0;? /*设置外存起始地址*/
R0=1;
DM(EM6)=R0;? /*设置外存地址增加值*/
R0=1024;
DM(EC6)=R0; /*设置外存写数次数*/
R0=0x0205;?
DM(DMAC6)=R0;;/*设置DMA控制寄存器
DMAC6*/
/*设置为Master和从内存读数方
式 , 并使能DMA*/
/*DMA通道6开启DMA传数操作*/
这里需要说明两点:(1)I/O寄存器不能用立即数来直接赋值 , 而要通过通用寄存器R0~15或USTAT0~1来赋值;(2)在ADSP2106x中 , 由于数据的宽度有8、16、32和48几种方式,通过DMA传输时,内存和外部接口上的宽度可以不同,因此对应的读写次数可能不同 , 故内部计数器和外部计数器要分别设置 。
对于外部存储器映射设备,其接口地址是固定的,此时内存与该外设间DMA的编程更加简单 。比如某外设的地址设在0x400000,要把内存0x26000~0x263ff中的1024个数用DMA通道6传送到该外设接口上,只需把上面程序中的EM6设为0即可 。
3.2 内存与主机间的DMA
在ADSP2106x芯片上包含了一个主机(host)接口,可以使其方便地与通用16位或32位计算机相连接,此时,通用计算机就作为ADSP2106x的主机,它可对ADSP2106x的片内存储器进行访问 。通常情况下,为了减少主机对ADSP2106x寻址的地址线根数,以降低硬件复杂性,主机往往只对ADSP2106x的I/O寄存器(有256个)寻址 , 寻址的地址线只需8根?1? 。BittWare公司的ADSP2106xEZ-LAB开发板即采用了此种方式 。在这种情况下,主机与ADSP2106x内存间的数据交换大多是通过DMA完成的 。下面通过运行在微机上的一段C语言程序来说明 , 此时EZ-LAB板插入微机的ISA总线插槽上,微机作为ADSP2106x的主机,ADSP2106x的I/O寄存器可由微机通过ISA总线上的I/O口来访问 。该程序把数据d[1024]通过DMA通道6加载到ADSP2106x内存0x26000~0x263ff中 。具体程序如下:
#injclude"conio.h"
#include "def21060.h"
for(n=0;n<1024;n++)?
{outpw(DATA,d[n]); /*写数据d[n]*/
outpw(DATA,0);? /*高16位写0*/
}?
}
对以上程序需要说明的有两点:(1)ADSP2106x的地址线和数据线是通过ISA总线上两个I/O口地址(ADDR和DATA)来访问的;(2)ISA总线为16位,而ADSP2106x的I/O寄存器和内存的数据都为32位,因此微机要用高、低16位分别传输 , 同时把DMA6设置为16/32位模式 。关于EZ-LAB的详细情况可参见文献[1] 。
3.3 内存与外设间的DMA
对于某些外部设备,其输入或输出是与某个外部时钟同步的,而与ADSP2106x的读写时钟不相干 。当这样的设备与ADSP2106x接口时,通常的做法是在接口端加FIFO或双口RAM,把ADSP2106x的读写与该外设的输入或输出时钟隔离开来 。但ADSP2106x芯片本身提供了更灵活、更高效的方式,即DMA通道7和8的握手DMA方式(Handshake),可以完全省去FIFO或RAM , 其典型应用电路如图2所示 。
图中以8位数据线宽度为例,以DMA通道7为输出 , 对应的握手信号为DMAR1和DMAG1;以DMA通道8为输入,对应的握手信号为DMAR2和DMAG2 。整个电路只用到了最常用的74273和74374芯片,外设的读写时钟最高可达40MHz 。在这种握手DMA方式中,外设不占用ADSP2106x的外部地址总线 。关于上面电路的详细情况,在此不再赘述 。
下面给出设置握手DMA的对应程序 。这里假设要从外设2中输入1024个数据到内存0x26000~0x264ff中,则需对DMA通道8进行如下编程:
/*设置内存地址-计数寄存器*/
R0=0x26000;?
DM(II8)=R0;
/*第二片*/
r0=0X3f000;
dm(LCOM)=r0; /*把link口设为2x clock*/
r0=0xfff7f;
dm(LAR)=r0; /*link port5-->link buffer 2 , 对
应DMA通道4*/
r0=0x23000;
dm(II4)=r0; /*设置起始地址*/
r0=1024;
dm(C4)=r0; /*设置读数次数*/
r0=1;
dm(IM4)=r0; /*设置地址增加值*/
r0=0x300;
dm(LCTL)=r0; /*enable input DMA*/
对于上面的两段程序,应分别加载到两片ADSP2106x中 。需要说明的是:link Buffer 2对应DMA通道4 。如果把其他的link Buffer与link口5配对 , 则需设置与该Buffer对应的DMA通道 。
ADSP2106x中DMA操作功能强大,形式多样 , 除了本文所介绍的部分外,还有链式DMA、二维DMA等,因此要全部掌握并熟练应用是有一定难度的 。通过对各种DMA的应用 , 可以使数据进出芯片变得更加流畅 , 也可以使其核心处理单元的运算能力发挥到极致
一个DMA控制器 , 实际上是采用DMA方式的外围设备与系统总线之间的接口电路,这个接口电路是在中断接口的基础上再加DMA机构组成 。习惯上将DMA方式的接口电路称为DMA控制器 。
(1)内存地址计数器:用于存放内存中要交换的数据的地址 。在 DMA传送前,须通过程序将数据在内存中的起始位置(首地址)送到内存地址计数器 。而当 DMA 传送时,每交换一次数据,将地址计数器加“1”,从而以增量方式给出内存中要交换的一批数据的地址 。
(2)字计数器:用于记录传送数据块的长度(多少字数) 。其内容也是在数据传送之前由程序预置,交换的字数通常以补码形式表示 。在DMA传送时,每传送一个字,字计数器就加“1” 。当计数器溢出即最高位产生进位时,表示这批数据传送完毕,于是引起DMA控制器向CPU发出中断信号 。
(3)数据缓冲寄存器:用于暂存每次传送的数据(一个字) 。当输入时 , 由设备(如磁盘)送往数据缓冲寄存器,再由缓冲寄存器通过数据总线送到内存 。反之,输出时,由内存通过数据总线送到数据缓冲寄存器,然后再送到设备 。
(4)“DMA请求”标志:每当设备准备好一个数据字后给出一个控制信号,使“DMA
请求”标志置“1” 。该标志置位后向“控制/状态”逻辑发出DMA请求,后者又向CPU发出总线使用权的请求(HOLD),CPU响应此请求后发回响应信号HLDA,“控制/状态”逻辑接收此信号后发出DMA响应信号,使“DMA 请求”标志复位 , 为交换下一个字做好准备 。(5)“控制/状态”逻辑:由控制和时序电路以及状态标志等组成 , 用于修改内存地址计数器和字计数器,指定传送类型(输入或输出),并对“DMA请求”信号和CPU响应信号进行协调和同步 。
【啥是DMA通道?】
(6)中断机构:当字计数器溢出时,意味着一组数据交换完毕,由溢出信号触发中断机构,向CPU提出中断报告 。