首页 百科知识 有条件传送方式

有条件传送方式

时间:2023-08-25 百科知识 版权反馈
【摘要】:有条件传送方式的基本思想是由CPU主动通过输入/输出指令查询指定的外部设备的当前状态。数据寄存器用来存放要传送的数据,状态寄存器用来存放表示设备所处状态的信息。有时系统中同时有几个设备要求输入/输出数据,那么对每个设备都可编写一段执行输入/输出数据的程序,然后轮流查询这些设备状态寄存器中的就绪位。在这些设备中,状态寄存器的bit5=1表示输入数据就绪,变量FLAG=1用于表示输入过程结束,其初始设置为0。

5.2.2 有条件传送方式

有条件传送方式(即查询传送方式)的基本思想是由CPU主动通过输入/输出指令查询指定的外部设备的当前状态。若设备就绪,则立即与设备进行数据交换;否则循环查询。具体来说,在输入之前,要查询外设的数据是否已准备好,直到外设把数据准备好后才输入;在输出之前,要查询外设是否“忙”,直到外设不“忙”后才输出。查询传送方式适用于CPU与外设不同步的情况。查询传送方式输入/输出的示意流程图如图5-2所示。

采用查询方式输入或输出,相应的外设(或接口)不仅要有数据寄存器,而且还要有状态寄存器,有些外设还有控制寄存器。数据寄存器用来存放要传送的数据,状态寄存器用来存放表示设备所处状态的信息。通常,在状态寄存器中设置一个“就绪(Ready)”位或一个“忙(Busy)”位来反映外设工作状态。

图5-2 查询方式的输入/输出流程图

在实际应用中,为防止设备因某种原因发生故障而无法就绪或空闲,从而导致CPU在无限循环之中,通常都设计一个等待超时值,其值随设备而定。一旦设备在规定时间内还无法就绪或空闲,也中止循环查询过程。如此,图5-2所示的流程图修改为图5-3所示的流程图。大多数情况下,等待超时值用查询次数表示,每查询一次,查询次数减1,如果查询次数减到0,那么查询等待也就结束。

img96

图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是其编码实现。

img97

图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总是优先得到处理。后一种设计方法适合于各设备间传输率相差大的系统。然而无论采用哪种方法,都要使各设备服务子程序的代码尽可能地短,速度尽可能地快,以保证即使在最坏情况下,也不会出现某些设备因等待过久而丢失数据的情况。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈