8259A控制编程

一般来说

x86系统中使用2个8259A级联作为中断代理

1个8259A只能管理8个外设,所以如果需要管理超过8个外设,则需要级联更多的8259A。

 当2个8259A级联时,通常主8259A使用特殊完全嵌套方式;从8259A使用完全嵌套方式。这样,当处理器正在处理从8259A的低优先级的中断时,从8259A的高优先级中断可以打断当前处理器正在执行的低优先级中断。

8259A的设置与控制

初始化命令字 (Initialization Command Word)

用于确定是否需要级联,设置起始中断向量,等

  • ICW1:初始化8259A连接方式和中断触发方式 (如:设置主从级联)
  • ICW2:设置中断向量 (IR0对应的中断向量)
  • ICW3:指定主从8259A的级联引脚 (如:从片连接到主片IR2)
  • ICW4:设置8259A的工作模式 (中断嵌套方式)

ICW1:初始化8259A连接方式和中断触发方式

注:ICW1需要写到主片的0x20端口和从片的0xA0端口

ICW2:设置中断向量 (IR0对应的中断向量)

 注:ICW2需要写到主片的0x21端口和从片的0xA1端口

ICW3:指定主从8259A的级联引脚 

  注:ICW3需要写到主片的0x21端口和从片的0xA1端口

ICW4:初始化8259A数据连接方式和中断触发方式

   注:ICW4需要写到主片的0x21端口和从片的0xA1端口

下面是ICW初始化函数

Init8259A:
    ; 初始化主片
    ; 1) 先写 ICW1
	mov al, 0x11					; IC4 = 1, ICW4-write required
	out MASTER_ICW1_PORT, al
	
    call delay
    
    ; 2) 接着写 ICW2
	mov al, 0x20					; interrupt vector = 0x20
	out MASTER_ICW2_PORT, al
	
    call delay
    
    ; 3) 接着写 ICW3				
	mov al, 0x04					; ICW3[2] = 1, for slave connection
	out MASTER_ICW3_PORT, al
	
    call delay
    
    ; 4) 接着写 ICW4
	mov al, 0x01					; ICW4[0] = 1, for Intel Architecture
	out MASTER_ICW4_PORT, al
	
    call delay
    
    ; 初始化从片
    ; 1) 先写 ICW1
	mov al, 0x11					; IC4 = 1, ICW4-write required
	out SLAVE_ICW1_PORT, al
	
    call delay
    
    ; 2) 接着写 ICW2
	mov al, 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的设置与控制

操作命令字 (Operation Command Word)

用于设置中断优先级方式,中断结束模式,等

  • OCW1:屏蔽连接在8259A上的中断源
  • OCW2:设置中断结束方式和优先级模式
  • OCW3:设置特殊屏蔽方式及查询方式

OCW1:屏蔽连接在8259A上的中断源

OCW1命令字最终写入IMR寄存器

  • IMR寄存器为初级中断屏蔽寄存器 (分开关)
  • 如果标志寄存器中的IF位为0,则屏蔽所有外部中断 (总开关)

注:OCW1需要写入主片的0x21端口和从片的0xA1端口

OCW2:设置中断结束方式和优先级模式

 注:OCW2需要写入主片的0x20端口和从片的0xA0端口

OCW3:设置特殊屏蔽方式及查询方式

  注:OCW3需要写入主片的0x20端口和从片的0xA0端口

下面是使用OCW进行控制的函数代码

;--------------------------
; 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
    

小结

英特尔架构的中断系统由中断管理和中断处理构成

处理器负责响应中断以及执行中断服务程序

8259A负责管理中断和裁决中断

8259A是一种可编程中断控制器 (PIC)

  • ICW控制字用于初始化配置
  • OCW控制字用于中断结束及优先级设置
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值