摘要:详细地分析了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个端口,分别是:方式寄存器,屏蔽寄存器和清除寄存器。

DCS编程用C语言,如何用C语言对DMA控制器编程相关推荐

  1. 等腰字母三角形c语言,如何用c语言输出等腰三角形 c语言输出三角形方法

    如何用c语言输出三角形?这个代码怎么写?你会写吗?当你真正爱上编程时,估计每天写代码的时候,是你最惬意的时间了. 工作留给自己的纯净的思考时间很少,每天生活在需求噪音中,编程则不一样,手指在键盘敲击飞 ...

  2. powershell如何编程C语言,如何用C语言执行powershell命令

    匿名用户 1级 2015-03-03 回答 我有一条获取server安装的各种组件的powershell命令,可以在server上正常命令行执行 powershell -command "& ...

  3. 线程使用 c语言,如何用C语言实现多线程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...

  4. 多线程c语言,如何用C语言实现多线程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...

  5. 关闭线程 C语言,如何用C语言实现多线程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...

  6. arduino程序与c语言,如何用C语言编写Arduino Uno

    描述 第1步:设置事物.. 要在C中编写代码,我们需要一个软件, 您可以使用AVR studio和任何其他编码软件. 这里我们将使用代码块,重量轻,易于使用,并且内置软件直接将代码上传到您的Ardui ...

  7. 多线程 c语言,如何用C语言实现多线程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...

  8. 最小公倍数用c语言,如何用C语言求最小公倍数。。。

    满意答案 wqiusk 2014.04.10 采纳率:49%    等级:9 已帮助:868人 主要是辗转相除法. 方法一.不设函数 #include <stdio.h> int main ...

  9. 出生年月缩写c语言,如何用C语言编写输入出生年月?

    这是我的看法,请采纳. //帮你搞了一个,刚有点小错误,修正了一下 #include"stdio.h" #include"math.h" typedef str ...

最新文章

  1. ZOJ 2110 Tempter of the Bone(DFS)
  2. 一个html表单赋给另一个表单,是否可以将表单输入到另一个html表单
  3. html制作柱状图教程,基于Echarts的HTML5 Canvas折线图柱状图DEMO演示
  4. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)
  5. Java JDBC篇2——JDBC增删查改
  6. python浪漫文艺_Python程序员的文艺之路
  7. 流媒体服务器性能测试
  8. python列表输出字符串,如何在python中输出utf-8字符串列表?
  9. chrome 插件开发各种功能demo_Chrome扩展开发-编写一个浏览器插件
  10. word文档如何设置/取消首行输入空格当作缩进
  11. 自动机器学习-H2O.ai
  12. Weighted Boxes Fusion加权检测框合并
  13. 示波器 DC50Ω与DC1M
  14. Element 中图片预览后如何快速关闭
  15. 合并多个 .ts 文件为单个 .mp4 解决方案
  16. android google 登录登出接入
  17. Gazebo机器人仿真
  18. Oracle 小数点特殊处理
  19. abaqus 复合材料edit composite layup中报错:没有指定坐标系
  20. 怎么查看linux系统中有哪些数据库,linux命令查询mysql的有哪些

热门文章

  1. lin通讯从节点同步间隔场_基于LIN总线的车身控制系统设计
  2. windows php-beast安装,BEAST安装使用教程(Windows版)
  3. thinkpad win10 莫名卡死的可能原因
  4. 怎么在CAD看图中适时缩放CAD图纸
  5. levenberg-marquardt算法MATLAB实现
  6. Lighthousenbsp;Partners赞助的区…
  7. 农场游戏种植养殖模式详解以及源码搭建方式
  8. android圆角柱状图,MPAndroidChart 圆角柱状图
  9. 公司名称相似度检测及电话相似度检测
  10. 上海初中计算机课VB,中学校本课程--VB入门.doc