中断和异常相似,都是暂停正在执行的程序去执行其他的,以后还要再转回来。这里要解决两个问题,一个是如何来设置响应的事件类型,另一个是响应某个事件来干什么。
中断有两种,一种是内部中断,有int 调用。另一种是外部中断。
外部中断分为可屏蔽中断和不可屏蔽中断。
不可屏蔽中断要于IF(interrupt flag)无关,直接由cpu来接收。对应的向量号为2.
可屏蔽中断由8259A可编程中断处理器接受然后转给cpu。可根据优先级选择响应某个中断,可设置打开关闭某个中断。
8259A有两片,每片有8根中断信号线。两片是级联连接的。也就是一个连在另一个上,所以共有15个中断信号线。
好,如何来响应事件类型,就好似解决将某个中断信号线和某个中断向量对应起来,通过设置8259A就可以。
如何设置呢?下面是初始化的过程步骤不能颠倒。
1.往端口20h(主片)或A0h(从片)写入ICW1.(011h)
2.往端口21h(主片)或A1h(从片)写入ICW2.
3.往端口21h(主片)或A1h(从片)写入ICW3.(端口21h:004h端口A1h:002h)
4.往端口21h(主片)或A1h(从片)写入ICW4.(001h)
可看到主片对应了20h和21h两个端口,从片对应了A0h和A1h两个端口。
至于ICW(initralization command word)来做一些设置,我没这里只关注ICW2,它来设置对应关系。
ICW2
7 6 5 4 3 2 1 0
低三位来表示是那个中断地址线,高5位来表示中断向量号。这样就对应了起来。如ICW2=020h,则表示0-7号中断地址线对应20h-27h中断向量(这边不是太理解)。
另外还需注意ICW3,这里来选择是哪一个中断地址线链接下级,八位对应八个端口,哪个端口置1哪个端口链接下一级。
接下来是OCW(operation contral word),三个。用来控制打开或关闭中断或通知中断结束。
如何操作关闭中断呢?,屏蔽哪个中断只需往21h或A1h写入OCW1就可以了,对应位置1.
通知中断结束呢?只需往21h或A1h写入OCW2就可以了。(设为21h就行)
??非常不明白,各种ICW,各种OCW怎么区分。