Q:不同外设如何下个处理器发送中断信号?当多个外设同时产生中断时,如何进行处理? 已知可以通过引脚与外设相连,但是实际上外设过多,同时产生中断,会产生错误,同时高速的CPU与低速的外设相连也是不符合实际的。这时需要一个中间代理来处理中断-8259A(两者之间的交互变简单)

一.8259A-可编程中断控制器

1.可通过编程对8259A进行功能设置 2.屏蔽外设中断,对中断进行优先级判决 3.向处理器通过中断向量 过程为:当一个外设与8259A相接时,首先会通过中断屏蔽寄存器(8个字节),在这里进行配置屏蔽(为0时放行,1时屏蔽),剩下的中断会进入中断请求寄存器,接下来通过INT引脚通知处理器,处理器进行应答,接下来会会通过PR优先判别,最后通过ISP对其寄存器进行处理(置1),最后处理器通过中断服务程序对外设进行处理,结束之后会在ISP将其置0. 8259A工作方式

a.中断触发方式

1.边沿触发-中断引脚电平变化的一瞬间认为中断申请到来(上升沿触发) 2.电平触发-中断引脚上的信号保持稳点电平一定时间后认为中断申请到来

b.数据连接方式

1.非缓存方式-将8259A直接与数据总线相连 2.缓冲方式-将8259A通过总线驱动器和数据总线相连

c.中断优先方式

1.固定优先级方式-优先级由高到低(这样会使得最低位的中断永远不会实现) 2.自动循环方式-某一中断请求被响应后,该中断源优先级自动为最低 3.特殊循环方式-通过编程指点其中断源优先级称为最低,其他中断源优先级自动改变

d.中断嵌套方式

1.完全嵌套方式(默认)-执行中断服务程序期间,不响应本级中断和较低级中断 2.特殊完全嵌套方式-执行中断服务程序期间,可响应本级中断,不想要较低级中断

e.中断屏蔽方式

1.普通屏蔽方式-将IMR中的某一位置为1,屏蔽掉相应级别的中断请求 2.特殊屏蔽方式-未被屏蔽的中断源均可在某个中断服务程序中相应,即低优先级中断可以打断正在服务的高优先级中断

f.中断结束方式

1.自动结束方式(适用于非多重中断的情况)-8259A自动清除ISR中已制位的优先级最高的位 2.手动结束方式-在中断服务程序的最后,向8259A发中断结束命令,将ISR中相应的位清除,表明中断服务程序已完成

二.8259A控制编程

一般来说,X86系统中使用2个8259A级联作为中断代理 从上图可以得知,只有一个8259A(主)能连接到CPU,剩下的(从)只能级联,只能连接到主8259A的中断引脚上。

8259A的设置与控制

1.初始化命令字 2.用于确定是否需要级联,设置起始中断向量等 ICW1:初始化8259A连接方式和中断触发方式 ICW2:设置起始中断向量 ICW3:指定主从8259A的级联引脚 ICW4:初始化8259A数据连接方式和中断触发方式 简单代码演示

Init8259A:
    ; 初始化主片
    ; 1) 先写 ICW1
	mov al, 0x11;00010001二进制				; IC4 = 1, ICW4-write required
	out MASTER_ICW1_PORT, al;对应0x20端口
	
    call delay
    
    ; 2) 接着写 ICW2
	mov al, 0x20;00100000低三位为0					; interrupt vector = 0x20
	out MASTER_ICW2_PORT, al
	
    call delay
    
    ; 3) 接着写 ICW3				
	mov al, 0x04;00000100					; ICW3[2] = 1, for slave connection
	out MASTER_ICW3_PORT, al
	
    call delay
    
    ; 4) 接着写 ICW4
	mov al, 0x01;00000001					; ICW4[0] = 1, for Intel Architecture
	out MASTER_ICW4_PORT, al
	
    call delay
    
    ; 初始化从片
    ; 1) 先写 ICW1
	mov al, 0x11;00010001					; IC4 = 1, ICW4-write required
	out SLAVE_ICW1_PORT, al
	
    call delay
    
    ; 2) 接着写 ICW2
	mov al, 0x28;相差8位主从0x20开始需要8位所以从机从0x28开始					; interrupt vector = 0x28
	out SLAVE_ICW2_PORT, al
    
	call delay
    
    ; 3) 接着写 ICW3				
	mov al, 0x02					; ICW3[1] = 1, connect to master IR2
	out SLAVE_ICW3_PORT, al
    
	call delay
    
    ; 4) 接着写 ICW4
	mov al, 0x01					; for Intel Architecture
	out SLAVE_ICW4_PORT, al		
    
    call delay
    
	ret

8259A的设置与控制

1.操作命令字 2.用于设置中断优先级方式,中断结束模式 OCW1:屏蔽连接在8259A上的中断源 OCW1命令字最终写入IMR寄存器-IMR寄存器为初级中断屏蔽寄存器,如果标志寄存器中的IF为0,则屏蔽所有外部中断 OCW2:设置中断结束方式和优先级模式 OCW3:设置特殊屏蔽方式及查询方式 代码演示

;--------------------------
; write_EOI:
;--------------------------
write_master_EOI:
	mov al, 00100000B				; OCW2 select, EOI
	out MASTER_OCW2_PORT, al
	ret
        
write_slave_EOI:
    mov al,  00100000B
    out SLAVE_OCW2_PORT, al
    ret

;----------------------------
; read_isr:
;----------------------------
read_master_isr:
	mov al, 00001011B			; OCW3 select, read ISR
	out MASTER_OCW3_PORT, al
	jmp $+2
	in al, MASTER_OCW3_PORT
	ret
    
read_slave_isr:
	mov al, 00001011B
    out SLAVE_OCW3_PORT, al
    jmp $+2
    in al, SLAVE_OCW3_PORT
    ret
    
;-----------------------------
; read_irr:
;-----------------------------
read_master_irr:
	mov al, 00001010B			; OCW3 select, read IRR	
	out MASTER_OCW3_PORT, al
	jmp $+2
	in al, MASTER_OCW3_PORT
	ret

read_slave_irr:
    mov al, 00001010B
    out SLAVE_OCW3_PORT, al
    jmp $+2
    in al, SLAVE_OCW3_PORT
    ret
        
;-----------------------------
; read_imr:
;-----------------------------
read_master_imr:
	in al, MASTER_IMR_PORT
	ret
        
read_slave_imr:
    in al, SLAVE_IMR_PORT
    ret
    
;------------------------------
; send_smm_command
;------------------------------
send_smm_command:
	mov al, 01101000B			; SMM=ESMM=1, OCW3 select
	out MASTER_OCW3_PORT, al	
	ret
    

小结

1.英特尔架构的中断系统由中断管理和中断处理构成 2.处理器负责响应中断以及执行中断服务程序 3.8259A负责管理中断和裁决中断-ICW控制字用于初始化配置,OCW控制字用于中断结束及优先级设置