Chapter 3 Basic Input/Output(2)
Chapter 3 Basic Input/Output(2)
英文 | 中文 |
---|---|
Communication Methods with CPU | 与 CPU 的通信方法 |
Program controlled I/O (Polling) | 程序控制输入/输出(轮询) |
Interrupt driven I/O | 中断驱动输入/输出 |
Direct Memory Access (DMA) | 直接内存访问(DMA) |
程序控制I/O(Program Controlled I/O)
- 基于键盘和显示器讨论I/O相关问题:
- 需要读取键盘输入的字符,将其存储到内存中,然后在屏幕上显示出来。
- 程序控制I/O实现方式:
- 通过编写一个能执行所有相关功能的程序来完成上述任务,这种方式就被称作程序控制I/O。
- 关键问题:
- 如何确保操作的正确时机以及设备之间传输的同步性呢?也就是怎样保证在合适的时间去执行读取、存储、显示等操作,让键盘、内存和显示器这些设备之间的数据传输能够有条不紊、相互配合地进行,这是程序控制I/O需要着重考虑的方面。
I/O设备的信号协议
- “就绪”信号发送机制假设: 假设输入/输出设备具备向处理器发送“就绪”信号的途径。
- 不同设备中“就绪”信号的含义及对应操作:
- 对于键盘而言:“就绪”信号意味着此时有字符可以被读取了,这样处理器就能使用加载(Load)指令去访问相应的数据寄存器,进而获取键盘输入的字符。
- 对于显示器来说:“就绪”信号表示此时可以发送字符去进行显示了,处理器便会使用存储(Store)指令来访问数据寄存器,把要显示的字符发送过去。
- “就绪”信号的本质及处理器的处理方式: 在每种情况下,这个“就绪”信号其实就是状态寄存器里的一个状态标志位,处理器会通过轮询的方式来查看这个状态标志位,以此知晓设备是否处于“就绪”状态,进而决定是否进行相应的数据传输操作。
示例输入/输出寄存器
- 寄存器相关设定假设: 对于接下来的示例输入/输出程序,假定寄存器有着特定的地址以及位的位置情况。并且这些寄存器的宽度为8位,按字对齐(也就是按照系统规定的字长边界来存放,便于处理器高效访问等操作)。
- 以键盘为例说明寄存器情况及处理器操作: 例如,键盘在地址为0x4004的“KBD_STATUS(键盘状态)”寄存器的第1位(b1)上有一个“KIN(键盘输入就绪)”状态标志位。处理器会轮询“KBD_STATUS”寄存器,去检查“KIN”标志位的值是0还是1。一旦发现“KIN”标志位的值为1,这就意味着键盘有输入数据准备好可以读取了,此时处理器就会去读取“KBD_DATA(键盘数据)”寄存器,从而获取键盘输入的具体数据内容。
等待循环用于轮询I/O状态
(一)
- 通过等待循环轮询键盘状态寄存器实现程序控制I/O:
- READWAIT步骤:
- 首先将键盘状态寄存器(KBD_STATUS)的内容加载到寄存器R4中,使用指令“LoadByte R4, KBD_STATUS”。
- 然后让R4与数值2进行按位与操作(“And R4, R4, #2”),目的是检测键盘相关的某个标志位(可能是表示有键按下之类的标志,这里假设叫KIN标志)是否被置位。
- 如果上述与操作的结果为0,也就是KIN标志没被置位,意味着还没有有效的键盘输入,那就跳转到READWAIT处继续循环等待(“Branch_if _[R_4] = 0 READWAIT”)。
- 一旦检测到KIN标志被置位,就从键盘数据寄存器(KBD_DATA)中读取数据到寄存器R5中(“LoadByte R5, KBD_DATA”)。
- 键盘电路相关操作:键盘电路会在有字符输入时将字符放入KBD_DATA寄存器,并且会在键盘状态寄存器(KBD_STATUS)中设置KIN标志。当从KBD_DATA寄存器读取了数据后,电路会自动清除KIN标志。
- READWAIT步骤:
(二)
- 类似的针对显示设备的等待循环:
- WRITEWAIT步骤:
- 先把显示状态寄存器(DISP_STATUS)的内容加载到寄存器R4中,指令为“LoadByte R4, DISP_STATUS”。
- 接着让R4与数值4进行按位与操作(“And R4, R4, #4”),这可能是为了检测显示相关的某个标志位(假设叫DOUT标志,可能表示上一个字符已显示完成之类的情况)是否被置位。
- 如果与操作的结果为0,也就是DOUT标志没被置位,意味着还不能向显示设备写入新数据,那就跳转到WRITEWAIT处继续循环等待(“Branch_if _[R_4]= 0 WRITEWAIT”)。
- 当检测到DOUT标志被置位后,就可以将需要显示的数据从寄存器R5写入到显示数据寄存器(DISP_DATA)中了(“StoreByte R5, DISP_DATA”)。
- 显示电路相关操作:显示电路会在上一个字符已经被显示之后,在显示状态寄存器(DISP_STATUS)中设置DOUT标志。当有字符被传送到DISP_DATA寄存器时,电路会自动清除DOUT标志。
- WRITEWAIT步骤:
RISC风格的I/O程序
(一)
- 程序功能概述:需着眼于利用轮询机制来读取、存储以及显示一行字符的完整程序。这意味着程序要能实时监控输入、妥善保存字符,再精准地将它们呈现出来。
- 程序结束条件:当在键盘上敲入回车(CR)字符时,整个程序随即结束。回车符充当程序终止的关键信号,方便界定单次字符输入任务的完结。
- 字符回显要求:从键盘录入的每个字符,都要实时在显示屏上原样呈现,达成“所见即所输”的即时反馈效果,增强人机交互的直观感受。
- 存储地址要点:LOC 代表存储行中首个字符的地址,找准这个起始地址,后续对该行字符的调取、处理与运用才能有条不紊地展开,维系存储与读取操作的连贯性与准确性。
(2)
- 寄存器初始化与常量设定:
Move R2,#LOC
:将主存中用于存储字符的首地址赋值给指针寄存器R2
,此举为后续字符存储找准起始位置,让存入的字符能有序排列在内存指定区域。MoveByte R3,#CR
:把代表回车(Carriage Return)的 ASCII 码值存入寄存器R3
,方便后续比对输入字符,判断程序是否该结束。
- 键盘字符读取流程:
READ
:这是读取键盘字符的关键代码段起始标签。LoadByte R4,KBD_STATUS
:加载键盘状态寄存器KBD_STATUS
的内容至R4
,目的是获取键盘当下状态信息。And R4,R4,#2
:让R4
和数值2
进行按位与运算,借此检查键盘的KIN
标志,该标志用于提示是否有新字符输入。Branch if [R4]=0 READ
:若R4
值为0
,意味着KIN
标志未置位、无新字符,程序跳转回READ
处持续等待。LoadByte R5,KBD_DATA
:一旦检测到KIN
标志置位,就从键盘数据寄存器KBD_DATA
读取字符至R5
,同时该读取操作会自动将KIN
清0
。StoreByte R5,(R2)
:把刚读到的字符存入R2
指向的主存位置,完成字符的初步存储。Add R2,R2,#1
:指针寄存器R2
的值加1
,使其指向下一个可存储字符的内存地址,为后续字符存储腾挪空间。
- 字符显示流程:
ECHO
:这是负责字符显示流程的代码段起始标签。LoadByte R4,DISP_STATUS
:读取显示状态寄存器DISP_STATUS
内容到R4
,用于掌握显示设备的实时状态。And R4,R4,#4
:和数值4
进行按位与运算,检查显示设备的DOUT
标志,该标志用于表明显示设备是否就绪,能否接收新字符。Branch if [R4]=0 ECHO
:若R4
值为0
,意味着DOUT
标志未置位、显示设备没准备好,程序跳转回ECHO
接着等待。StoreByte R5,DISP_DATA
:当DOUT
标志置位,将之前读取并存于R5
的字符存入显示缓冲区寄存器DISP_DATA
,同时这一操作会把DOUT
清0
。
- 程序循环与结束判断:
Branch if [R5]≠[R3] READ
:比对刚存入显示缓冲区的字符与寄存器R3
中的回车 ASCII 码,若两者不等,说明输入字符不是回车,程序跳转回READ
,继续读取下一个字符;若相等,则程序结束,意味着完整的一行字符输入完毕,收到终止信号。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论