数据传输的控制方式指的是在数据传输过程中如何控制数据的传送,即确定何时数据能够传送并据此启动数据的传送。在CPU和外围设备之间进行数据传输的时候可以采用的控制方式主要有四种:无条件传送方式、程序查询方式、中断控制方式和直接存储器访问(DMA)方式。
1.无条件传送方式
在某些情况下,输入数据永远处于“准备好”状态,或者输出设备永远处于“空闲”或者“可用”状态,则CPU随时可以使用IN指令输入数据或者使用OUT指令输出数据而无需查询设备的状态,这时CPU和外设之间可以采用无条件传送的数据传输控制方式,即CPU随时可以使用IN或OUT指令启动数据传输而无需考虑外设的状态。
2.程序查询方式
无条件传送方式要求输入/输出设备永远处于“准备好”的状态,这是一种非常难以满足的前提条件,绝大多数外设都只能限制在某些特定状态下与CPU进行数据交换,这时无条件传送方式就不再适合。为了解决这个问题,接口电路中除了数据端口之外还必须提供一个供CPU进行状态查询的“状态端口”,用来表示输入设备的输入数据是否准备好或者输出数据是否处于空闲状态。通过对这个状态端口的查询,CPU就可以采用程序查询方式来实现和外设之间的数据传输。
在使用程序查询方式进行数据输入的时候,输入设备的接口电路需要提供一个用来反映输入状态的状态端口,程序通过读取该端口获得输入设备是否已经将待输入的数据准备好。一般来讲,一个输入数据是否已经准备好只需要一个比特就可以表示,而程序从端口中读取的数据最少一个字节,这就要求我们使用AND指令或TEST指令将有用的比特从读入的状态字节中分离出来。假设状态口地址为0347H,数据口地址为0346H,状态端口最低位为1表示数据已经准备好,则使用程序查询方式输入数据的程序段:
类似地,在使用程序查询方式进行数据输出的时候,输出设备的接口电路需要提供一个用来反映设备是否忙的状态位。由于这个状态位只用于CPU读,而数据端口只用于CPU写,这两个端口可以共用同一个端口地址,在对这个地址的端口读的时候读取状态寄存器,而对该端口写的时候把数据写到数据锁存器。假设该端口号为0360H,状态位连接数据总线的D7线,则使用程序查询方式输出数据的程序段:
外设通常不仅仅要实现单一的输入或输出,而是通过多个不同的数据输入端口和输出端口进行多种不同数据的输入和输出。这时我们就需要多个用来反映数据是否准备好或者设备是否忙的状态位,这些状态位通常被组合到一起,形成状态字,并通过一个特定的状态端口将状态字提供给CPU,读入的状态字再通过TEST、AND、OR等逻辑操作分离出特定位的状态,从而达到将外设的状态通知给CPU的目标。
3.中断控制方式(www.xing528.com)
程序查询方式有着非常明显的不足,在设备未准备好的时候,CPU必须反复对状态寄存器进行读取和测试,这些测试动作占用了大量的CPU时间。这些不足的原因在于程序查询方式的主控方始终是CPU,一切动作都由CPU发起,接口电路永远处于被动的地位,无法把设备的状态变化主动通知给CPU。中断控制方式就采用了另一种理念,它允许外围设备通过中断将自身的状态变化通知CPU。平时CPU处理其他事务,一旦输入数据准备好或输出设备空闲,接口电路就会主动向CPU发出中断请求,要求CPU暂停正在处理的事务执行中断处理程序,实现数据的输入或输出操作。
和程序查询方式相比,中断控制方式避免了CPU对状态寄存器的反复测试,在一定程度上实现了CPU和设备之间的并行操作,大大提高了CPU的工作效率。但是,为了能够实现中断,外设接口电路必须包含一组中断请求电路,用来根据设备的状态产生中断请求,并提供对中断请求的管理能力(比如通过对某个端口的某个位的设位与复位来允许或禁止设备产生中断请求),同时CPU也必须支持对中断的响应与处理。
中断控制方式实质上是一种软硬件结合的数据传输与控制方式。中断请求的产生、管理以及响应要依赖于中断控制器芯片等硬件,而在中断请求被响应之后,数据的实际传输则要依靠CPU中运行的中断处理程序完成。也就是说,硬件负责通过中断请求-响应机制来解决“何时可以传输数据”的问题,数据的实际传输由中断处理程序以软件的形式来完成。
4.直接存储器访问(DMA)方式
和程序查询方式相比,中断控制方式解放了CPU,使得CPU无需通过循环查询的方式来了解外设的状态,大大提高了CPU的工作效率。但是在CPU和外设之间需要交换批量数据的时候,中断控制方式就无法满足要求了。在中断控制方式中,当外设向CPU发出中断请求后,CPU要通过一段中断处理程序来实现一次外设的数据传输。而这一次数据输入/输出的代价则是CPU要执行保护现场、执行中断处理程序、恢复现场、中断返回等十几条甚至几十条指令。很明显,当高速外设与CPU之间进行批量数据的交换时,仅仅依靠中断控制方式是很难进一步提高效率的。
从CPU处理一次中断请求的角度来考虑,保护现场、执行中断处理程序、恢复现场、中断返回这些操作都是不能省略的,也就是说中断响应过程无法被压缩。要提高数据的传输效率只能从另外一个方面入手,争取在一次中断响应过程中尽可能多传输一些数据,但是,纵然如此,由于数据通过CPU进行传输,一次数据传输要经过从外设到CPU和从CPU到内存两个步骤,无形之中也降低了数据传输的效率。
为了解决高速外设批量数据交换所带来的这些问题,一种显而易见的解决方案就是在CPU之外增加一种专门用来控制外设与内存之间数据交换的控制器。当需要与内存进行数据传输的时候,外设向这个控制器发出传输数据的请求,再由这个控制器控制内存和外设,通过系统总线实现不需要CPU干预的外设数据交换。这时CPU可以照常执行正在执行的程序而无需被打断,只是由于总线被外设与主存储器之间的数据传输所占用而无法使用总线而已。这就是直接存储器访问(Direct Memory Access,DMA)方式。
DMA方式是用硬件直接在外设和存储器之间进行数据传送,其硬件基础是DMA控制器,它可以作为总线主设备控制总线,并驱动总线完成一段数据的批量传输。由于整个DMA传输过程都无需CPU的干预,数据交换的速度远远快于单纯中断控制方式的数据交换速度,而且不干扰CPU中正在执行的当前程序,对于CPU的效率影响很小。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。