计基第12章输入和输出_第1页
计基第12章输入和输出_第2页
计基第12章输入和输出_第3页
计基第12章输入和输出_第4页
计基第12章输入和输出_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十二章输入和输出输入和输出输入和输出是冯·诺依曼模型的重要组成部分(第8章)可以通过执行TRAP指令来完成输入和输出(第9章)TRAP指令调用的是操作系统的I/O设备管理例程(第12、13章)I/O设备寄存器每一个I/O设备被作为一个单独的实体对待与一个单独的I/O设备交互,意味着与一个以上的设备寄存器进行交互最简单的I/O设备通常至少包含保存在计算机和设备之间进行传输的数据的寄存器键盘数据寄存器中存储的是用户输入的字符的ASCII码保存设备的状态信息的寄存器例如设备是处于可用的状态还是正忙于执行最近的I/O任务内存映射I/O与专门的I/O指令如何读取I/O设备寄存器中的数据?如何向I/O设备寄存器加载数据?可以采用两种机制使用专门的I/O指令Intel的x86指令集,in/out使用用于在通用寄存器和存储器之间传送数据的数据传送指令使用现有指令问题:如何表示I/O设备寄存器?采用内存映射的方式每一个I/O设备寄存器都被分配一个存储器地址空间中的地址这些地址被分配给I/O设备寄存器,而不再是存储单元DLX-内存映射的I/O地址xFFFF0000到xFFFF00FF被分配给I/O设备寄存器,其他地址分配给存储单元地址I/O寄存器xFFFF0000~xFFFF0003键盘状态寄存器(KBSR)xFFFF0004~xFFFF0007键盘数据寄存器(KBDR)xFFFF0008~xFFFF000B显示器状态寄存器(DSR)xFFFF

000C~xFFFF000F显示器数据寄存器(DDR)xFFFF00F8~xFFFF00FB机器控制寄存器(MCR)内存映射I/O的数据通路地址控制逻辑控制输入或输出操作2个输入:MAR,R.WGate.MDRMDRLD.MDRMARLD.MAR存储器MEM.ENR地址控制逻辑R.WINMUXKBSRKBDRDDRDSR输出输入R.WLD.DDR读KBDR的指令序列KBDR: .word xFFFF0004 ;KBDR的起始地址…… lw r1,KBDR(r0) ;R1=xFFFF0004 lw r4,0(r1) ;将KBDR中的数据加载到R4中异步与同步lw r4,0(r1) 用户每输入一个字符,输入设备寄存器(KBDR)就被加载一个新的ASCII码如果执行这条指令时,用户还没有输入新的字符,会发生什么情况?该指令将KBDR之前存储的数据读入R4中——导致了错误的出现——I/O的执行与处理器的执行不同步异步通常,I/O设备与微处理器的的步伐都是不一致的——异步为了控制对异步问题的处理,需要一些协议或握手机制键盘,需要一个1位的状态寄存器(被称作标志),表明某个人是否输入了一个字符显示器,需要一个1位的状态寄存器,表明最近被送给显示器的字符是否已被显示同步一个1位的标志(被称作就绪位)就可以使用户键盘输入和处理器保持同步每当用户输入一个字符的时候,硬件就将就绪位设为1每当处理器读取该字符时,硬件就将就绪位清空读KBDR的指令序列,在读取KBDR之前增加对就绪位的检查同步打印机数据寄存器用于存储要打印的字符状态寄存器需要2位表示状态一位表示上一个字符是否打印完成(DoneBit)另一位表示打印机出错(ErrorBit),如卡纸或缺纸只有当前一个字符打印完成,才能将新的字符传送给数据寄存器。还必须检查错误位来确定是否出现了问题。轮询在读取KBDR之前,先检查状态是否就绪轮询:通过周期性的检查状态位,来判断是否执行I/O操作的方法如果状态未就绪,那么就重复执行这个指令序列读取就绪位的值,判断就绪位是否就绪直到就绪位为1,就读取KBDR中的值轮询,最简单的方式,由处理器完全控制和执行通信工作轮询缺点用户的输入比处理器的执行速度慢得多假设微处理器的时钟频率是300MHz,那么一个时钟周期就是3.3纳秒假设处理执行一条指令平均需要10个时钟周期,那么,执行一条指令仅需33纳秒如果用户在1秒钟之后输入一个字符假设读就绪位以及判断是否就绪的指令序列为10条指令,那么,处理器将执行这一指令序列300万次,才能读取到该字符因此,轮询方式浪费了大量的处理器时间中断让处理器一直做它自己的事直到被从键盘发来的信号打断:“已经输入了一个新字符,其ASCII码位于输入设备寄存器里,你需要读取它”——中断驱动的I/O由I/O设备来控制交互键盘设备寄存器一个ASCII字符只需要8位,同步机制只需要1位,但给每一个寄存器分配32位(与DLX的通用寄存器一样)会更方便KBDR,[7:0]位用来存放数据,[31:8]位包含x000000KBSR,[0]位存放同步机制,就是就绪位31870KBDR3110KBSRKBDR/KBSR当键盘上的某个键被按下时,硬件电路就将该键对应的ASCII码存储到KBDR[7:0]将KBSR[0]设为1键盘不能用当执行指令序列读取KBDR时,硬件电路将清空KBSR[0]为0允许输入下一个字符输入服务例程-轮询……01 A: .word xFFFF0000 ;KBSR的起始地址02 B: .word xFFFF0004 ;KBDR的起始地址……03 lw r1,A(r0)04 START: lw r2,0(r1)

;测试是否有字符被输入05 andi r3,r2,#106 beqz r3,START07 lw r1,B(r0)08 lw r4,0(r1)09 j NEXT_TASK ;执行下一个任务显示器设备寄存器DDR,[7:0]位用于数据部分,[31:8]中包含x000000DSR,[0]位包含了同步机制,即就绪位31870DDR3110DSRDDR/DSR当处理器把一个ASCII码传递到DDR[7:0]用于输出时,硬件电路将清空DSR[0],表示开始处理DDR[7:0]的内容处理器不能将新字符传给它当显示器将字符显示在屏幕上之后,硬件电路将DSR[0]设为1处理器可以传递下一个ASCII码到DDR用于输出输出服务例程-轮询……01 A: .word xFFFF0008 ;DSR的起始地址02 B: .word xFFFF000C ;DDR的起始地址……03 lw r1,A(r0)04 START: lw r2,0(r1) ;测试输出寄存器是否就绪05 andi r3,r2,#106 beqz r3,START07 lw r1,B(r0)08 sw 0(r1),r409 j NEXT_TASK ;执行下一个任务键盘回显可以通过简单的组合前面讨论过的两个例程得到,不需要添加任何复杂的电路……01 KBSR: .word xFFFF0000 ;KBSR的起始地址02 KBDR: .word xFFFF0004 ;KBDR的起始地址03 DSR: .word xFFFF0008 ;DSR的起始地址04 DDR: .word xFFFF000C ;DDR的起始地址

……05 lw r1,KBSR(r0)06 START: lw r2,0(r1) ;测试是否有字符被输入07 andi r3,r2,#108 beqz r3,START09 lw r1,KBDR(r0)0A

lw r4,0(r1)0B lw r1,DSR(r0)0C

ECHO: lw r2,0(r1) ;测试输出寄存器是否就绪0D andi r3,r2,#10E beqz r3,ECHO0F lw r1,DDR(r0)10 sw 0(r1),r411 j NEXT_TASK ;执行下一个任务DLX键盘输入例程为了让用户知道该例程正在等待键盘的输入,应该在显示器上输出一些信息——提示符寄存器的保存01 .data02 SaveR1: .space 4 ;保存寄存器的存储单元03 SaveR2: .space 4

04 SaveR3: .space 4

05 SaveR5: .space 406 KBSR: .word xFFFF0000 ;KBSR的起始地址07 KBDR: .word xFFFF0004 ;KBDR的起始地址08 DSR: .word xFFFF0008 ;DSR的起始地址09 DDR: .word xFFFF000C ;DDR的起始地址0A

Newline: .byte

x0A

;新行的ASCII码0B Prompt:

.asciiz "Input

a

character>"0C

; 寄存器的保存0D .text0E sw SaveR1(r0),r1 ;保存此例程需要的寄存器0F

sw SaveR2(r0),r210 sw SaveR3(r0),r311 sw SaveR5(r0),r5输出新行12 lb r2,Newline(r0)13 lw r5,DSR(r0)

;测试输出寄存器是否就绪14 L1: lw r3,0(r5) 15 andi r3,r3,#116 beqz r3,L1

;循环直到显示器就绪17 lw r5,DDR(r0)18 sw 0(r5),r2

;光标移到新的一行19 ;输出提示符1A

addi r1,r0,Prompt

;提示符字符串的起始地址1B LOOP: lb r2,0(r1)

;输出提示符1C

beqz r2,Input ;提示符字符串结束1D lw r5,DSR(r0)1E L2: lw r3,0(r5) 1F

andi r3,r3,#120 beqz r3,L2 ;循环直到显示器就绪21 lw r5,DDR(r0)22 sw 0(r5),r2

;输出下一个提示符字符23 addi r1,r1,#1 ;提示符的指针加124 j LOOP

;获取下一个提示符字符25 ;输入回显26 Input: lw r5,KBSR(r0)27 L3: lw r3,0(r5) 28 andi r3,r3,#129 beqz r3,L3

;轮询直到一个字符被键入2A

lw r5,KBDR(r0)2B lw r4,0(r5)

;将输入的字符加载到R42C

lw r5,DSR(r0)2D L4: lw r3,0(r5) 2E andi r3,r3,#12F

beqz r3,L4

;

循环直到显示器就绪30 lw r5,DDR(r0)31 sw 0(r5),r4

;将输入的字符回显32 ;输出新行33 lb r2,Newline(r0)34 lw r5,DSR(r0)35 L5: lw r3,0(r5) 36 andi r3,r3,#137 beqz r3,L5

;循环直到显示器就绪38 lw r5,DDR(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论