戴十字架有什么讲究:8259A应用举例

来源:百度文库 编辑:中财网 时间:2024/10/14 12:50:04
在Intel 80486 CPU系统中,使用2片8259A管理中断,采用级联方式。主片中的8个中断请求IR7~IR0除IR2扩展从片以外,其他均为系统使用,从片中的8个中断请求IR7~IR0供用户使用。

  硬件连接如图6.22所示。
      

  8259A的硬件连接比较简单,不需要附加其他电路就可以与CPU直接连接。

  系统的工作过程是:当80486 CPU响应8259A的中断请求INT时,向8259A回送中断响应信号,自动进入中断响应总线周期,进行中断处理。

  是由信号通过总线控制逻辑产生,其编码见表2.6,当,的编码是000时,为中断响应周期。时序如图6.23所示:
          

  在第一个周期,CPU向8259A发送第一个脉冲,表示响应INT请求,并利用这个信号将8259A的请求信号IRi复位,同时使总线锁存信号有效,以禁止其他总线主控设备争用总线。

  在第二周期,8259A将中断类型号n通过数据总线送至CPU,由CPU自动完成向量表地址4n运算后,从中断向量表中取出相应的中断向量送入CS:IP中,继而转去执行中断服务子程序。 同时,还利用第二个周期的后沿将INT复位。在自动结束方式中,也是利用这个后沿,将ISR中的中断服务标志位清除。

  【例6.2】 设计一个中断处理程序。要求中断请求信号以跳变方式由IR2引入(可为任一定时脉冲信号),当CPU响应IR2请求时,输出字符串“8259A INTERRUPT!”,中断10次,程序退出(设8259A的端口地址为20H和21H,中断类型号为40H)。

  中断处理程序如下:

  DATA   SEGMENT
  MESS   DB'8259A? INTERRUPT!', 0AH, 0DH, '$'
  COUNT   DB  10         ; 计数值为10
  DATA   ENDS
  STACK   SEGMENT STACK
  STA    DB 100H DUP(?)
  TOP    EQU LENGTH  STA
  STACK   ENDS
  CODE    SEGMENT
  ASSUME  CS:CODE, DS:DATA, SS:STACK
  MAIN:   CLI
  MOV    AX,DATA
  NOV    DS, AX
  MOV    AX, STACK
  MOV    SS, AX
  MOV    SP, TOP
  MOV    AL, 13H          ; 8259A初始化
  OUT    20H, AL         ; 单片, 边沿触发
  MOV    AL, 40H         ; 中断类型号40H
  OUT    21H, AL
  MOV    AL, 01H         ; 非自动结束
  OUT    21H, AL
  MOV    AX, SEG INT-P      ; 设置中断向量
  MOV    DS, AX          ; 中断服务子程序入口段基址送DS
  MOV    DX, OFFSET INT-P     ; 中断服务子程序入口偏移地址送DX
  MOV    AL, 42H         ; IR2的中断类型号42H送AL
  MOV    AH, 25H         ; 25H功能调用
  INT    21H
  IN    AL, 21H         ; 读IMR
  AND    AL, 0FBH        ; 允许IR2请求中断
  OUT    21H, AL         ; 写中断屏蔽字OCW1
  WAIT1:  STI           ; 开中断
  CMP    COUNT,0         ; 判断10次中断是否结束
  JNZ    WAIT1          ; 未结束, 等待
  MOV    AX, 4C00H        ; 结束, 返回DOS
  INT    21H
  INT-P   PROC             ; 中断服务子程序
  PUSH    DS              ; 保护现场
  PUSH    AX
  PUSH    DX
  STI                ; 开中断
  MOV    DS, AX
  MOV    DX, OFFSET MESS
  MOV    AH, 09H
  INT    21H
  DEC    COUNT           ; 控制10次循环
  JNZ    NEXT
  IN     AL, 21H         ; 读IMR
  OR     AL, 04H           ; 屏蔽IR2请求
  OUT    21H, AL
  NEXT:   CLI           ; 关中断
  MOV    AL, 20H           ; 写OCW2, 送中断结束命令EOI
  OUT    20H, AL
  POP    DX            ; 恢复现场
  POP    AX 
  POP    DS
  IRET                ; 中断返回
  INT-P   ENDP
  CODE   ENDS
  END    MAIN