您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 02硬件中断程序设计095
硬件中断程序设计实模式下的中断系统中断(interrupt)是指计算机“暂停”了正在执行的程序,转去处理一个突发的紧急事件的过程。处理这个紧急事件,计算机要执行一个相应的中断服务子程序。处理完毕之后,计算机又要接着执行刚才被中断了的程序。引起中断的事件称为中断源。编写中断程序要了解的几个问题1.中断源是什么?什么条件下触发中断?2.中断类型号是多少?中断向量表存放的是什么?3.中断服务程序是什么?中断服务程序要完成什么功能?4.中断是否可屏蔽?中断优先级是多少?中断过程示意图中断嵌套示意图86系列CPU的中断源86系列CPU可处理256个型号的中断,中断类型号为0x000xff。不可屏蔽中断NMI可屏蔽中断INTR外部中断内部中断:微处理器产生的中断(除法出错0x00,溢出0x04,单步中断0x01,断点中断0x03)软件中断:中断指令产生的软件中断(DOS,BIOS)中断源NonMaskableInterrupt(NMI)Interruptrequest(INTR)外部中断外部中断通过CPU的管脚NMI和INTR申请中断,也称硬件中断。中断允许标志IF(InterruptFlag)可屏蔽INTR中断。0:禁止CPU响应INTR中断1:允许CPU响应INTR中断IF=中断向量表内存中最低地址开始的1024个字节作为中断向量表,存放中断服务子程序的地址,每个型号的中断占4个字节。CPU响应中断请求后,根据中断类型号到中断向量表中找出该型号中断服务程序的地址,执行相应的中断服务程序。有关硬件中断的几个函数中断程序设计包括两个部分:1)写一个中断服务子程序,要写成中断函数的形式。2)设置中断向量,即把中断服务子程序的地址放到中断向量表中去。(1)中断服务函数中断服务子程序要写成函数形式,用关键词interrupt说明。voidinterruptmyint(void){函数体}自定义函数在使用前要说明,格式如下:voidinterruptmyint(void);(2)设置中断向量函数setvect()函数格式如下,由dos.h说明:voidsetvect(intnum,voidinterrupt(*isr)());num---中断类型号,isr---指向中断服务函数的函数指针若中断类型号为0x08,中断服务函数名为myint,程序如下:#includedos.h…setvect(0x08,myint);(3)获取中断向量函数getvect()该函数从中断向量表中取出指定中断类型号的中断服务函数的地址,赋给一个函数指针。函数用法举例:#includedos.hvoidinterrupt(*oldint)();…oldint=getvect(中断类型号);(4)屏蔽中断函数disable()将IF清0,禁止CPU响应INTR中断,由dos.h说明。函数原形:voiddisable(void);用法:#includedos.h…disable();(5)开放中断函数enable()将IF置1,允许CPU响应INTR中断,由dos.h说明。函数原形:voiddisable(void);用法:#includedos.h…enable();8259A中断控制器8259A为CPU管理硬件中断,每一片8259A可管理8个硬件中断源,级联使用可管理更多的硬件中断.PC系列微机中相当有两片8259A级联,管理15个硬件中断源.8259A的结构中断请求寄存器控制逻辑IRR中断屏蔽寄存器IMR内部总线优先权处理器中断服务寄存器ISR数据总线缓冲器读/写逻辑级联缓冲比较器WRA0CSRDD0~D7SP/ENINTAINTIR0IR1IR2IR3IR4IR5IR6IR7CAS0CAS1CAS28259A的几个主要部分1.中断请求寄存器IRRIRi(i=07)上有中断请求时,IRR相应位置1。2.中断屏蔽寄存器IMRIMR第i位置1,屏蔽IRi上的中断请求。3.优先权处理器根据中断屏蔽情况及优先级顺序,决定将那个中断请求送往CPU。4.中断服务寄存器ISR若某个中断请求被CPU响应,则相应位置1。8259A的编程8259A初始化时设定:中断触发方式为边沿触发主片中断类型号0x08~0x0f从片中断类型号0x70~0x77中断优先级从IR0到IR7依次递降采用非自动中断结束方式,即中断服务函数结束前要用软件发出一个中断结束(EOI)命令:outportb(0xa0,0x20);(中断源来自从片)outportb(0x20,0x20);该语句写在中断服务程序的最后高电平低电平中断源IR0日时钟(8254通道0)IR1键盘IR8实时钟IR9软件重新指向INT0AHIR10保留IR2IR11保留IR12保留IR13协处理器IR14硬盘IR15保留IR3串口2IR4串口1IR5并口2IR6软盘IR7并口1(打印机口)8259A的命令字初始化命令字:ICW1—ICW4(InitializationCommandWord)操作命令字:OCW1—OCW3(OperationCommandWord)ICW1ICW2ICW3ICW4OCW1OCW2OCW3主片0x200x210x210x210x210x200x20从片0xa00xa10xa10xa10xa10xa00xa08259A在PC系列微机中占用的I/O端口地址LTIM:leveltriggeredinterruptmodeSFNM:SpecialFullyNestedModeM/S:Master/SlaveAEOI:AutoEndofInterruptESMM:enablespecialmaskmodeP: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对任何级别的中断请求都能响应,即使对某些比正在处理的中断级别低的中断请求也能响应。特殊屏蔽是在中断处理程序中使用的,用了这种方式之后,尽管系统正在处理高级中断,但对外界来讲,只有同级中断被屏蔽,而允许其它任何级别的中断请求•对8259AA0=1的端口地址执行读操作,可读取IMR状态(随机可读);对8259AA0=0的端口地址执行读操作,可读取IRR状态或ISR状态(先写OCW3,后读)屏蔽中断源中断屏蔽命令字OCW1可屏蔽中断源的中断请求。主片OCW1地址是0x21,从片是0xa1。例如,欲屏蔽键盘和串口1,不改变其它中断源的屏蔽情况。charb;……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)SC1SC0RL1RL0M2M1M0BCD通道选择读写方式选择工作方式选择数制选择SC1SC0选通道,表明对那个通道进行操作。00通道001通道110通道211无效D7D6D5D4D3D2D1D0读写方式RL1RL0确定读写计数值的方法和顺序00锁定当前计数值,供CPU读01只读/写低8位10只读/写高8位11先读/写低8位,再读/写高8位确定工作方式M2M1M0确定通道的工作方式000方式0001方式1X10方式2X11方式3100方式4101方式5BCD=1:BCD码计数BCD=0:二进制计数0~99990~655358254在PC机中的应用8254有两条地址线,占4个连续的I/O端口地址。通道通道0通道1通道2控制字寄存器I/O地址0x400x410x420x43通道0用于电子钟定时基准,OUT0接到8259A的IR0作为中断源,中断类型号08H.。通道1用于动态RAM刷新。通道2产生音频信号,供喇叭发声。通道0的工作方式通道0初始化为方式3—方波频率发生器,OUT0端产生方波,方波的频率等于CLK0端输入脉冲频率除以计数初值。TCLK0输入脉冲频率为1.193MHz(1193182Hz)周期为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的初始化MOVAL,36HOUT43H,ALMOVAL,0OUT40H,ALOUT40H,AL控制字36H=00110110BD7D6D5D4D3D2D1D000110110选0通道先写低8位再写高8位方式3二进制计数0000000000000000-)111111111111111110-1=65535!0经65536次减1后又减到0方波完成一个周期,0相当最大的计数初值65536。通道0的中断周期通道0的计数初值相当于65536方波的频率1.193MHz/65536≈18.2Hz方波的周期838ns*6553655ms通道0每55ms申请一次中断,每秒18.2次通道0的中断服务子程序TIMER-INT固化在BIOS中,有三个功能:1.进行年、月、日、时、分、秒的计时。2.软盘I/O时,确定软驱电机停止转动的时间。3.发出一个1CH类软中断,可以调用一个用户程序。思考题1.若希望10ms中断一次,计数初值是多少?2.若CLK0输入脉冲频率为2MHz,采用二进制计数和BCD码计数时最大的中断周期是多少?3.若CLK0输入脉冲频率为4MHz,希望中断周期为10ms,写出初始化程序。时钟中断程序举例利用8254的通道0作为实时时钟定时,每10ms中断一次。编写第8类中断的中断服务程序每中断一次在CRT上显示一个8字。根据新的中断周期对8254通道0初始化写中断服务子程序设置中断向量计数初值10ms/838ns11933=0x2e9dInt(0.010*1193182)=11931=0x2e9b程序清单#includedos.h#includestdio.hvoidinterruptmyint8(void);voidmain(void){disable();outportb(0x43,0x36);outportb(0x40,0x9d);outportb(0x40,0x2e);setvect(0x08,myint8);enable();while(1);}voidinterruptmyint8(void){
本文标题:02硬件中断程序设计095
链接地址:https://www.777doc.com/doc-3476409 .html