可编程中断控制器8259A

微机接口技术——中断

中断的基本概念

中断:是指CPU在执行程序的过程中,由于某种外部或内部事件的作用,使CPU停止当前正在执行的程序而转去为该事件服务,待时间服务结束后,又能自动返回到被中止了的程序中继续执行的过程。

中断源:能够引发CPU中断的信息源

比如:8254 0#,由此引发的中断称为日时钟中断;

键盘接口,由此引发的中断称为键盘中断;

设备故障,由此引发的中断称为故障中断

中断的分类

  • 外部中断 : 外部事件引发的中断

    • 即由CPU以外的设备发出,并由CPU的中断请求信号引脚输入所引发的中断称为外部中断,也叫硬件中断
  • 内部中断 : 由CPU内部事件,即由CPU硬件故障或程序执行中的事件所引发的中断称为内部中断。

    ​ 拓展:又分为软件中断和异常

    • 软件中断 : 执行有定义的INT n指令而引发的中断

      • BIOS中断
      • DOS中断
        • DOS专用中断
        • DOS保留中断
        • 用户可调用的DOS中断
        • 保留给用户开发的中断
    • 异常 : 由于CPU本身故障、程序故障等引发的中断

      • 故障(Fault)
      • 陷阱(Trap)
      • 中止(Abort)
  • 软件中断由于程序事先安排好,因此发生时间可预知;而外部中断和异常的发生是随机的。

中断系统为实现中断而采取的硬件,软件措施

中断系统应具备的基本功能

  • 对于硬件中断,接口电路中应具备屏蔽开放的功能,这种功能由程序员通过软件去控制。

  • 能实现中断判优(中断排队),当有多个中断源提出请求时,应能优先响应高级别的中断。

  • 能够实现中断嵌套,即高级别的中断源能够中断低级别中断服务程序

  • 响应中断后,能自动转入中断处理,处理完毕能自动返回断点

80X86 中断指令

  1. 开中断指令 STI

    ​ 功能:使F寄存器中I标志置1,CPU处于开中断状态

  2. 关中断指令 CLI

    ​ 功能:使F寄存器中I标志置0,CPU处于关中断状态。

  3. 软件中断指令 INT n

    ​ 为中断类型码,n为0~255之间有定义的无符号整数

    ​ 功能:无条件转向n型中断服务子程序

  4. 中断返回指令 IRET

    ​ 功能:依次从栈顶弹出6个元素→ IP,CS,F

    ​ 如果栈顶INT n断口地址,则执行IRET后,返回断点,否则不能。

请添加图片描述

  • IRET 是中断服务子程序的出口指令

  • IRETRET的区别

    • IRET从栈顶弹出6 个元素→ IP,CS,F

      远程RET,从栈顶弹出4个元素→ IP,CS

      近程RET,从栈顶弹出2个元素→IP

中断向量和中断向量表

  • 中断系统是为实现中断而采取的软,硬件措施

  • 中断指令中断向量中断向量表是实现中断的重要软件措施。

CPU依据中断向量号获取中断服务子程序入口地址,但在实模式下和保护模式下采用不同的途径:

  1. 中断向量中断向量是实模式下,中断服务子程序的入口地址

    它由2部分组成:

    • 服务程序所在代码段的段基址 2 个字节
    • 服务程序入口的偏移地址 2 个字节
    • 中断服务程序入口的物理地址 = 段 基 址 ( 十 六 进 制 ) × 16 + 偏 移 地 址 ( 十 六 进 制 ) 段基址(十六进制) \times 16 + 偏移地址(十六进制) ()×16+()
      • 2 4 = 16 2^4 = 16 24=16, 对于二进制就是左移4位, 对十六进制就是左移一位
  2. 中断向量表: 所有中断向量的集合

  3. 中断向量表的设置

    CPU规定:在实模式下,中断向量表需设置在系统的RAM最低端1K单元(0 ~ 3FFH)

  4. 中断向量表的表地址与中断类型的关系

    举个栗子 : 21H型中断向量:存放在84H~ 87H单元中

    ​ 问:9CH型中断向量存放在何处?

    解: ∵ 9 C H × 4 = 9CH× 4= 9CH×4= 10011100 00 = 270 H =270H =270H

    ​ ∴ 9 C H 9CH 9CH型中断向量存于 270 H ~ 273 H 270H ~ 273H 270H273H单元中

    注: n × 4 = n 的 二 进 制 后 接 00 n\times 4 = n的二进制后接00 n×4=n00 即相当二进制后面接两个零, 相当于 2 2 = 4 2^2 = 4 22=4

    十进制数后加0相当于乘以10; 同理, 二进制数后加0相当于乘以2.


请添加图片描述


请添加图片描述


请添加图片描述


请添加图片描述


  • 每个入口占用4 Bytes (即每个中断向量占4字节), 低字为段内偏移 , 高字为段基址;
  • 中断向量表大小为1 KB (即1024 Bytes) , 共 256 个入口
    • 每个中断号对应的中断向量占4个字节, 有256个中断号, 4 × 256 = 1024 4\times 256 = 1024 4×256=1024个字节, 即 1 K B 1KB 1KB.

例子:某中断的中断类型号为68H,试述中断操作过程。

​ 解:

​ ① 取中断类型号68H

​ ② 计算中断向量地址 68 H × 4 = 1 A 0 H 68H×4=1A0H 68H×4=1A0H

​ ③ 取中断入口地址 C S = A 000

可编程中断控制器8259A是计算机系统中常用的中断管理芯片,主要用于管理和控制外部设备的中断请求。以下是一个简单的8259A实验代码、过程与结果的介绍。 ### 实验代码 ```c #include <stdio.h> #include <conio.h> #define MASTER_8259A_PORT 0x20 #define SLAVE_8259A_PORT 0xA0 // 初始化8259A void init_8259A() { // 初始化主8259A outportb(MASTER_8259A_PORT + 1, 0x11); // ICW1: edge triggered, cascade mode outportb(MASTER_8259A_PORT, 0x20); // ICW2: IRQ0-7 mapped to 0x20-0x27 outportb(MASTER_8259A_PORT + 1, 0x04); // ICW3: slave connected to IRQ2 outportb(MASTER_8259A_PORT + 1, 0x01); // ICW4: 8086 mode // 初始化从8259A outportb(SLAVE_8259A_PORT + 1, 0x11); // ICW1: edge triggered, cascade mode outportb(SLAVE_8259A_PORT, 0x28); // ICW2: IRQ8-15 mapped to 0x28-0x2F outportb(SLAVE_8259A_PORT + 1, 0x02); // ICW3: slave ID is 2 outportb(SLAVE_8259A_PORT + 1, 0x01); // ICW4: 8086 mode // 屏蔽所有中断 outportb(MASTER_8259A_PORT + 1, 0xFF); outportb(SLAVE_8259A_PORT + 1, 0xFF); } // 中断服务程序 void interrupt_handler() { printf("Interrupt received!\n"); // 发送EOI信号 outportb(MASTER_8259A_PORT, 0x20); outportb(SLAVE_8259A_PORT, 0x20); } int main() { init_8259A(); // 设置中断向量 setvect(0x21, interrupt_handler); // 开启主8259A的IRQ0 outportb(MASTER_8259A_PORT + 1, 0xFE); printf("Waiting for interrupt...\n"); while (1) { // 主循环 } return 0; } ``` ### 实验过程 1. **初始化8259A**:通过向8259A的控制端口发送初始化命令字(ICW)来配置中断向量和中断模式。 2. **设置中断服务程序**:使用`setvect`函数将中断向量0x21与中断服务程序`interrupt_handler`关联。 3. **开启中断**:通过向主8259A的控制端口发送命令字,开启特定的中断请求线(IRQ)。 4. **等待中断**:在主循环中等待中断发生。 ### 实验结果 当外部设备通过IRQ0发送中断请求时,中断服务程序`interrupt_handler`会被调用,屏幕上会显示“Interrupt received!”。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值