36 - 8259A控制编程

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)深入浅出操作系统 - 目录

1. 一般情况

  • x86系统中使用 2个 8259A级联作为中断控制器
    在这里插入图片描述

2. 问题

  • 如何具体的设置和控制8259A?

3. 8259A的设置与控制

  • 初始化命令字( Initialization Command Word )
  • 用于确定是否需要级联,设置起始中断向量,等
    • ICW1:初始化8259A连接方式和中断触发方式(如:设置主从级联)
    • ICW2:设置起始中断向量,IR0对应的中断向量
    • ICW3:指定主从8259A的级联引脚(如:从片连接到主片IRQ2)
    • ICW4:设置8259A的工作模式(中断嵌套方式)

3.1 初始化命令字ICW

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

在这里插入图片描述

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

3.1.2 ICW2:设置起始中断向量,IR0对应的中断向量

在这里插入图片描述

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

在这里插入图片描述

; 主片
 ; 2) 接着写 ICW2
    mov al, 0x20					; interrupt vector = 0x20
    out MASTER_ICW2_PORT, al
; 从片
 ; 2) 接着写 ICW2
    mov al, 0x28					; interrupt vector = 0x28
    out SLAVE_ICW2_PORT, al

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

在这里插入图片描述

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

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

在这里插入图片描述

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

3.1.5 实例分析:使用ICW进行初始化

Init8259A:
    ; 初始化主片
    ; 1) 先写 ICW1,初始化8259A连接方式和中断触发方式
    mov al, 0x11			; IC4 = 1, ICW4-write required
    out MASTER_ICW1_PORT, al
    call delay
    
    ; 2) 接着写 ICW2,设置起始中断向量,IR0对应的中断向量
    mov al, 0x20			; interrupt vector = 0x20
    out MASTER_ICW2_PORT, al
    call delay
    
    ; 3) 接着写 ICW3,指定主从8259A的级联引脚
    mov al, 0x04			; ICW3[2] = 1, for slave connection
    out MASTER_ICW3_PORT, al
    call delay
    
    ; 4) 接着写 ICW4,初始化8259A数据连接方式和中断触发方式
    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

3.2 操作命令字OCW

  • 操作命令字(Operation Command Word)
  • 用于设置中断优先级方式、中断结束模式、等
    • OCW1:屏蔽连接在8259A上的中断源
    • OCW2:设置中断结束方式和优先级模式
    • OCW3:设置特殊屏蔽方式及查询方式

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

  • OCW1命令字最终写入IMR寄存器
    • IMR寄存器为初级中断屏蔽寄存器(分开关)
    • 如果处理器的标志寄存器中的IF位为0,则屏蔽所有外部中断(总开关)

在这里插入图片描述

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

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

在这里插入图片描述
注:OCW2需要写入主片的0x20端口和从片的0xA0端口
例:
在这里插入图片描述

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

在这里插入图片描述

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

3.2.4 实例分析:使用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

4. 小结

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuxiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值