目录

1、程序循环检测方式

2、中断驱动方式

3、直接内存访问方式


单片机I/O设备的控制方式主要有三种:程序循环检测、中断驱动和直接内存访问。

1、程序循环检测方式

程序循环检测方式的基本思路是:在程序(一般是设备驱动程序)当中,通过不断地检测I/O设备的当前状态,来控制一个I/O操作的完成。具体来说,在进行I/O操作之前,要循环地去检测该设备是否已经就绪。如果是,就向控制器发出一条命令,启动这一次的I/O操作。然后,在这个操作的进行过程中,也要循环地去检测设备的当前状态,看它是否已经完成。总之,在I/O操作的整个过程中,控制I/O设备的所有工作都是由CPU来完成的。这种方式也称为是繁忙等待方式或轮询方式。它的缺点主要是:在进行一个I/O操作的时候,要一直占用着CPU,这样就会浪费CPU的时间。

下图所示是循环检测方式的一个例子。假设I/O地址采用的是内存映像编址方式,现在需要在打印机上打印一个字符串“ABCDEFGH”。对于操作系统来说,要完成这个任务,其实很简单,只要把这八个字符一个接一个地送到打印机设备的I/O端口地址就可以了。如图(a)所示,这八个字符被保存在系统内核的一个缓冲区当中,并用指针p来指向它们。status_ reg 这个内存单元对应于打印机控制器里面的状态寄存器, data register这个内存单元对应于它的数据寄存器,现在要做的事情,就是把这八个字符一个接一个地放到数据寄存器当中。

图(b) 所示是相应的程序。它的基本思路是:逐个去打印每一个字符。在打印一个字符之前,首先用一个while语句来检测打印机的当前状态,看它是否已经就绪,如果还没有就绪,就在这里循环等待;如果已经就绪,就把当前的字符送入到打印机的数据寄存器当中。在本例中,由于采用了内存映像的编址方式,因此,在程序员眼中,状态寄存器和数据寄存器都被看成是普通的内存单元,对它们的访问也是普通的赋值操作,不需要专门的I/O指令。但是这个赋值操作的功能与普通的赋值操作不同,它相当于是给打印机发出了一个命令,让它去打印一个字符。另外,每次打印完-一个字符后,都要重新判断设备是否就绪,因为相对于CPU来说,打印机是一个慢速设备,它在执行打印命令时,不可能像CPU那么快,而是需要一定的时间来完成。因此,当CPU把一个字符交给它之后,必须循环等待一段时间, 才能去处理下一一个字符。

2、中断驱动方式

循环检测的控制方式,需要占用大量的CPU时间。假设打印机的打印速度为100字符/秒,在循环检测方式下,当一个字符被写入到打印机的数据寄存器后,CPU要等待10ms才能把下一个字符写进去,而这10ms的时间,就在循环等待中被白白浪费掉了。为了解决这个问题,一种办法就是让CPU在这10ms的时间内,先去运行其他的任务,然后等打印机处理完上一个字符后,CPU再接着处理下一个字符。这种方法被称为是中断驱动的控制方式。它的基本思路是:当一个用户任务需要进行I/O操作时,会去调用相应的系统函数,由这个函数来发起I/O操作,并将当前任务阻塞起来,然后调度其他的任务去使用CPU。当所需的I/O操作完成时,相应的设备就会向CPU发出一个中断,系统在中断处理程序当中,如果发现还有数据需要处理,就再次启动I/O 操作。在中断驱动的控制方式下,数据的每一次读写还是通过CPU来完成,只不过当I/O设备在进行数据处理时,CPU不必在那里等待,而是可以去执行其他任务。

仍以打印字符的问题为例。如下图所示,在中断驱动方式下,对于用户程序来说,它所做的事情可能是:把需要打印的字符串放到一个缓冲区buffer中,然后调用一个系统调用函数print。在print 系统调用中,首先把用户缓冲区中的字符串复制到系统内核的字符数组p当中,然后打开中断。接下来是一个循环检测语句,判断打印机的当前状态是否就绪,当打印机就绪后,就把第一个字符放到数据寄存器里面去打印。接下来,未等该字符打印完,就去调用系统的调度器,选择另一个就绪任务去运行,而当前的这个任务,就会被阻塞起来。

当打印机完成一个字符后,将向CPU发出一个中断。在中断处理程序当中,首先判断一下,如果所有的字符都已打印完,那么就去阻塞队列中,把用户任务唤醒,使它处于就绪状态;如果还有字符需要打印,就直接把下一个字符复制到打印机的数据寄存器当中,启动打印操作,而不需要再去循环地判断打印机是否就绪。接下来是一些后继处理,先向中断控制器发出一个确认信号,然后结束中断处理程序,返回到被中断的那个任务。

3、直接内存访问方式

在中断驱动的控制方式下,每一次数据读写还是通过CPU来完成,而且每一次处理的数据量很少,如1个字节,所以中断出现的频率就很高。而中断处理需要额外的系统开销,所以也会浪费一些CPU时间。因此人们又提出了一种新的解决办法,也就是直接内存访问(Direct Memory Access, DMA)的控制方式。它的基本思路是:让DMA控制器来代替CPU,完成I/O设备与内存之间的数据传送,从而空出更多的CPU时间,去运行其他的任务。

仍以打印字符的问题为例。如下图所示,在DMA控制方式下,用户程序所做的事情是完全相同的,即把字符串复制到一个缓冲区buffer 当中,然后调用系统函数print。在print函数当中,首先也是把buffer 当中的字符串复制到系统内核的缓冲区p当中,然后对DMA控制器进行编程,设置它的各个寄存器的内容,包括内存起始地址、需要打印的字符个数、数据传输的方向等。之后,print 函数就完成了任务,所以就调用系统的调度程序,

选择另一个就绪任务去运行,而当前的这个任务就会被阻塞起来。接下来,当CPU正在执行这个新任务的同时,DMA控制器会与设备控制器进行交互,把需要打印的字符,一个接一个地送到打印机控制器当中。在所有的字符都打印完之后,就向CPU发出一个中断,表明这一次的I/O操作已经全部完成了。因此,在中断处理程序里面,已经没有什么实质性的工作,先是向中断控制器发出一个确认信号,然后唤醒刚才被阻塞的任务。

采用DMA控制方式,最大的优点是减少了中断的次数。原本每打印一个字符,都要产生一次中断,而现在当所有的字符都打印完后,才会产生一个中断,这样就减少了中断处理的开销。

单片机I/O控制方式(UART中断和DMA中断的区别)相关推荐

  1. 操作系统|DMA控制方式与中断控制方式/通道控制方式的区别

    DMA控制方式与中断控制方式的区别 ❀中断控制方式在每个数据传送完成后中断CPU ❀DMA方式在传送一批数据结束时中断CPU ☆中断控制方式的数据传送在中断处理时由CPU控制器完成 ☆DMA控制方式则 ...

  2. I/O控制器 和 DMA控制方式

    一 IO控制器 1.1 I/O控制器是什么 IO设备主要包括机械部件和电子部件.磁盘.光盘.鼠标.键盘.显示器.打印机等都属于机械部件:磁盘控制器.显卡.网卡等属于电子部件.CPU是无法直接操作机械部 ...

  3. 第6.5章:IO控制方式

    第6.5章:IO控制方式1 #mermaid-svg-oTECHk4KGCAqPlX2 .label{font-family:'trebuchet ms', verdana, arial;font-f ...

  4. 操作系统:I/O控制方式的分类和各自的优缺点及适用场景

    一.I/O控制方式的分类? 1.程序I/O控制方式 2.中断驱动I/O控制方式 3.直接存储器访问DMA控制方式 4.I/O通道控制方式 二.四种I/O控制方式的优缺点及适用场景 1.程序I/O控制方 ...

  5. 【建议收藏】计算机组成原理---DMA、中断控制、I/O之间的联系与区别

    [建议收藏] 计算机组成原理-DMA.中断控制.I/O之间的联系与区别 本篇文章主要是记录我对于计算机组成原理中所遇到的一些疑问和疑惑的记录-----主要用于考研的记录 本章一共有几个知识点比较懵: ...

  6. 操作系统I/O控制方式详解

    操作系统I/O控制方式详解 一.导读 二.I/O控制方式 1.直接程序控制方式 2.中断驱动控制方式 3.直接存储器访问(DMA)控制方式 4.通道控制方式 I/O控制方式有几种?分别适用何种场合? ...

  7. 微型计算机的输入输出控制方式,(微机原理)第6章微型计算机的输入输出.pptx

    第6章 微型计算机的输入/输出;主要内容;CPU与外设通信具有如下特点:需要接口作为CPU与外设通信的桥梁:需要有数据传送之前的"联络":要传递的信息有三种类型. ;I/O接口的定 ...

  8. 5.1.3 OS控制I/O设备的几种方式?(程序直接控制方式、中断驱动方式、DMA、通道控制)

    文章目录 0.思维导图 1.程序直接控制方式 2.中断驱动方式 3.DMA方式 4.通道控制方式 5.四种方式总结一下 0.思维导图 1.程序直接控制方式 key word : 轮询 完成一次读/写操 ...

  9. I/O控制方式——轮询,中断,DMA,通道

    转载自https://www.cnblogs.com/niuyourou/p/12588407.html 作为个人学习使用,如果侵权请联系我删除 I/O 设备是计算机的重要组成部分,介于处理器与 I/ ...

最新文章

  1. AJP认证信息爆破ajp_brute
  2. flash TweenMax用法
  3. 两年Java工作经验应该会些什么技术
  4. 用GDB调试Segmentation Fault错误
  5. mongodb创建集合与php扩展
  6. 数据结构上机实践第14周项目1(2) - 验证算法(分块查找)
  7. lr11 打开controller时,会提示提示cannot initialize driver dll,exiting
  8. matlab迭代法求某数平方根,MATLAB平方根法和改进平方根法求解线性方程组例题与程序要点.doc...
  9. 虚继承中的构造函数的调用
  10. c语言中的正号运算符,C语言 运算符
  11. 计算机毕业设计Java医院信息管理系统(系统+源码+mysql数据库+Lw文档)
  12. 傲梅分区助手 linux,傲梅分区助手(详解磁盘操作)
  13. 需求分析(团队作业3)
  14. ssb的有效性最好_在AM、DSB、SSB、VSB四个通信系统中,有效性最好的通信系统()。...
  15. 异常:No persister for的解决办法
  16. 如何实现微信小程序的选项卡
  17. Android 如何更换系统字体
  18. [Android] [Hybrid APP开发简述]
  19. Unity Shader-真实下雨路面
  20. Cisco Packet Tracer汉化处理

热门文章

  1. Python的re模块 --- 正则表达式操作
  2. Python 赋值运算符
  3. 设置子节点相对于父节点水平竖直都居中
  4. 剑指offer-丑数
  5. 把ListT转换为DataTable
  6. PyTorch 笔记(19)— Tensor 用 GPU 加速
  7. codeforces #310 div1 C
  8. mysql中change用法,mysql 中alter的用法以及一些步骤
  9. c++获取可用端口号_PG高可用架构实施方案
  10. 模拟器不全屏_iOS 14实测GBA游戏模拟器下载