您的位置 首页 分销

如何用C语言对DMA控制器编程?

摘要:详细地分析了PC/AT机系统的DMA(直接存储器存取)控制器结构及其传输方式,并给出了C语言编程实例。DMA是英文DiretMemorAccess的缩写,即直接存储

摘要:具体地剖析了PC/AT机体系的DMA(直接存储器存取)操控器结构及其传输办法,并给出了C言语编程实例。

DMA是英文DiretMemorAccess的缩写,即直接存储器存取,DMA传输是PC机与外设

高速数据交换的重要办法,其一个典型使用是使用于声卡的录放音进程中,录音时,CPU首要设置好声卡和DMA的传输参数。当发动DMA数据传输(即开端录音)后,即由DMA操控器DMAC)按管PC总线进行数据传输,每次传输完毕后,DMA操控器便偿还总线操控权,并恳求CPU中止,告之数据传输完毕,然后由中止服务程序将DMA数据缓冲区中数据取走并预备下次数据传输(即录音),因为在传输进程中无需CPU干沙,因而在录音期间CPU能够履行其它程序,这样既极大地提高了数据传输速度又提高了CPU的履行功率,正是因为DMA的这些长处,所以现在在工业操控范畴的数据收集进程中都大量地采用了DMA数据传输办法。可是,因为DMA编程的材料较少,因而DMA编程一直是硬件编程方面的一个难点,本文将以C言语为例具体介绍DMA编程办法。

1、PC/AT的DMA体系特色

PC/AT运用两片8237A-5芯片组成级连结构,每片8237A-5芯片内部有4个独立的通道,别离以通道O-通道7表明。但因为通道4被用作第0片和第1片的级连,因而PC/AT体系-总共能供给7个通道的DMA数据传输,在这7个通道中,除通道2作为软盘DMA传输服务,通道0留给SDIC通讯透配器外,其他通道0,1,3,5.6和7均留作扩大运用,在这7个DMA通道中,通道0~3按8位数据最大传输64KB规划;面通道5-7按16位数据最大传输64K字(128KB)规划,它们都支撑寻址16MB空间的才能。

2、DMA通道地址发生办法

8237A-5只能办理16位地址(AI5-A0),但为了寻址PC/AT机的24位地址空间寻址,在DMA体系中将PCAT机的16M空间分为多个物理页面,从面确保了在DMA周期内只需16位地址寻址,因而DMA体系中为每个通道设置了一个DMA页面寄存器,用以寄存此物理页面号。

关于8位传输通道0~3,因为芯片的地址运用字节鸿沟,即A15-A0为16位长的字节地址,因而每页64KB,而关于16位传输通道5-7,因为芯片的地址运用字鸿沟,即A16-AI(A0固定为0)为16位长的字地址,因而每页可达128KB,核算地址偏移和计数个数时特别应该性意两者差异,关于DOS办理下的1M惯例内存,页面分布图1所示:

从DMA通道地址发生办法,咱们能够看出DMA操控器仅能在-个物理页面内传输数据,因而当数据跨页面寄存时,咱们有必要分屡次对其进行数据传输,从面确保每次传输时数据都在同一页面内。


3、DMAI/O地址

DMA操控器(DMAC)共有16个端口地址和4个页面寄存器地址,共分为两大类:操控DMA状况及设置数据地址。

在设置DMA传输数据时,要用到3个端口,别离是:页面寄存器,地址(偏移)寄存器和数据计数器,表1给出了每个通道及其相应1/O口地址。


在操控DMAC的状况时,要用到别的3个端口,别离是:办法寄存器,屏蔽寄存器和铲除寄存器。

(1)办法寄存器(地址为0Bh或D6h,别离为8位通道和16位通道地址)

此办法寄存器用于设置DMA的数据传输办法,其操控字格局如图2所示。


例如:咱们常常用到的两个办法字为(假定选DMA通道1):

45h:DMA写(即内存一1/0卡)

49h:DMA读(即1/0卡一内存)

(2)屏戴寄存器(地址为0Ah或D4h,分e为8位通道和16位通道地址)

此屏蔽寄存器用于使某个DMA通道屏蔽或敞开DMA恳求,其操控字格局如图3所示。


(3)铲除寄存器(地址为0Qh或D8h,别离为8位通道和16位通道地址)

当输出0到此端口时,将中止由屏蔽寄存器(地址为0Ah或D4h)所选定的DMA通道一切正在进行的进程。DMA编程

4、DMA编程

一般,对某个DMA通道编程的过程如下:

(1)保存原有中止向量,设置新中止向量,编写中止服务程序,其主要内容为下一次DMA传输编程,输出EO(中止完毕)至中止操控器;或者是直接转出(当不需再次DMA传输时);

(2)DMAC初始化,包含设置办法操控字,屏数操控字及本次传输数据的页面号,,页面地址偏移及传输数据个数,有必要特别注意的是DMAC的数据计数器比要传输的实践个数要少1;

(3)敞开该通道答应DMA中止恳求;

计数等,为考虑通用性,运用了现在遍及运用

(4)在程序完毕时康复中止向量。

笔者已编制了一个对DMA进行编操控的的TurboC2.0编程,程序也能够不加修正地使程序,此程序包含几个有关DMAC编程的通用用于BorlandC++体系中,程序中假定I/0卡函数,如DMAC操控块参数的取得,中止向量发生的硬件中止号是DREQ5,运用DMA通道及康复设置,DMAC初始化,暂停DMA传输通道号1,读者在使用进程中应根据实践I/O卡提持续DMA传输,停止DMA传输,读取已传输供的硬件中止号及DMA通道号作相应修正。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/132199.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部