微机原理与接口技术总结笔记(三)

2019-06-06

复习笔记

上一节:8086汇编程序设计

接口I/O技术基础

接口是CPU和内存与外部设备(如磁盘、键盘、鼠标、显示器、音频输出等)通过总线进行连接的逻辑部件,在计算机设计中占据重要地位。

接口访问指令

在上一节我们知道了IN OUT指令的用法,就是8086汇编程序中访问接口的指令,如下:

MOV DX, 3FCH
MOV AL, 60H
OUT AL, DX
  • AL/AX存数据
  • DX存地址

8086外部引脚信号

图来自WIKI

WIKI上给出的8086引脚图

接口IO由一些引脚信号控制,和IO接口相关的有:

  • A0-A19:20位地址线,在我们的课程上一般只用到0-9
  • AD0-AD15:16位数据线
  • RD#:读选通信号,有效时(0)表示CPU正在对存储器或IO接口进行读操作
  • WR#:写信号输出,有效时表示CPU正在对存储器或IO接口进行写操作
  • M/IO#:存储器/IO控制信号,有效时表示正在访问存储器,无效时访问IO接口
  • INTR:可屏蔽终端请求输入信号,有效时(1)表示产生可屏蔽中断,CPU决定是否响应
  • INTA#:中断响应信号,有效表示CPU响应中断。同时在响应过程中,也会连续输出两个负脉冲作为外部中断设备的中断向量码的读选通信号。

当然除了数据线信号和地址线信号,都是无法编程管理的,了解只是为了理解接口芯片的工作原理。

还有些信号是总线控制器根据CPU信号产生的:

  • IOW#:IO写信号,显然是WR#有效(0)且M/IO#无效(1)时有效
  • IOR#:IO读信号,显然是RD#有效(0)且M/IO#无效(1)时有效

数据传送方式

  • 无条件传送

    输入时假设输入设备已经准备好,输出时假设输出设备是空间的,直接对接口对应的地址进行数据移动。实现最简单,局限性较大。

  • 查询方式

    CPU与外设传送数据前,主动去查询外设是否“准备好”(一般是去查询外设接口的状态字),直至准备好了才进行数据传送。因为需要轮询,这种方式CPU利用率很低,对于单任务和实时性要求很高的系统才适用。

  • 中断方式

    外设做好数据传送准备后,主动向CPU请求中断,CPU响应中断,暂停其正在执行的其他程序,转入中断处理子程序,直到完成中断处理子程序之后再恢复原程序。这样适合于多个外设接口的并行工作,也提高了CPU的利用率。

IO编址译码&74LS138译码器

需要对IO接口进行地址编码,从而可以通过地址访问接口。和8086配套的常见译码器74LS138就常用来地址译码。按照要求对输入端接入地址线和RD#、WR#等线,输出端接上各接口芯片的片选信号CS#,实现在不同的地址时激活特定芯片。

74LS138

中断概念

中断:在程序执行过程中,为了响应从硬件或软件发出的信号而产生的事件。

  • 硬件中断:可屏蔽中断(多个中断通过8259A进行选择一个送往CPU,INTR引脚触发)和不可屏蔽中断(NMI引脚触发)
  • 软件中断:通过INT指令软件触发中断,比如DOS系统调用 INT 21H

可编程中断控制器8259A

8259A是为了管理外部硬件可屏蔽中断源,主要是解决多中断触发时,优先级问题而设计的芯片。

引脚

  • CS#:片选
  • WR#:读信号
  • RD#:写信号
  • DB0~DB7:8位数据总线
  • CAS0~CAS2:级联总线。多片8259A级联时,主片的CAS线做输出
  • INT:输出中断请求信号
  • IRi:外设的中断请求线
  • INTA#:中断响应输入。CPU在这个信号线上发出2个中断脉冲信号,第一个用来通知8259A中断已响应,第二个用来让8259A提供中断向量号。
  • A0:地址线,所以8259A只有2个地址()

工作方式

触发方式:

  • IR边沿触发
  • IR电平触发
  • CPU中断查询

屏蔽方式:

  • 常规屏蔽方式:用操作命令字OCW1来使某几位中断源屏蔽
  • 特殊屏蔽方式

优先级方式:

  • 全嵌套方式:0~7排队,中断级别高的可以中断级别低低的中断服务程序
  • 特殊全嵌套方式
  • 优先级自动轮换方式
  • 优先级指定轮换方式

结束中断方式:

  • 自动结束中断:用于中断不能嵌套的系统中所以很少用
  • 非自动结束中断:用于中断能嵌套的系统中。设置操作字OCW2=20H

初始化

8259A有4个初始化字ICW1~ICW4,由于8259A仅有两个地址,显然要通过时序来标志不同的初始化字:

  • ICW1:触发方式选择;级联方式选择;是否需要ICW4(16位CPU,必须要)
  • ICW2:设置中断向量号的高5位(低3位为IRi引脚中号决定)
  • ICW3:多片级联才会需要;本初始化字对主片和从片不同;主片上设置IRi引脚上的级联连接情况;从片设置连接到主片IRi的哪个引脚;
  • ICW4:设置结束方式;设置优先级方式;

控制字

8259A共有3个控制字

  • OCW1:设置中断屏蔽
  • OCW2:设置中断等级
  • OCW3:查询字

多片8259A级联

多片8259A做级联,是为了管理更多的中断源。多片8259A级联时,主片的CAS线做输出线,从片接的CAS线做输入线。需要设置ICW3。主片从片都要设置一遍ICW1~ICW4

中断处理

8259A做的一堆事,就是为了引导CPU在一堆外部中断请求中选择一个,得到其对应的中断向量号(通过INTA#两次脉冲),此时中断还未处理。

中断向量表

CPU从8259A拿到了中断向量号,那么怎么获得中断处理程序的入口地址呢?通过查中断向量表。

中断向量表每一项称为中断向量,即中断处理程序逻辑地址CS:IP,所以一个中断向量4BYTE(低位存IP),从实模式0地址开始存。

直接编写中断向量表初始化程序,需要先关闭中断(CLI),写完了再打开。

初始化中断向量程序,可以用DOS系统调用,模板:

MOV AX,SEG SERVICE
MOV DS,AX
MOV DX OFFSET SERVICE
MOV AH 25H;25H号系统调用,设置中断向量号
MOV AL 0CH;写在第几个中断向量的位置,这里只是举个例子
INT 21H

...

SERVICE PROC;真正的中断程序位置

这种情况是不考虑中断置换,也就是直接覆盖原位置的中断处理程序。如果要考虑中断置换,可以用35H号系统调用

.DATA
ORIGIN0C DD ?;原中断处理程序放这里
.CODE
...
MOV AH,35H
INT 21H;ES+BX=中断向量
MOV WORD PTR ORIGINOC,BX
MOV WORD PTR ORIGINOC+2,ES
;在进行写中断向量表

中断处理程序

中断处理程序编写要点:

  • 中断向量号要和8259A中对应

  • 为了中断能够嵌套,使用STI打开中断,相应完了再用CLI关闭中断

  • 非自动关闭模式需要发EOI

    MOV AL,20H
    OUT 20H,AL ; 20H是EOI
    
  • 地址从地址译码器看好了,别直接抄书上模板的。主要看CS#的输出

  • 避免在中断处理程序中调用DOS系统调用

模板:

SERVICE PROC FAR
    PUSHA
    PUSH DS
    STI
    ...;主程序,访问具体外设的接口芯片
    CLI
    MOV AL,20H
    OUT 20H,AL;EOI
	POP DS
	POPA
	IRET
SERVICE ENDP