5.2.2 有条件传送方式
有条件传送方式(即查询传送方式)的基本思想是由CPU主动通过输入/输出指令查询指定的外部设备的当前状态。若设备就绪,则立即与设备进行数据交换;否则循环查询。具体来说,在输入之前,要查询外设的数据是否已准备好,直到外设把数据准备好后才输入;在输出之前,要查询外设是否“忙”,直到外设不“忙”后才输出。查询传送方式适用于CPU与外设不同步的情况。查询传送方式输入/输出的示意流程图如图5-2所示。
采用查询方式输入或输出,相应的外设(或接口)不仅要有数据寄存器,而且还要有状态寄存器,有些外设还有控制寄存器。数据寄存器用来存放要传送的数据,状态寄存器用来存放表示设备所处状态的信息。通常,在状态寄存器中设置一个“就绪(Ready)”位或一个“忙(Busy)”位来反映外设工作状态。
图5-2 查询方式的输入/输出流程图
在实际应用中,为防止设备因某种原因发生故障而无法就绪或空闲,从而导致CPU在无限循环之中,通常都设计一个等待超时值,其值随设备而定。一旦设备在规定时间内还无法就绪或空闲,也中止循环查询过程。如此,图5-2所示的流程图修改为图5-3所示的流程图。大多数情况下,等待超时值用查询次数表示,每查询一次,查询次数减1,如果查询次数减到0,那么查询等待也就结束。
图5-3 查询方式的输入/输出流程图
有时系统中同时有几个设备要求输入/输出数据,那么对每个设备都可编写一段执行输入/输出数据的程序,然后轮流查询这些设备状态寄存器中的就绪位。当某一设备准备好允许输入或输出数据时,就调用这个设备的I/O程序完成数据传送,否则依次查询下一设备是否准备好。
查询方式的优点是:软硬件实现比较简单;当同时查询多个外设时,可以由程序安排查询的先后次序。缺点是浪费了CPU原本可执行大量指令的时间。
【例5-3】假设有一个输入接口电路,其状态端口地址为SADDR1,状态字的D0位为1表示数据准备好,数据端口地址为DADDR1。现以查询方式输入COUNT1个数据,输入的数据存放在BUF缓冲区。
实现查询输入数据的程序段为:
…
LEABX,BUF
MOVCX,COUNT1
LP:INAL,SADDR1
TESTAL,01H
JZLP
INAL,DADDR1
MOV[BX],AL
INCBX
LOOPLP…
【例5-4】假设有一个输出接口电路,其状态端口地址为SADDR2,状态字的D1位为0表示外设空闲,数据端口地址为DADDR2。现以查询方式将TAB缓冲区中的COUNT2个数据输出。
实现查询输出数据的程序段为:
…
LEABX,TAB
MOVCX,COUNT2
LP:INAL,SADDR2
TESTAL,02H
JNZLP
OUTDADDR2,AL
INCBX
LOOPLP
…
【例5-5】如果一台计算机中有多个外设同时使用程序查询方式进行I/O处理,假设有3个设备要使用程序查询方式进行输入处理,它们的状态口分别为STAT1、STAT2、STAT3,子程序PROC1、PROC2、PROC3分别用于执行这3个设备的输入工作。在这些设备中,状态寄存器的bit5=1表示输入数据就绪,变量FLAG=1用于表示输入过程结束,其初始设置为0。下面分别给出具有相同优先权和不同优先权的设备查询程序。
(1)具有相同优先权的设备查询程序。
程序1
INPUT:INAL,STAT1;读设备1状态
TESTAL,20H;输入数据就绪?
JZDEV2;未就绪转
CALLFARPTRPROC1;执行设备1的数据输入
DEV2:INAL,STAT2;读设备2状态
TESTAL,20H;输入数据就绪?
JZDEV3;未就绪转
CALLFARPTRPROC2;执行设备2的数据输入
DEV3:INAL,STAT3;读设备3状态
TESTAL,20H;输入数据就绪?
JZEXIT;未就绪转
CALLFARPTRPROC3;执行设备3的数据输入
EXIT:…
(2)具有不同优先权的设备查询程序。
图5-4给出了具有不同优先权的设备查询程序设计流程,程序2是其编码实现。
图5-4 具有不同优先权的设备查询程序设计流程图
程序2
MOVFLAG,0;清0输入过程结束标志
INPUT:INAL,STAT1;读设备1状态
TESTAL,20H
JZDEV2
CALLFARPTRPROC1;执行设备1的数据输入
CMPFLAG,1;设备1输入过程结束?
JNZINPUT;未结束转,继续进行设备1输入
DEV2:INAL,STAT2;读设备2状态
TESTAL,20H
JZDEV3
CALLFARPTRPROC2;执行设备2的数据输入
CMPFLAG,1;设备2输入过程结束?
JNZINPUT;未结束转,继续进行设备1输入
DEV3:INAL,STAT3;读设备3状态
TESTAL,20H
JZEXIT
CALLFARPTRPROC3;执行设备3的数据输入
EXIT:CMPFLAG,1;设备3输入过程结束?
JNZINPUT;未结束转,继续进行设备1输入
…
比较上述两个程序,可以看出设计上的明显区别。程序1中3个设备得到服务的机会是均等的。从程序2中可以看出,只有设备1没有可输入数据时,设备2才可以得到处理。同样道理,只有设备1和设备2都没有可输入数据时,设备3才可以得到处理,从而保证了设备1总是优先得到处理。后一种设计方法适合于各设备间传输率相差大的系统。然而无论采用哪种方法,都要使各设备服务子程序的代码尽可能地短,速度尽可能地快,以保证即使在最坏情况下,也不会出现某些设备因等待过久而丢失数据的情况。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。