6.17可编程中断控制器8259A

6.17可编程中断控制器8259A

8259A的整体概貌

8259A端口的介绍

D0~D7:与CPU交互的端口,CPU给8259的数据是给到这些端口(out),cpu从8259取信息也是从这些端口取(in),是双向的,通过in,out命令来交互

IR0~TR7:这些port负责接收外部设备传过来的中断请求信号,单向,从外部输入8259,一片8259管理8个中断源

CAS0~CAS2:级联工作线(级联线),主片上是往外输出的,从片是往里输入的\

~WR与~RD:写控制端和读控制端

A0:片内偏址地址线

~CS:片选信号(片外寻址)

~SP/EN:非缓冲和缓冲两种工作方式,缓冲状态cpu和 D0~D7之间多个245缓冲器,非缓冲状态是直连

INT:连向cpu里面的INTR,用来向CPU输出中断信号,看~CS的信号,区别是高阻态还是其他态

~INTA:cpu响应中断的信号

GND:为1时代表有从片工作

cpu输出给8259的两个下降沿,在第一个下降沿,8259将IR0IR7中收到的中断类型号发送到D0D7中,然后等CPU来取,在第二格下降沿,cpu给8259的~INTA端口一个信号,8259就接收了cpu的反馈信号

在第二个下降沿时候,要结束INT的高电平(壁面同级中断请求中断这个请求),这个地方我不是很不理解后面补充

8259A工作方式的介绍

我们一般采用常采用完全嵌套方式(正常嵌套方式/固定优先权)+非自动EOI方式+非缓冲方式

8259A从片收到中断源请求

从片收到中断源请求后,给主片(IR0IR7)中的某几个端口信号,然后主片INT給CPU信号,CPU反馈给INTA(主片和所有从片的INTA都是连一起的),在第二个负脉冲时候,主片通过CAS0CAS2输出(如001,则是IR1级联的那个从片过来的中断信号),然后将CPU的反馈信息交给从片处理,从片把对应的中断类型号给到D0~D7,然后被CPU取走了

8259A内部组成

IRR(中断请求寄存器),ISR(中断服务寄存器),IMR(中断屏蔽字寄存器),控制逻辑电路(编程主要操作这里面的端口),

ISR

ISR第一位为1表示8259A已经给外设服务了,但是CPU还未对8259A服务(已经給中断源服务了,但是CPU未服务)

IMR

某一位为1代表屏蔽了IR对应位的中断,8086CPU中断受两个信号控制:IF(eflags寄存器里面的一位)和IMR

8259A的控制逻辑电路

初始化命令寄存器ICW1~ICW4

ICW1:设置8259是单片工作还是级联工作

ICW2:设置中断类型号基址(IR0对应的中断类型号)

ICW3:级联时才用ICW3,单片时不用ICW3,告诉主片谁被级联了,告诉从片级联上哪个主片了(主从片的ICW3功能不一样)

ICW4:设置优先权的方式,固定优先权(正常嵌套方式IR0最高),循环优先权(IR0响应后,IR1最高,有点像时间片优先算法)

运行命令寄存器OCW1~OCW3

可以在8259运行期间改变方式(一般不改变)

OCW1(操作命令字寄存器),给IMR写命令

OCW2(告诉8259中断结束了)

OCW3改变8259中断屏蔽方式(一般不用)

A0与~CS还有D0~D7来判断要写以上7个端口哪个端口

主片地址:20H(A0=0),21H(A0=1) 从片地址:A0H(A0=0),A1H(A0=1)

BIOS初始化8259A时候,中断类型号主片基址08H,从片基址70H

8259A的编程

1.初始化(ICW1~ICW4)
ICW1初始化

A0=0

D3位为1则表示中断请求信号上升沿有效(高电平有效)

D2位8086中没有用(8085的8位机有用.但是这个淘汰了)

D1为1则表示单片8259工作,为0表示级联工作(初始化ICW1后还要初始化ICW3)

D0为1固定死了(初始化ICW4,但是都要初始化ICW4)

主片初始化

mov AL,11H

OUT 20H(直接寻址), AL

将AL中的内容(00010001)写入地址为20H的设备上(主片的地址,由特征码写到主片的ICW1中)

从片初始化

mov AL,11H

out 0A0H(从片端口地址),AL

ICW2初始化

A0=1(主片ICW2特征码)

给主片确定中断类型号的基址

mov AL,08H

out 21H,AL

给从片确定中断类型号的基址

从片无A0特征码,怎么识别呢?

靠顺序识别

ICW1->ICW2紧紧跟随

初始化从片ICW2,要先初始化ICW1,按顺序来初始化(自己不是很懂)

ICW3初始化

A0=1

主片

主片某一位写了1就代表主片对应的IR被从片级联了(最多级联8个从片)

主片IR3位被级联了

mov AL,08H

OUT 21H,AL

从片

看后三位,上图表示从片的INT输出级联到主片的IR3上了

mov AL,03H

OUT 21H,AL

ICW4初始化

A0=1

D4为0表示正常嵌套方式(优先权固定,IR0最高),为1表示特殊嵌套方式

D2与D3为00表示非缓冲

D1为0表示非自动中断结束(在中断服务程序结束之前给OCW2里面写EOI中断结束命令,告诉8259中断over),为1表示自动中断结束(本质就是说ISR位清0是自动还是非自动的)

D5,D6,D7默认为0

主片icw4初始化

mov AL,01H

OUT 21H,AL

从片icw4初始化

MOV AL,01H

OUT 0A1H,AL

2.OCW1~OCW3

ICW4初始化完了才进入OCW

OCW1

往IMR里面写中断屏蔽字,通过OCW1,读中断屏蔽字直接就是从IMR寄存器中读

A0=1

Di位为1则代表对应的IRi位被屏蔽

OCW2

A0=0

EOI位(D5位)写入1,表明CPU通知8259结束正在服务的中断(ISRi=0)

主片

MOV AL,20H

OUT 20H,AL

和自己x86系统结合

//irq.c
void irq_init(void) {	
	```
    ```
    ```
	// 初始化pic 控制器
	init_pic();
}
//irq.c
static void init_pic(void) {
    // 边缘触发,级联,需要配置icw4, 8086模式
    outb(PIC0_ICW1, PIC_ICW1_ALWAYS_1 | PIC_ICW1_ICW4);

    // 对应的中断号起始序号0x20
    outb(PIC0_ICW2, IRQ_PIC_START);

    // 主片IRQ2有从片
    outb(PIC0_ICW3, 1 << 2);

    // 普通全嵌套、非缓冲、非自动结束、8086模式
    outb(PIC0_ICW4, PIC_ICW4_8086);

    // 边缘触发,级联,需要配置icw4, 8086模式
    outb(PIC1_ICW1, PIC_ICW1_ICW4 | PIC_ICW1_ALWAYS_1);

    // 起始中断序号,要加上8
    outb(PIC1_ICW2, IRQ_PIC_START + 8);

    // 没有从片,连接到主片的IRQ2上
    outb(PIC1_ICW3, 2);

    // 普通全嵌套、非缓冲、非自动结束、8086模式
    outb(PIC1_ICW4, PIC_ICW4_8086);

    // 禁止所有中断, 允许从PIC1传来的中断
    outb(PIC0_IMR, 0xFF & ~(1 << 2)); //现在还没有为外设配置好中断处理程序,就不能打开中断  
    outb(PIC1_IMR, 0xFF); //屏蔽两块芯片的中断
}
//irq.h
// PIC控制器相关的寄存器及位配置
#define PIC0_ICW1			0x20
#define PIC0_ICW2			0x21
#define PIC0_ICW3			0x21
#define PIC0_ICW4			0x21
#define PIC0_OCW2			0x20
#define PIC0_IMR			0x21

#define PIC1_ICW1			0xa0
#define PIC1_ICW2			0xa1
#define PIC1_ICW3			0xa1
#define PIC1_ICW4			0xa1
#define PIC1_OCW2			0xa0
#define PIC1_IMR			0xa1

#define PIC_ICW1_ICW4		(1 << 0)		// 需要初始化ICW4
#define PIC_ICW1_ALWAYS_1	(1 << 4)		// 总为1的位
#define PIC_ICW4_8086	    (1 << 0)        // 8086工作模式

#define IRQ_PIC_START		0x20			// PIC中断起始号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值