
硬件中断程序设计.pdf
40页硬件中断程序设计实模式下的中断系统中断 (interrupt)是指计算机 “ 暂停 ” 了正在执行的程序,转去处理一个突发的紧急事件的过程处理这个紧急事件,计算机要执行一个相应的中断服务子程序处理完毕之后,计算机又要接着执行刚才被中断了的程序引起中断的事件称为中断源编写中断程序要了解的几个问题1.中断源是什么?什么条件下触发中断?2.中断类型号是多少?中断向量表存放的是什么 ?3.中断服务程序是什么?中断服务程序要完成什么功能?4.中断是否可屏蔽?中断优先级是多少 ?中断过程示意图中断嵌套示意图86系列 CPU的中断源86系列 CPU可处理 256个型号的中断,中断类型号为 0x00 0xff 不可屏蔽中断 NMI可屏蔽中断 INTR外部中断内部中断: 微处理器产生的中断 (除法出错 0x00,溢出 0x04,单步中断 0x01,断点中断 0x03)软件中断: 中断指令产生的软件中断 (DOS,BIOS)中断源Non Maskable Interrupt(NMI) Interrupt request(INTR) 外部中断外部中断通过 CPU的管脚 NMI和 INTR申请中断,也称硬件中断。
中断允许标志 IF( Interrupt Flag )可屏蔽INTR中断0:禁止 CPU响应 INTR中断1:允许 CPU响应 INTR中断IF=中断向量表内存中最低地址开始的 1024个字节作为中断向量表,存放中断服务子程序的地址,每个型号的中断占 4个字节 CPU响应中断请求后,根据中断类型号到中断向量表中找出该型号中断服务程序的地址,执行相应的中断服务程序有关硬件中断的几个函数中断程序设计包括两个部分:1)写一个中断服务子程序,要写成中断函数的形式2)设置中断向量,即把中断服务子程序的地址放到中断向量表中去 1)中断服务函数中断服务子程序要写成函数形式,用关键词interrupt说明void interrupt myint(void){函数体}自定义函数在使用前要说明,格式如下 :void interrupt myint(void);( 2)设置中断向量函数 setvect( )函数格式如下,由 dos.h说明:void setvect(int num , void interrupt(*isr) ( ) );num---中断类型号, isr---指向中断服务函数的函数指针若中断类型号为 0x08,中断服务函数名为 myint,程序如下:#include …setvect(0x08, myint);( 3)获取中断向量函数 getvect( )该函数从中断向量表中取出指定中断类型号的中断服务函数的地址,赋给一个函数指针。
函数用法举例:#include void interrupt(*oldint)();…oldint=getvect(中断类型号);( 4)屏蔽中断函数 disable( )将 IF清 0,禁止 CPU响应 INTR中断,由 dos.h说明函数原形: void disable(void);用 法:#include …disable();( 5)开放中断函数 enable( )将 IF置 1,允许 CPU响应 INTR中断,由 dos.h说明函数原形: void disable(void);用 法:#include …enable();8259A中断控制器8259A为 CPU管理硬件中断 ,每一片 8259A可管理 8个硬件中断源 ,级联使用可管理更多的硬件中断 .PC系列微机中相当有两片 8259A级联 ,管理15个硬件中断源 .8259A的结构中断请求寄存器控 制 逻 辑IRR中断屏蔽寄存器 IMR内部总线优先权处理器中断服务寄存器ISR数据总线缓冲器读 /写逻 辑级联缓冲比较器WRA0CSRDD0~D7SP/ENINTA INTIR0IR1IR2IR3IR4IR5IR6IR7CAS0CAS1CAS28259A的几个主要部分1.中断请求寄存器 IRRIRi(i=0 7)上有中断请求时, IRR相应位置 1。
2.中断屏蔽寄存器 IMRIMR第 i位置 1,屏蔽 IRi上的中断请求3.优先权处理器根据中断屏蔽情况及优先级顺序,决定将那个中断请求送往 CPU4.中断服务寄存器 ISR若某个中断请求被 CPU响应,则相应位置 18259A的编程8259A初始化时设定:中断触发方式为边沿触发主片中断类型号 0x08~ 0x0f从片中断类型号 0x70~ 0x77中断优先级从 IR0到 IR7依次递降采用非自动中断结束方式,即中断服务函数结束前要用软件发出一个中断结束( EOI)命令:outportb(0xa0,0x20);(中断源来自从片)outportb(0x20,0x20);该语句写在中断服务程序的最后高电平低电平中断源IR0 日时钟 (8254通道 0)IR1 键盘IR8 实时钟IR9 软件重新指向 INT 0AHIR10 保留IR2 IR11 保留IR12 保留IR13 协处理器IR14 硬盘IR15 保留IR3 串口 2IR4 串口 1IR5 并口 2IR6 软盘IR7 并口 1(打印机口)8259A的命令字初始化命令字 :ICW1—ICW4 (Initialization Command Word)操作命令字 :OCW1—OCW3(Operation Command Word)ICW1 ICW2 ICW3 ICW4 OCW1 OCW2 OCW3主片 0x20 0x21 0x21 0x21 0x21 0x20 0x20从片 0xa0 0xa1 0xa1 0xa1 0xa1 0xa0 0xa08259A在 PC系列微机中占用的 I/O端口地址LTIM: level triggered interrupt mode SFNM: Special Fully Nested ModeM/S: Master/Slave AEOI: Auto End of InterruptESMM: enable special mask mode P: MicroProcessor初始化命令字初始化时依次设置 ICW1—ICW4几个概念• 普通全嵌套方式(默认方式):一中断正被处理时,只有更高优先级的事件可以打断当前的中断处理过程而被服务。
• 特殊全嵌套方式:一中断正被处理时,允许同级或更高优先级的事件可以打断当前的中断处理过程而被服务• 缓冲方式:在多片 8259A级联的系统中, 8259A通过总线驱动器和数据总线相连,这就是缓冲方式,非缓冲方式:单片 8259A或少量 8259A级联时,可以将 8259A直接与数据总线相连,称为非缓冲方式8086微机 8259A的初始化• 主片 :outportb(0x20, 0x11);outportb(0x21, 0x08);outportb(0x21, 0x04);outportb(0x21, 0x01);• 从片 :outportb(0xa0, 0x11);outportb(0xa1, 0x70);outportb(0xa1, 0x02);outportb(0xa1, 0x01);操作命令字几个概念• 特殊屏蔽方式,即除了被 IMR屏蔽的中断源外, 8259A对任何级别的中断请求都能响应,即使对某些比正在处理的中断级别低的中断请求也能响应特殊屏蔽是在中断处理程序中使用的,用了这种方式之后,尽管系统正在处理高级中断,但对外界来讲,只有同级中断被屏蔽,而允许其它任何级别的中断请求• 对 8259A A0=1的端口地址执行读操作,可读取 IMR状态(随机可读);对 8259A A0=0的端口地址执行读操作,可读取 IRR状态或 ISR状态(先写 OCW3,后读 ) 屏蔽中断源中断屏蔽命令字 OCW1可屏蔽中断源的中断请求。
主片 OCW1地址是 0x21,从片是 0xa1例如,欲屏蔽键盘和串口 1,不改变其它中断源的屏蔽情况 char b;……b=inportb(0x21);b=b|0x12;outportb(0x21,b);8254定时 /计数器8254是可编程的定时 /计数器,兼容 8253,有 3个可独立编程的 16位定时 /计数器数据总线缓冲器读 /写逻辑控制字寄存器通道 0通道 1通道 2D7~D0RDWRA0A1CSCLK0GATE0OUT0CLK1GATE1OUT1CLK2GATE2OUT2内部总线8254的编程通过写控制字可确定每个通道的工作方式方式 0:计数结束输出正跃变信号方式 1:单脉冲发生器方式 2:分频器方式 3: 方波发生器 (分频器方式)方式 4:软件触发的单脉冲发生器方式 5:硬件触发的单脉冲发生器控制字寄存器 (0x43)SC1 SC0 RL1 RL0 M2 M1 M0 BCD通道选择读写方式选择工作方式选择数制选择SC1 SC0 选通道,表明对那个通道进行操作0 0 通道 00 1 通道 11 0 通道 21 1 无效D7 D6 D5 D4 D3 D2 D1 D0读写方式RL1 RL0 确定读写计数值的方法和顺序0 0 锁定当前计数值,供 CPU读0 1 只读 /写低 8位1 0 只读 /写高 8位1 1 先读 /写低 8位,再读 /写高 8位确定工作方式M2M1M0 确定通道的工作方式0 0 0 方式 00 0 1 方式 1X 1 0 方式 2X 1 1 方式 31 0 0 方式 41 0 1 方式 5BCD=1:BCD码计数BCD=0:二进制计数0~99990~655358254在 PC机中的应用8254有两条地址线,占 4个连续的 I/O端口地址。
通道 通道 0 通道 1 通道 2 控制字寄存器I/O地址 0x40 0x41 0x42 0x43通道 0用于电子钟定时基准, OUT0接到 8259A的IR0作为中断源,中断类型号 08H.通道 1用于动态 RAM刷新 通道 2产生音频信号,供喇叭发声 通道 2• outportb(0x43,0xb6);通道 0的工作方式通道 0初始化为方式 3 — 方 波频率发生器, OUT0端产生方波,方波的频率等于 CLK0端输入脉冲频率除以计数初值TCLK0输入脉冲频率为 1.193MHz( 1193182 Hz)周期为 1/1.193MHz≈838ns通道 0 作为计数器,每 838ns计数值减 1,减到 0时又自动恢复计数初值这时 OUT0输出的方波完成一个周期,方波的上升沿触发一次中断计数初值方波的频率 f2等于输入脉冲频率 f1除以计数初值 Nf2=f1/N方波的周期 T2 =1/f2等于输入脉冲周期 T1=1/f1乘以计数初值 NT2=T1× N计数初值 N等于方波的周期 T2(单位为秒 )除以输入脉冲周期 T1N=T2/T1=T2/838ns更精确的办法: N=T2*1193182;通道 0的初始化MOV AL,36HOUT 43H,ALMOV AL,0OUT 40H,ALOUT 40H,AL控制字 36H=00110110BD7 D6 D5 D4 D3 D2 D1 D0 0 0 1 1 0 1 1 0选 0通道先写低 8位再写高 8位方式 3 二进制计数0000000000000000-) 111111111111111110-1=65535!0经 65536次减 1后又减到 0方波完成一个周期, 0相当最大的。












