2.3 CPU与外设的数据传输方式
外设与微机之间的信息传输,实际上是CPU与接口之间的信息传输。传输的方式不同,CPU对外设的控制方式不同,从而使接口电路的结构及功能也不同,所以要设计接口电路,就要了解和熟悉CPU与外设之间的传输信息的方式。微型计算机和外设之间的数据传输有4种方式,即无条件方式、查询方式、中断方式、直接存储器存取方式(DMA方式)。
2.3.1 无条件传输方式
所谓无条件传输方式,是指CPU对外设接口的读写随时都可以进行,不需要等待某种条件的满足。无条件传送方式也称同步传送方式,主要用于对简单外设进行操作,或者外设的定时是固定的或已知的场合。对于这类外设,在任何时刻均以准备好数据或处于接收数据状态,或者在某些固定时刻,它们处在数据就绪或准备接收状态,因此程序可以不必检查外设的状态,而在需要进行输入或输出操作时,直接执行输入/输出指令。当输入/输出指令执行后,数据传送便立即进行。
这是一种最简单的输入/输出传送方式,所需要的硬件和软件都非常小,一般用于控制CPU与低速I/O接口之间的数据交换。
无条件输入/输出传输方式接口的工作原理如图2-10所示。当CPU执行输入指令时,读信号有效,指定的端口地址经地址总线送到地址译码器译码,相应的地址信号被选中,因而输入缓冲器被接通,使其中准备好的输入数据送到数据总线DB上,再送到CPU。当外设作为输出设备时,需要有输出锁存器以保存CPU送出的数据。CPU执行输出指令时,有效,于是接口中的输出锁存器被选中,锁存并保存CPU送来的数据,直到CPU下一次送来新的数据。无条件传输方式的软、硬件简单,但一般的外设难以满足上述条件,所以这种输出方式用得较少,只用于一些简单外设,如开关、数码管显示等。
图2-10 无条件输入/输出传输方式接口的工作原理图
2.3.2 程序查询传输方式
当CPU能与外设同步工作时,可以采用无条件传输方式。若两者不同步,难以确保在CPU执行输入操作时,外设已准备好,或执行输出操作时,外设是空闲状态。在这种情况下,可以采用查询方式。
程序查询传输方式是指CPU在向外设传递数据前,首先查询外设的状态(即条件),若外设准备好则传送,若未准备好,CPU就等待。可见,接口电路除了有传送数据的端口外,还有传送状态的端口。对于输入过程,当外设将数据准备好时,则使接口的状态端口中的“准备好”标志置1;对于输出过程,外设取走一个数据后,接口便将状态端口中的对应标志置1,表示当前输出寄存器已经处于“空”状态,可以接收下一个数据。
因此,对应条件传送,一个数据传送过程由3个环节组成:
① CPU从接口中读出状态字。
② CPU检测状态字的对应位是否满足“就绪”条件,如果不满足,则回到前一步读出状态字。
③ 如果状态字表明外设已处于“就绪”状态,则传送数据。
程序查询传输方式接口电路中除了数据端口外,还必须有传送状态的端口,同时CPU要不断查询外设状态,占用大量CPU的时间,硬件比无条件传输方式复杂,并使用较多的端口地址。程序查询传输方式的电路原理图及流程图如图2-11所示。
图2-11 程序查询传输方式的电路原理及流程图
例如,逐次逼近式A/D转换器与计算机接口,该转换器转换一次信息约需几十微秒。CPU首先通过I/O接口电路输出控制命令启动A/D转换,然后准备输入转换结果。结果输入前,先要询问转换结束信号(状态信息)是否出现,以判断A/D转换是否准备好了数据。如尚未准备好,CPU将等待和反复询问。如果已转换好,CPU就执行输入指令输入一个数据,然后再输出命令,启动A/D转换器,准备下一个数据。
用查询方式输入数据时,在接口电路与外设间要交换数据、状态和控制3种信息。查询方式的缺点是CPU的利用受到影响,陷于等待和反复查询,不能再做它用;而且,这种方法不能处理掉电、设备故障等突发事件。
2.3.3 中断传输方式
查询式传送比无条件传送可靠,因此使用场合也较多,但在查询方式下,CPU要不断读出状态字,检查输入设备是否已经准备好数据,输出设备是否忙或输出缓冲器是否已空。若外设未准备好,CPU就必须反复查询,进入等待循环状态。由于许多外设的速度很慢,这种等待过程会占去CPU的很大一部分时间,而真正用于传输数据的时间很少,使CPU的利用率很低。
例如,若一个操作员每秒钟可从键盘输入5个字符,平均每个字符占200000µs的时间,实际上计算机只要用10µs就能从键盘读入一个字符,这样就有999950µs的时间花在检测键盘状态和等待上,也就是说99.99%的时间因等待而白白浪费掉了。如果有多个设备工作,还要轮流查询,这些设备的工作速度又往往各不相同,这不仅极大地浪费了CPU的时间,而且还会因为程序进入等待某些慢速外设数据的循环而造成快速外设数据的大量流失,这在许多系统中是不允许的,尤其不能用于要求实时数据处理的场合。为提高CPU的利用率和进行实时数据处理,CPU常采用中断方式与外设交换数据。
在中断传送方式下,外设具有申请CPU服务的主动权,当输入设备将数据准备好或者输出设备可以接收数据时,便可以向CPU发中断请求,使CPU暂时停下目前的工作而和外设进行一次数据传输,等输入操作或者输出操作结束以后,CPU继续进行原来的工作。即中断传送方式就是外设中断CPU的工作,使CPU停止执行当前程序,而去执行一个输入/输出程序,此程序称为中断处理子程序或中断服务子程序。中断服务子程序执行完后,CPU又回来执行原来的程序。
采用中断方式后,CPU平时可以执行主程序,只有当输入设备将数据准备好了,或者输出端口的数据缓冲器已空时,才向CPU发出中断请求。CPU响应中断后,暂停执行当前的程序,转去执行管理外设的中断服务程序。在中断服务程序中,用输入或输出指令在CPU和外设之间进行一次数据交换。等输入或输出操作完成后,CPU又回去执行原来的程序。
有关中断的基本概念,将在2.4节中详细介绍,这里不再赘述。
2.3.4 DMA传输方式
利用中断方式进行数据传送,可以大大提高CPU的利用率,但在中断方式下,仍必须通过CPU执行程序来完成数据传送。每进行一次数据传送,CPU都要执行一次中断服务程序,这时CPU都要保护和恢复现场,以便完成中断处理后能正确返回主程序。显然这些操作与数据传送没有直接关系,但会花费掉CPU的不少时间。当CPU与高速I/O设备交换数据或与外设进行成组数据交换时,中断方式仍显得太慢。
例如,当磁盘和内存成批交换信息时,磁头的读/写速度可超过200000B/s,因此只有在5µs内完成一个字节的传送,才能充分发挥磁盘的大容量的性能优势。如果采用中断方式进行磁盘和内存间的成批数据传送,只能逐字节地进行。例如读磁盘时,要先把从磁盘读出的数据送进CPU的寄存器,再从寄存器搬入内存,然后修改地址指针和字节计数器。这些操作均要用指令来实现,显然不可能在5µs之内完成。为了解决这个问题,可采用一种DMA(Direct Memory Access)的传送方式,也就是直接存储器存储方式。
DMA方式也要利用系统的数据总线、地址总线和控制总线来传送数据。原先这些总线是由CPU管理的,但当外设需要利用DMA方式进行数据传送时,接口电路可以向CPU提出请求,要求CPU让出对总线的控制权,用一种称为DMA控制器的专用硬件接口电路来取代CPU临时接管总线,控制外设和存储器之间直接进行高速的数据传送,而不要CPU进行干预。这种控制器能给出访问内存所需要的地址信息,并能自动修改地址指针,也能设定和修改传送的字节数,还能向存储器和外设发出相应的读/写控制信号。在DMA传送结束后,它能释放总线,把对总线的控制权交还给CPU。可见用DMA方式传送数据时,不需要进行保护和恢复断点及现场之类的额外操作,一旦进入DMA操作,就可直接在硬件的控制下快速完成一批数据的交换任务,数据传送的速度基本取决于外设和存储器的存取速度。