输入、输出
- 本章输入设备选择键盘,输出设备选择显示器
输入、输出的基本概念
- 设备寄存器(decice register):即使最简单的I/O设备,也至少包含两个寄存器:
- 一个用来保存跟计算机之间传输的数据;
- 另一个用来指示当前设备的状态信息。
- 内存映射I/O与专用I/O指令
- 指令访问I/O设备寄存器时,需要明确指明目标寄存器。通常有两种实现方法
- 采用专门的I/O指令来访问,即专用I/O指令
- 采用内存操作指令来完成I/O操作,即内存映射I/O
- 专用I/O指令就是设计好的操作码来确定其行为
- 内存映射I/O需要使用与内存访问相同的指令来操作I/O,所以设备的每个输入或输出寄存器,都必须有一个与内存中位置相同的标识方式。
- LC-3采用内存映射I/O方式。其中,0x00000xFDFF的地址空间用于标识内存,0XFE000xFFFF则保留给外部设备使用
- 指令访问I/O设备寄存器时,需要明确指明目标寄存器。通常有两种实现方法
- 异步I/O与同步I/O
- I/O设备和处理器的工作节凑时不一致的,因此我们称I/O设备和CPU之间是异步的。异步通信方式下,需要通过一定的协议或握手机制来控制发送和接收。
- 在键盘输入中,我们可采用单bit的状态寄存器称为标志(Ready),来指示是否有新的字符数
- 在显示器输出中,我们也使用一个单bit状态寄存器,来表示最近输入的字符是否已经显示在显示器上
- 实现同步的最简单的方式就是采用标志。
- 如果打字员输入字符的速度是恒定的,也可以将硬件设计为定期读取一次输入寄存器。打字员和CPU的节奏是一致的,因而不需要额外的同步信息,此时称打字员和处理器的交互是同步的。
- I/O设备和处理器的工作节凑时不一致的,因此我们称I/O设备和CPU之间是异步的。异步通信方式下,需要通过一定的协议或握手机制来控制发送和接收。
- 中断驱动与轮询
- 交互的两种基本方式是中断驱动和轮询
- 根本区别在于双方是谁控制这个交互,如果由外设控制,则称为“中断驱动I/O”,如果由处理器控制,则称为“轮询方式的I/O”
键盘输入
- 基本输入寄存器
- 键盘需要一个键盘数据寄存器(KBDR)和一个键盘状态寄存器(KBSR)
- KBDR的地址是0xFE02
- KBSR的地址是0xFE00
- KBDR的第0~7位用于存储输入字符的ASCII值,KBSR的第15位用以存储同步信息
- 键盘需要一个键盘数据寄存器(KBDR)和一个键盘状态寄存器(KBSR)
- 基本输入服务程序
- KBSR[15]的作用是控制处理器和键盘之间的同步。
- 当某个按键被按下,该键对应的ASCII存入KBDR[7:0],KBSR[15]置1,当LC-3读取KBDR时,键盘自动清除KBSR[15]。
- KBSR[15]=0意味着键盘可以继续输入,
- KBSR[15]=1意味着上次输入字符还未被处理器取走
- 当某个按键被按下,该键对应的ASCII存入KBDR[7:0],KBSR[15]置1,当LC-3读取KBDR时,键盘自动清除KBSR[15]。
- 在轮询的方式下,程序反复读取并测试KBSR[15]位,直到它被置为1
- 示例
- KBSR[15]的作用是控制处理器和键盘之间的同步。
START LDI R1,A
BRzp START
LDI R0,B
BRnzp NEXT_TASK
A .FILL xFE00
B .FILL xFE02
-
将键盘KBDR寄存器中的ASCII值读入本地寄存器R0中,然后跳转至下一个任务。
-
内存映射输入的实现
- 在内存映射方式下,设备寄存器的输入步骤和内存操作读取完全一样。只是内存读取时,MAR保存的是内存地址,而内存映射输入时则是设备寄存器地址。内存映射方式下MDR的装入内容来自设备寄存器,而非内存单元
显示器输出
- 基本输出寄存器(DDR和DSR)
- 内存映射地址
- DDR: 0xFE06
- DSR: 0xFE04
- DDR[7:0]输出字符的ASCII码
- DSR[15]表示输出同步
- 内存映射地址
- 基本输出服务程序
- 在LC-3将单个字符的ASCII值输出到DDR[7:0]时,显示器电路自动清除DSR[15],然后开始DDR[7:0]内容的处理;当显示器完成字符到屏幕的输出之后,其电路将自动设置DSR[15]位,可以下一个字符输出。
- DSR[15]=0,显示器忙
- DSR[15]=1,显示器空闲,可进行下一个字符
- 示例:
- 在LC-3将单个字符的ASCII值输出到DDR[7:0]时,显示器电路自动清除DSR[15],然后开始DDR[7:0]内容的处理;当显示器完成字符到屏幕的输出之后,其电路将自动设置DSR[15]位,可以下一个字符输出。
START LDI R1,A
BRzp START
STI R0,B
BRnzp NEXT_TASK
A .FILL xFE04
B .FILL xFE06
+ 将R0中的字符输出到显示器上
- 内存映射输出的实现
- 内存映射方式下,设备输出的操作与store指令相似,只是MAR的内容是设备寄存器地址,控制逻辑使能的是设备寄存器,而不是内存单元
- 键盘回显的代码(上述两个例子的结合)
START LDI R1,KBSR
BRzp START
LDI R0,KBDR
ECHO LDI R1,DSR
BRzp ECHO
STI R0,DDR
BRnzp NEXT_TASK
KBSR .FILL xFE00
KDSR .FILL xFE02
DSR .FILL xFE04
DDR .FILL xFE06
一个更复杂的输入程序
- 为了让用户知道程序正在等待用户的输入,计算机可以在显示器上打印提示消息,这些消息称为提示符。它们由操作系统(%或C:)或编辑器程序(:)输出的
START ST R1,SaveR1
ST R2,SaveR2
ST R3,SaveR3
;
LEA R1,Prompt
Loop LDR R0,R1,#0
BRz Input
L2 LDI R3,DSR
BRzp L2
STI R0,DDR
ADD R1,R1,#1
BRnzp Loop
;
Input LDI R3,KBSR
BRzp Input
LDI R0,KBDR
L3 LDI R3,DSR
BRzp L3
STI R0,DDR
;
L4 LDI R3,DSR
BRzp L4
STI R2,DDR
LD R1,SaveR1
LD R2,SaveR2
LD R3,SaveR3
BRnzp NEXT_TASK
;
SaveR1 .BKLW 1
SaveR2 .BKLW 1
SaveR3 .BKLW 1
DSR .FILL xFE04
DDR .FILL xFE06
KBSR .FILL xFE00
KBDR .FILL xFe=E02
Newline .FILL x000A
Prompt .STRINGZ "Input a character>"
中断驱动I/O
- 中断驱动I/O本质特征是:I/O设备能够实现下列功能
- 强行中止当前程序的运行
- 使得处理器执行I/O设备请求
- 最后恢复被中断程序的执行,并让它感觉好像什么事情都每发生过一样
- 为什么要引入中断驱动I/O
- 如果I/O操作采用轮询方式,处理器会花费大量事件探测标志位。而在中断驱动I/O下不同,如果没有中断发生,处理器可以执行其他程序;当中断发生时,处理器才暂停当前程序,并自动调用相应的I/O处理程序
- 大大节省了时间
- 中断信号的产生
- 中断驱动I/O包括两部分内容
- 中断使能机制,即I/O设备如何通知处理器
- 传输机制,即I/O数据如何在处理器和设备之间传送
- 即:产生中断信号,中止当前执行程序;处理该中断请求
- 第二部分内容在堆栈技术中会了解
- 第一部分内容(中断处理器)所必备条件
- I/O设备自身确实需要服务
- 设备有请求服务的权限
- 设备中断请求的优先级高于当前处理器所运行程序的优先级。
- 来自设备的中断信号(第一、二条件)
- 如上述条件所列前两项所示,设备确实有请求服务的需求,且设备有足够的请求权限
- 第一项条件,标识位即可
- 第二项条件,是指“中断使能标志”,处理器通过设置该标志位,控制I/O设备是否有上报终端的权限。通常状态寄存器中包含有“中断允许标志(IE)”,KBSR和DSR的第14位即中断允许标志,来自I/O设备的中断请求信号是IE和Ready的逻辑与(AND)结果
- IE清0,无论Ready中断信号都不会产生。只有通过轮询方式,才能获知设备是否已准备好新数据的传输
- IE置1,设备处在中断驱动I/O工作方式下,即允许设备发出中断。一旦设备准备好传输新数据,Ready位被置1,设备就会产生中断信号
- 如上述条件所列前两项所示,设备确实有请求服务的需求,且设备有足够的请求权限
- 中断优先级(第三条件)
- 几乎所有计算机都定义了一组程序优先级别。LC-3定义了8个优先级别(PL0~PL7),数值越大优先级越高。优先级高的优先执行
- 中断检测
- 在增加了中断信号检测逻辑之后,指令执行的过程中6个节拍中STORE RESULT的同时还要进行中断信号INT的测试,如果INT未被设置,则一切如旧,否则控制单元回到FETCH节拍之前,需(一)、保存足够的状态信息,以备以后能正确恢复被中断程序的执行环境,(二)、将服务于该设备请求的程序入口地址装入PC寄存器。
- 中断驱动I/O包括两部分内容