控制器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个端口,分别是:方式寄存器,屏蔽寄存器和清除寄存器。
(1)方式寄存器(地址为0Bh或D6h,分别为8位通道和16位通道地址)
此方式寄存器用于设置DMA的数据传输方式,其控制字格式如图2所示。
例如:我们经常用到的两个方式字为(假定选DMA通道1):
45h:DMA写(即内存一1/0卡)
49h:DMA读(即1/0卡一内存)
(2)屏戴寄存器(地址为0Ah或D4h,分別为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通道号作相应修改。
控制器c语言编程,如何用C语言对DMA控制器编程 - 全文相关推荐
- 如何下载c语言游戏,如何用C语言编写游戏.doc
<如何用C语言编写游戏.doc>由会员分享,可在线阅读,更多相关<如何用C语言编写游戏.doc(71页珍藏版)>请在皮匠网上搜索. 1.如何用C语言编写游戏网络游戏是常谈的话题 ...
- c 语言画图片,如何用 C 语言画「心形」?
原标题:如何用 C 语言画「心形」? 在我们IT行业每天面对的就是敲代码,所以很多人无法接受这份工作,因为很无聊也很枯燥,长期工作会使人情绪低落,其实我们编程很多时候也有有趣的地方,接下来我就用一个简 ...
- 计算器怎么用c语言编程,如何用C语言编写简易的计算器
表达式计算建议看一下<数据结构>,先转换为逆波兰表达式,然后再计算. 当然用字符串匹配也是可以的,但是这样复杂度会比较高, 匹配最里面的括号有一个方法就是寻找第一个右括号,和这个右括号对应 ...
- 那些地方会用C语言多线程,如何用C语言实现多线程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...
- 清除缓存 c语言_如何用C语言设置,清除和切换单个位?
清除缓存 c语言 Given a number and we have to 1) set a bit, 2) clear a bit and 3) toggle a bit. 给定一个数字,我们必须 ...
- 安卓版计算机C语言翻译器,如何用C语言来制作翻译器
满意答案 opqr700 推荐于 2017.12.16 采纳率:45% 等级:6 已帮助:59人 写了一个简单的翻译器,只提供单词翻译,中文到英文,英文到中文都行,你需要首先进行字典录入.录入以 ...
- rsa2048加密算法c语言代码,rsa加密算法c语言代码
如何用C语言实现RSA算法? 上学期交的作业,已通过老师在运行时间上的测试 #include #include unsigned long prime1,prime2,ee; unsigned lon ...
- linux zynq ps dma,Zynq PS DMA控制器应用笔记
Zynq-7000系列器件PS端的DMA控制器采用ARM的IP核DMA-330(PL-330)实现.有关DMA控制器的硬件细节及相关指令集.编程实例内容参考ARM官方文档: DDI0424D:dma3 ...
- Zynq PS DMA控制器应用笔记
Zynq PS DMA应用笔记 Hello,Panda Zynq-7000系列器件PS端的DMA控制器采用ARM的IP核DMA-330(PL-330)实现.有关DMA控制器的硬件细节及相关指令集.编程 ...
- DCS编程用C语言,如何用C语言对DMA控制器编程
摘要:详细地分析了PC/AT机系统的DMA(直接存储器存取)控制器结构及其传输方式,并给出了C语言编程实例. DMA是英文DiretMemorAccess的缩写,即直接存储器存取,DMA传输是PC机与 ...
最新文章
- 2021年大数据环境命令(一):常用命令汇总
- MPB:扬州大学王梦芝组-​​反刍动物瘤胃原虫的分离培养与形态学分析
- 每张脸值5美元,谷歌花钱买数据强化刷脸,还把隔空操控手机变成现实
- 二进制安装kubernetes1.14.1-pod配置清单之客户端访问方式03
- Windows下简单好用的php平台:XAMPP Wamp5和AppServ
- guice 框架_玩! 框架+ Google Guice
- 简单好用的 Linux/Windows 面板
- 在Linux下快速搭建LAMP开发平台.doc
- shell题库选择题_shell 练习题
- linux 检测蓝牙 rssi,蓝牙LE信号强度Linux
- cocos编译java时改变使用的javac的版本
- 在EF4.1的DBContext中实现事务处理(BeginTransaction)和直接执行SQL语句的示例
- python数独解题器_python-2.7 – 数独生成器
- 常见汉字与不常见汉字
- 手机商城系统开发流程_各系统业务逻辑关系架构图_OctShop
- 安装CAD2006出现html,win7系统安装cad2006出现已终止CAD2006-Simplifieng安装的解决方法...
- Android 代码设置来电铃声
- 华为交换机调试软件_无忌之谈华为005丨 “华为系”黄埔军校诞生记
- Word/WPS文档中缩小行距
- SpringMVC入门
热门文章
- mac制作ubuntu 18.04 U盘启动盘
- 记一次某制造业ERP系统 CPU打爆事故分析
- php收藏影视,十个值得收藏的影视资源网站
- 奥克兰计算机科学专业世界排名,新西兰计算机专业大学排名
- 可视化数据分析图表设计必学技巧
- html实心圆圈,html5使用canvas画空心圆与实心圆
- 陈强教授《机器学习及R应用》课程 第十七章作业
- VS C++项目报错warning C4199: ……use /Zc:twoPhase-
- 方维o2o系统多通道支付的实现
- 《东周列国志》第九十二回 赛举鼎秦武王绝胫 莽赴会楚怀王陷秦