INT中断服务程序
- 格式:pdf
- 大小:117.43 KB
- 文档页数:21
第一讲:第六章I/O接口原理-接口、端口、编址回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。
重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。
讲授内容:6. 1 输入/输出数据的传输控制方式一、输入/输出的一般概念1.引言输入/输出是微机系统与外部设备进行信息交换的过程。
输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。
因此,CPU与外部设备之间的信息交换技术比较复杂。
CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息。
2.输入/输出端口的寻址方式微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。
根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。
方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。
中断和中断处理程序1. 中断Linux内核要对连接到计算机上的所有硬件设备进⾏管理,⾸先要能和它们互相通信。
从所周知,处理器的速度跟外围硬件设备的速度往往不在⼀个数量级上。
所以,需要⼀种机制,如果轮询(polling)是⼀种解决办法,可以让内核定期对设备的状态进⾏查询,然后做出相应的处理,但这让内核做了不少⽆⽤功。
更好的办法是由我们来提供⼀种机制,让硬件在需要的时候再向内核发出信号。
这就是中断机制。
中断本质上是⼀种特殊的电信号,由硬件设备⽣成,并直接送⼊中断控制器的输⼊引脚上,再由中断控制器向处理器发送相应的信号,处理器⼀经检测到此信号,便中断⾃⼰当前⼯作转⽽处理中断,最后由OS来负责处理新到来的数据。
中断是异步的。
什么是中断?简单地说就是CPU在忙着作⾃⼰的事情,这时候硬件(⽐如说键盘按了⼀下)触发了⼀个电信号,这个信号通过中断线到达中断控制器i8259A,i8259A接受到这个信号后,向CPU发送INT信号申请CPU来执⾏刚才的硬件操作,并且将中断类型号也发给CPU,此时CPU保存当前正在做的事情(REST指令把程序计数器PC中的下⼀条待执⾏的指令的内存地址保存到栈)的情景现场,然后去处理这个申请,根据中断类型号找到它的中断向量(即中断程序在内存中的地址),然后去执⾏这段程序(这段程序已经写好,在内存中),执⾏完后再向i8259A发送⼀个INTA信号表⽰其已经处理完刚才的申请。
此时CPU就可以继续做它刚才被打断做的事情了,将刚才保存的情景现场恢复出来,CPU继续执⾏接下来下⾯的程序。
不同的设备对应的中断不同,⽽每个中断都通过⼀个唯⼀的数字标识。
这些中断值通常被称为中断请求(IRQ)线。
⽐如,IRQ0是时钟中断,⽽IRQ1是键盘中断。
并不是所有的中断号都这样严格定义,像PCI总线上的设备,中断就是动态分配的。
1.1. 异常与中断异常与中断不同,它在产⽣时必须考虑与处理器时钟同步。
实际上,异常也称为同步中断。
关于中断的详细阐述,包括如何写中断服务程序关于中断⼀个完整的中断过程由中断请求、中断判优及屏蔽、中断响应、中断处理及中断返回五个部分组成。
在8086/8088微机系统中,中断源的优先权由⾼到低的顺序依次为:除零数、INT n、INT o、NMI(⾮屏蔽中断)、INTR、单步执⾏中断.8259A芯⽚的外部特征:(1)⽚选取信号(CS)(2)写信号(WR)(3)读信号(RD)(4)D0~D7:8条数据总线(5)GND:地信号(6)Vcc:+5V电源(7)INT:中断请求信号(8)中断响应信号(9)IR0~IR7:8个中断请求输⼊信号(10)A0:地址选择信号(11)SP/EN:从⽚编程/允许缓冲器信号(12)CAS0~CAS2:这三条信号是8259A级连时构成8259A的主从式级连结构当CPU完成对8259A的初始化操作后,8259A即进⼊操作状态,通过INT端⼝向CPU提出中断申请,8259A从数据总线D7~D0输出当前服务对象的中断类型号N,CPU截获该中断向量并响应该中断,完成⼀次中断操作。
在IBM PC及其兼容机中,通过CPU的NMI(⾮屏蔽中断)和两个8259A可编程中断控制器芯⽚为系统提供了16级中断,硬件中断结构如图1所⽰1,两⽚8259A构成主从式级联控制结构,与CPU相连的称为主⽚,下⼀层的称为从⽚,从⽚中断请求信号INT与主⽚的IRQ2相连。
IBM PC机中保留给⽤户可随意编程的中断号有IRQ10、IRQ11、IRQ12和IRQ15,这些中断信号都在8259A从⽚上。
IBM PC机中由8259A管理的16级中断均有规定的中断向量存储地址,主⽚中IRQ0-IRQ7分别对应08H-0FH,从⽚中IRQ8-IRQ15分别对应70H-77H(如串⼝1 对应为0CH(12),⽤oldvect=getvect(0x0B)保存原来的中断向量)。
主⽚的中断控制寄存器ICR和中断屏蔽寄存器IMR的⼝地址分别为20H和21H,从⽚的相应寄存器⼝地址分别为A0H和A1H。
8086中断举例一、8086中有个中断向量表,其中有256个中断,每个中断占4个字节,总共1K大小。
二、中断程序的编写主要就是将程序的偏移地址和段地址装载到向量表中。
装载的方法有两种。
方法1:直接装入法。
xorax,ax ; 将AX置零movds,ax;将段初始化为0段,不一定要使用ds段寄存器movax,offset int60 ; 取得中断服务程序的入口地址的偏移量mov ds:[0180h],ax ; 将偏移地址装入中断向量表,60H*4=0180Hmovax,seg int60 ; 取得中断服务程序的入口地址的段地址mov ds:[0180h+2],ax ; 将段地址装入中断向量表8086下的中断服务子程序例程:data segmentinfo db "This is an Interruption service program!",0ah,0dh,'$'data endsSTACK SEGMENT stackSTA DB 50 DUP(?)TOP EQU LENGTH STASTACK ENDScode segmentassumecs:code,ds:data,SS:STACKstart:movax,datamovds,axMOV AX,STACKMOV SS,AXMOV SP,TOPpush ds; ======== 装载中断服务程序的入口地址到中断向量表中========== xorax,axmovds,axmovax,offset printmov ds:[0198h],axmovax,seg printmov ds:[0198h+2],axpop dsint 66h ; 触发中断(软件中断的方式)中断向量号:66H mov ah,4ch ; 返回DOSint 21h; ============= 中断服务程序============ printproc farmovdx,offset info ; 显示一段文字信息mov ah,09hint 21hiret ; 中断返回print endpcode endsend start调试过程需要观察的几个关键点:(1)ISP入口地址装载进中断向量表后的状态(2)在即将触发中断时,CS,IP的变化(3)在中断返回执行IRET时,CS,IP的变化(理解恢复现场)(4)注意堆栈的变化,SP和SS方法2 :push ds; ======== 装载中断服务程序的入口地址到中断向量表中========== mov dx,seg print ; ds:dx(CS:IP)mov ds,dxmov dx,offset printmov al,66h ;中断类型号mov ah,25hint 21h ;装中断向量表pop ds中断向量服务程序入口地址服务程序入口地址中断向量。
中断例程的说明
中断例程:INT_LED
利用中断按键INTKEY(接INT5)
当按键动作,在中断服务程序中依次点亮LED灯,并在LCD提示。
键盘中断:
首先是对中断中用到一个结构体的设置, 结构体中各成员变量的意义见结构体的定义, 这一步是在函数ISR_Init()中完成的, 这个函数在ISR.C中, 主要是对中断中用到的寄存器进行初始化, 这些寄存器包括: INTMOD, INTMSK, INTSUBMSK, SRCPND, INTPND。
其次是在主函数中完成对键盘中断服务函数和中断偏移量(INTOFFSET)的关联. 这是在函数Key_init()中完成的, 此函数在KeyBoard.c中. 中断服务函数和中断偏移量(INTOFFSET)的关联是通过函数SetISR_Interrupt(IRQ_EINT5, Key_ISR_5, NULL)来完成的
有了这一步的关联以后当查询到中断偏移量是IRQ_EINT5时就会根据此偏移量调用键盘中断服务函数Key_ISR_5.
有了上面两步的初始化工作以后, 当有键盘按下时就会发生IRQ中断,
过程是先跳转到startup.s中的b IRQ_Handler处, 然后保存寄存器r0-r12, lr跳转到函数ISR_IrqHandler中, 在这个函数中查询中断向量的偏移量, 根据这个偏移量调用相应的中断服务函数.
执行完中断服务函数后再跳转回startup.s中的DMFD sp!, {r0-r12, lr}处,恢复执行中断服务函数之前的状态, 继续执行发生中断服务前的下一条指令.
至此中断过程结束, 在中断服务函数中依次点亮LED灯,并在LCD提示。
.。
INT 10H 是由BIOS 对屏幕及显示器所提供的服务程序,而后倚天公司针对倚天中文提供了许多服务程序,这些服务程序也加挂在INT 10H 内。
使用INT 10H 中断服务程序时,先指定AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用INT 10H。
底下是它们的说明:13 显示字符串ES:BP = 串地址CX = 串长度DH, DL = 起始行列BH = 页号AL = 0,BL = 属性串:Char,char,……,charAL = 1,BL = 属性串:Char,char,……,charAL = 2串:Char,attr,……,char,attrAL = 3串:Char,attr,……,char,attr光标返回起始位置光标跟随移动光标返回起始位置光标跟随串移动AH=00HAH=00/INT 10H 是用来设定显示模式的服务程序,AL 寄存器表示欲设定的模式:AH=01H您可以把光标想成一个小的矩形,平时这个矩形扁平位于某字底部,但藉由此功能可以改变其大小与位置。
光标起始处与终止处分别由CL 与CH 的0 到4 位表示,参考下图:而CH 的第7 位必须是0,第5、6 位表示光标属性:位 6 位 5 属性0 0 正常0 1 隐形1 01 1 闪烁缓慢AH=02H此功能是设定光标位置,位置用DH、DL 表示,DH 表示列号,DL 表示行号。
由左至右称之为『列』,屏幕最上面一列为第零列,紧靠第零列的下一列称为第一列……;由上而下称之为『行』,屏幕最左边一行称之为第零行,紧靠第零行右边的一行为第一行。
故最左边,最上面的位置为DH=0 且DL=0;最左边第二列,DH=1,DL=0。
如果是文字模式时,BH 为欲改变光标位置的显示页,如果是图形模式,BH 要设为0。
以行列来说明DH、DL 之意义,小木偶常常搞混,底下以座标方式解释。
在文字模式下,字符的位置类似数学直角座标系的座标,但是Y 轴方向相反,Y 轴是以屏幕最上面为零,越下面越大,直到24 为止,存于DH 内。
stc8系列单片机前5个中断源的中断子函数框架中断是单片机中一种重要的事件处理机制,能够在系统发生某个指定的事件时,立即打断当前的程序执行,转而执行中断服务程序。
STC8系列单片机提供了多种中断源,本文将介绍其中前5个中断源的中断子函数框架。
一、外部中断0外部中断0是通过INT0引脚触发的中断源。
当INT0引脚的电平发生变化时,可触发外部中断0。
以下是外部中断0的中断子函数框架:```Cvoid INT0_ISR() interrupt 0{// 中断服务程序的代码// ...}```二、外部中断1外部中断1是通过INT1引脚触发的中断源。
当INT1引脚的电平发生变化时,可触发外部中断1。
以下是外部中断1的中断子函数框架:```Cvoid INT1_ISR() interrupt 2{// 中断服务程序的代码// ...}```三、定时器0中断定时器0中断是使用定时器0作为中断源。
定时器0可以设定一个计时周期,当计时器溢出时,会触发定时器0中断。
以下是定时器0中断的中断子函数框架:```Cvoid TIMER0_ISR() interrupt 1{// 中断服务程序的代码// ...}```四、定时器1中断定时器1中断是使用定时器1作为中断源。
定时器1可以设定一个计时周期,当计时器溢出时,会触发定时器1中断。
以下是定时器1中断的中断子函数框架:```Cvoid TIMER1_ISR() interrupt 3{// 中断服务程序的代码// ...}```五、串口中断串口中断是通过串口通信接收和发送数据时触发的中断源。
当接收到数据或发送完成时,可触发串口中断。
以下是串口中断的中断子函数框架:```Cvoid UART_ISR() interrupt 4{// 判断中断类型if (RI){// 接收中断// 中断服务程序的代码// ...}else if (TI){// 发送中断// 中断服务程序的代码// ...}}```总结:以上是STC8系列单片机前5个中断源的中断子函数框架。
第四章中断类例4-1 P104假设外部中断0和外部中断1均为下降沿触发,当外部中断0发生时,P0端口的电平反向,当外部中断1发生时,P1端口的电平反向。
#include<reg51.h>void IS0(void) interrupt 0{ P0=~P0;} //P0端口反向void IS1(void) interrupt 2{ P1=~P1;} //P1端口反向void main( ){ P0=0x00; P1=0xFF;IT0=1; IT1=1;EX0=1; EX1=1; EA=1;while(1);}【例4-9】外部中断示例在本实例中,首先通过P1.7口点亮发光二极管D1,然后外部输入一脉冲串,则发光二极管D1亮、暗交替。
#include<reg51.h>sbit P1_7=P1^7;void interrupt0( ) interrupt 0 using 2 //外部中断0{ P1_7=!P1_7;}void main( ){ EA=1; //开中断IT0=1; //外部中断0脉冲触发EX0=1; //外部中断0P1_7=0;do{ }while(1);}如果有3个脉冲,则灯亮、暗交替一次,可如下面编程:#include<reg51.h>Sbit P17=P1^7;unsigned char i=3;void main( ){ EA=1; IT0=1; EX0=1;P17=0;do{ }while(1); }void interrupt0( ) interrupt 0{ i=i-1;if(i==0){ P17=!P17; i=3;}}【例4-10】如图4-18所示,8只LED阴极接至单片机P0口,两开关S0、S1分别接至单片机引脚P3.2()和P3.3()。
编写程序控制LED状态。
按下S0后,点亮8只LED;按下S1后,变为闪烁状态。
#include<reg51.h>sbit P32=P3^2;void delay(unsigned int d) //定义延时子函数{ while(--d>0);}void main( ){ P0=0xFF; //熄灭LEDIT0=1; IT1=1; //外中断0、1脉冲触发方式EA=1; EX0=1; EX1=1; //开中断for( ; ; ) //延时等待中断发生{;}}void INT0_ISR( ) interrupt 0//外中断0中断服务函数{ P0=0x00;}void INT1_ISR( ) interrupt 2//外中断1中断服务函数{ while(P32!=0) //如果有外部中断0,则退出{ delay(5000);P0=0x00;delay(5000);P0=0xFF;}}定时类【例4-16】设单片机的fosc=12MHz,要求在P1.0上产生周期为2ms的方波。
1.函数波形发生器流程图主程序流程T0中断服务程序流程2. 255秒定时器流程主程序流程图INT0中断服务程序流程T1中断服务程序流程T0中断服务程序流程3. 比例电压变换器流程主程序流程图4. 模拟电压显示器流程主程序流程图注:P1口和P3.0-P3.3接12个LED 灯,其中P3.3接最高位灯L12,P1.0接最低位灯L0。
5. 脉冲计数器流程主程序流程图T1中断服务程序流程图T0中断服务程序流程图6. 水塔水位控制器流程主程序流程图T0中断服务程序流程图T1中断服务程序流程图7. 占空比可调的方波发生器流程主程序流程图T0中断服务程序流程图注:T0的中断服务程序编制过程中必须注意使程序所有流程的执行时间小于100μS 。
否则,输出波形的频率不符合题目的要求8. 双机通过串行接口互传数据流程主程序流程图T0中断服务程序流程图串口中断服务程序流程图9. 花样流水灯流程主程序流程图T0中断服务程序流程图注:在主程序中由于仅使用了8bit运算,故实际A/D采样值为255时,得到的延时时间间隔为1280mS。
若要完全符合题意,则需要使用16bit的算术运算才能满足要求。
10. 模拟电压比较器流程主程序流程图T0中断服务程序流程图T1中断服务程序流程图11. 利用PWM 信号实现直流小电机的调速流程主程序流程图注:在程序的编制过程中,必须仔细调整延时37微秒的延时子程序的延时时间,使输出波形的频率满足题目要求。
12. 调频信号发生器流程主程序流程图T0中断服务程序流程图注:该程序编制过程中须注意,T0中断服务程序与主程序均使用0区的工作寄存器。
另外,T0的中断服务程序中最长流程的执行时间必须小于50微秒13. 频率计主程序流程图T1中断服务程序流程图动态显示子程序流程图主程序流程图14. 电子钟T0中断服务程序流程图INT0中断服务程序流程图动态显示子程序流程图15. 数字电压表主程序流程图T0中断服务程序流程图动态显示子程序流程图16. 数字跑表主程序流程图INT0中断服务程序流程图T0中断服务程序流程图动态显示子程序流程图17. 步进电机驱动器主程序流程图INT0中断服务程序流程T0中断服务程序流程。