DCS编程用C语言,如何用C语言对DMA控制器编程
摘要:详细地分析了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控制器编程相关推荐
- 等腰字母三角形c语言,如何用c语言输出等腰三角形 c语言输出三角形方法
如何用c语言输出三角形?这个代码怎么写?你会写吗?当你真正爱上编程时,估计每天写代码的时候,是你最惬意的时间了. 工作留给自己的纯净的思考时间很少,每天生活在需求噪音中,编程则不一样,手指在键盘敲击飞 ...
- powershell如何编程C语言,如何用C语言执行powershell命令
匿名用户 1级 2015-03-03 回答 我有一条获取server安装的各种组件的powershell命令,可以在server上正常命令行执行 powershell -command "& ...
- 线程使用 c语言,如何用C语言实现多线程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...
- 多线程c语言,如何用C语言实现多线程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...
- 关闭线程 C语言,如何用C语言实现多线程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...
- arduino程序与c语言,如何用C语言编写Arduino Uno
描述 第1步:设置事物.. 要在C中编写代码,我们需要一个软件, 您可以使用AVR studio和任何其他编码软件. 这里我们将使用代码块,重量轻,易于使用,并且内置软件直接将代码上传到您的Ardui ...
- 多线程 c语言,如何用C语言实现多线程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...
- 最小公倍数用c语言,如何用C语言求最小公倍数。。。
满意答案 wqiusk 2014.04.10 采纳率:49% 等级:9 已帮助:868人 主要是辗转相除法. 方法一.不设函数 #include <stdio.h> int main ...
- 出生年月缩写c语言,如何用C语言编写输入出生年月?
这是我的看法,请采纳. //帮你搞了一个,刚有点小错误,修正了一下 #include"stdio.h" #include"math.h" typedef str ...
最新文章
- ZOJ 2110 Tempter of the Bone(DFS)
- 一个html表单赋给另一个表单,是否可以将表单输入到另一个html表单
- html制作柱状图教程,基于Echarts的HTML5 Canvas折线图柱状图DEMO演示
- [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)
- Java JDBC篇2——JDBC增删查改
- python浪漫文艺_Python程序员的文艺之路
- 流媒体服务器性能测试
- python列表输出字符串,如何在python中输出utf-8字符串列表?
- chrome 插件开发各种功能demo_Chrome扩展开发-编写一个浏览器插件
- word文档如何设置/取消首行输入空格当作缩进
- 自动机器学习-H2O.ai
- Weighted Boxes Fusion加权检测框合并
- 示波器 DC50Ω与DC1M
- Element 中图片预览后如何快速关闭
- 合并多个 .ts 文件为单个 .mp4 解决方案
- android google 登录登出接入
- Gazebo机器人仿真
- Oracle 小数点特殊处理
- abaqus 复合材料edit composite layup中报错:没有指定坐标系
- 怎么查看linux系统中有哪些数据库,linux命令查询mysql的有哪些
热门文章
- lin通讯从节点同步间隔场_基于LIN总线的车身控制系统设计
- windows php-beast安装,BEAST安装使用教程(Windows版)
- thinkpad win10 莫名卡死的可能原因
- 怎么在CAD看图中适时缩放CAD图纸
- levenberg-marquardt算法MATLAB实现
- Lighthousenbsp;Partners赞助的区…
- 农场游戏种植养殖模式详解以及源码搭建方式
- android圆角柱状图,MPAndroidChart 圆角柱状图
- 公司名称相似度检测及电话相似度检测
- 上海初中计算机课VB,中学校本课程--VB入门.doc