INT中断服务程序
中断服务程序流程图
第一讲:第六章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指令-内中断
BIOS中断例程应用(续)
int 10h中断例程:在光标位置显示字符
mov mov mov mov mov int ah,9 ;置光标 al,’a’ bl,7 bh,0 ;第0页 cx,3 10h
BIOS中断例程应用(续)
编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的’a’ assume cs:code code segment mov ah,2 ;置光标 mov bh,0 ;第0页 mov dh,5 mov dl,12 int 10h mov ah,9 mov al,'a' mov bl,0cah mov bh,0 mov cx,3 int 10h mov ax,4c00h int 21h code ends end
程序如下:
assume cs:code code segment start:mov ax,cs mov ds,ax mov si,offset capital mov ax,0 mov es,ax mov di,200h mov cx,offset capitalend - offset capital cld rep movsb ;安装中断程序sqr mov ax,0 mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0 ;设置中断向量 mov ax,4c00h int 21h capital: push cx push si change:mov cl,[si] mov ch,0 jcxz ok and byte ptr [si],11011111b inc si jmp short change ok: pop si pop cx iret capitalend: nop code ends end start
中断INT10
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个中断源的中断子函数框架中断是单片机中一种重要的事件处理机制,能够在系统发生某个指定的事件时,立即打断当前的程序执行,转而执行中断服务程序。
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个中断源的中断子函数框架。
《单片机的C语言程序设计与运用(第2版)》期末复习题及答案2
第四章中断类例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中断服务程序流程。
微机原理_中断实验报告(3篇)
第1篇一、实验目的1. 理解中断系统的基本概念和工作原理。
2. 掌握中断源、中断向量、中断服务程序等基本概念。
3. 学习使用Keil软件进行中断程序的编写和调试。
4. 熟悉中断在微机系统中的应用。
二、实验原理中断系统是微机系统中重要的组成部分,它允许CPU在执行程序的过程中,响应外部事件或内部事件,从而实现多任务处理。
中断系统主要包括以下几个部分:1. 中断源:产生中断请求的设备或事件,如外部设备、定时器、软件中断等。
2. 中断向量:中断服务程序的入口地址,用于CPU在响应中断时找到相应的服务程序。
3. 中断服务程序:处理中断请求的程序,完成中断处理任务。
4. 中断优先级:不同中断源的优先级不同,用于确定中断响应的顺序。
三、实验设备与软件1. 实验设备:单片机实验板、计算机、Keil软件、Proteus仿真软件。
2. 实验软件:Keil uVision4、Proteus 8.0。
四、实验内容1. 外部中断实验(1)使用外部中断0(INT0)实现按键控制LED灯的亮灭。
(2)使用外部中断1(INT1)实现按键控制LED灯的闪烁。
2. 定时器中断实验(1)使用定时器0产生1秒的定时中断,实现LED灯的闪烁。
(2)使用定时器1产生1秒的定时中断,实现按键输入的计数。
3. 软件中断实验(1)使用软件中断实现按键输入的字符显示。
(2)使用软件中断实现按键输入的字符加密显示。
五、实验步骤1. 在Keil软件中创建一个新项目,选择合适的单片机型号。
2. 根据实验要求,编写中断服务程序,设置中断向量。
3. 在Proteus软件中搭建实验电路,包括单片机、按键、LED灯等。
4. 将Keil软件编译后的程序下载到单片机中。
5. 在Proteus软件中运行仿真,观察实验结果。
六、实验结果与分析1. 外部中断实验(1)按键按下时,LED灯亮;按键松开时,LED灯灭。
(2)按键按下时,LED灯闪烁;按键松开时,LED灯停止闪烁。
更新:定时器中断服务程序PPT资料优秀版
练习:用定时器中断服务程序实现计秒和计分,并 结果09后为0a、0b……
BCD码可分为有权码和无权码两类:有权BCD码有8421码、2421码、5421码,其中8421码是最常用的;
用LCD显示出来? BCD码可分为有权码和无权码两类:有权BCD码有8421码、2421码、5421码,其中8421码是最常用的;
void Lcd_dsp(void) min=bcd_add(min,0x60); } 在定时器中断服务程序中增加sec,min,hour变量,通过该变量进行LCD显示,观察会出现什么现象,为什么? hour++; } Led2=!Led2; if(To_1s>249) 无权BCD码有余3码、格雷码。 if(num>max)num=0; // 函数名: bcd_add(uchar num,uchar max) dsp_buf[0]=numtab[(min&0x70)>>4];
和四位自然二进制码不同的是,它只选用了四位二进制码中前10组代码,即用0000~1001分别代表它所对应的十进制数,余下的六组代
码不用。
4ms计数累加
//入口:num被调整的BCD码,MAX这个BCD的十进制最大字数
return(num); dsp_buf[4]=0x00;
//返回num
1s到了吗
是
进入中断服务程序 清中断标记
关中断,装载计数初值
开中断
dsp_buf[0]=numtab[(min&0x70)>>4]; if((num&0x0F)>0x09)num=(num&0xF0)+0x10;
vxworks中断服务程序
vxworks中断服务程序中断服务程序用来处理来自硬件的中断,是设备驱动程序的重要组成部分。
为及时响应外部中断,防止中断丢失.中断服务程序应该尽量的小,只把最必要的任务放在中断服务程序里面执行。
一般在系统启动,硬件设备成功初始化之后将ISR与中断向量挂上:也可以在系统启动后的任何时刻挂中断向量。
调试中经常采用后一种方式。
在VxWorks中有两个不同的函数可提供挂中断:intCon nect和pciIntConnect。
两者的区别是intConnect使用的中断向量是独占的,pc ilntConnect则可在各个不同的ISR之间共享中断向量。
实际上pcilntConnect内部调用了intConnect函数,在内部使用一个链表来管理多个不同的ISR。
pcil ntConnect要求每次进入ISR都要检查硬件的寄存器,证实中断的确是由ISR服务的硬件产生。
如果硬件的寄存器表明该硬件并未产生中断,则ISR立即退出,以让挂在同一个中断向量上的其它ISR有机会检查是否有中断产生。
pcilnt Lib.c中的代码清楚的说明了这个问题:void pciInt (int irq ){ PCLlNT RTN *pRtn;for(pRm=(PCI_INT_RTN*)DLL_FIRST(&pcilntList[irq]);pRtn!=NULL;pRtn=(PCI_INT_RTN*)DLL_NEXT(&pRtn->node)) (*pRtn->routine)(pRtn->parameter);}当PCI总线上有中断发生时,系统调用void pcilnt(int irq)函数,再由pciI nt使用内部的链表来依次调用挂在该中断上的ISR。
如果某个ISR不能正常退出,就会影响到其它ISR的运行。
在调试时为了检查中断向量是否已经和ISR 可靠的连接上,可以在命令行上或程序中直接调用pciInt来查看ISR是否被触发。
微机原理--第八章-中断系统
裁决器
0
IR6
0
IR7
选 CS 译 码
RD
WR
INTA INT
ICW1 芯片控制 A0
A0
1 × I3 I4 0 1 0 0 1 0 1 0 0 1
ICW2 中断类型号 1
ICW3 主从片连接关系
1 ICW4 方式控制
1
OCW1 中断屏蔽寄存器 IMR
00
0
SP/EN
CA0
OCW2 优先级设置、发EOI
上有中断申请,则将IRR相应位置1;
总线
D0 ~ D7 A0
A5 ~ A9
IOR IOW INTA INTR
数据线 D0 ~ D7
A0
ISR 0
当前 0
中断 服务
• 非屏蔽中断 – 由NMI引脚引起的中断,称非屏蔽中断。 – 当NMI引脚上产生上升沿信号,CPU必响应此中断请 求,即NMI引脚上的中断请求不受IF标志的控制, – IF不能屏蔽NMI引脚上的中断请求。
8086/8088CPU的中断分类图
中断源
外部中断 内部中断
非屏蔽中断 可屏蔽中断 内部硬件中断
SP/EN CA0 CA1 CA2
GND
+ 5V
电子钟时间基准
键盘 保留 串 口2 串 口1 硬盘 软盘 打印机
用于多片 8259A
级连情况
7.3.4 8259A的控制字
8259A中断控制器
处理部分
0
ISR 0
当前 0
中断 0
服务 0
寄存器
0 0
0
IRR
中断申请
0 0
寄存器 0
0
PR
0
优先级
中断电路
ORG 0013H
AJMP INT1S
ORG 0030H ;
MAIN: MOV IE,#85H ;1000 0001-允许INTO中断 EA=1 EX0=1
MOV TCON,#5 ;0000 0001-为边沿触发
MOV IP,#04H
MOV R1, #01H ;计数显示初始化
MOV DPTR,#TABLE
MOV P1, A
ACALL DELAY ;调用延时1s
INC R2 ;计数值加1
CJNE R2, #9,DISP2 ;秒值不到10,继续显示,否则清0
MOV R2, #01H
MOV P1,#0FFH
POP ACC ;恢复现场
RETI ;中断返回
TABLE: ;0-9的显示字型码表
DB 0C0H,0F9H,0A4H,0B0H
DISP: MOV A, R1
MOVC A, @A+DPTR ;查表的显示字型码
MOV P0, A
ACALL DELAY ;调用延时1s
INC R1 ;计数值加1
CJNE R1, #9,DISP ;秒值不到10,继续显示,否则清0
MOV R1, #01H
SJMP DISP
;INTO的中断服务程序
INT0S: PUSH ACC ;保护现场
DB 99H,92H,82H,0F8H
DB 80H,90H
;DB 88H,83H,0C6H,0A1H,86H,8EH ;0-F的显示字型码表
;延时子程序
DELAY: MOV R7,#250 ;延时子程序
D1: MOV R6,#250
D2: NOP
NOP
DJNZ R6,D2
单片机跳转语句
单片机跳转语句单片机跳转语句是在单片机程序中用来控制程序执行流程的重要语句。
下面将列举一些常用的单片机跳转语句,并对其功能进行简要介绍,以便读者更好地理解和应用。
1. 无条件跳转语句(jmp):该语句用于无条件地跳转到指定的地址,使程序执行从该地址开始。
可以用于实现程序的循环、分支等功能。
2. 条件跳转语句(jxx):该语句根据条件是否满足来决定是否跳转到指定的地址。
常用的条件包括相等、不相等、大于、小于等。
3. 跳转到子程序(call):该语句用于跳转到指定的子程序地址,并将当前程序的返回地址保存在栈中。
在子程序执行完毕后,使用返回指令(ret)可以跳转回调用该子程序的地址。
4. 跳转到中断服务程序(int):该语句用于触发中断,并跳转到中断服务程序的入口地址。
中断服务程序用于处理外部中断或异常情况。
5. 退出程序(exit):该语句用于结束当前程序的执行,并返回操作系统或上一级程序。
可以用于程序执行完毕后的清理工作或错误处理。
6. 跳转到指定的标签(goto):该语句用于直接跳转到程序中的指定标签处。
标签通常用来标记程序中的特定位置,以方便跳转和调试。
7. 跳转到循环开头(continue):该语句用于跳过循环体中余下的语句,直接进入下一次循环的执行。
常用于循环中的条件判断失败时,跳过当前循环体的执行。
8. 跳转到循环结束(break):该语句用于跳出当前循环,结束循环的执行。
通常与循环条件结合使用,用于在满足特定条件时提前结束循环。
9. 跳转到异常处理(exception):该语句用于在程序执行过程中发生异常时跳转到异常处理程序。
异常处理程序通常用于处理非预期的错误情况,如除零错误、越界访问等。
10. 跳转到错误处理(error):该语句用于在程序执行过程中发生错误时跳转到错误处理程序。
错误处理程序通常用于处理预期的错误情况,如输入错误、文件读写错误等。
通过以上列举的单片机跳转语句,可以实现程序的流程控制、条件判断、循环、子程序调用等功能。
单片机中断程序设计
单片机中断程序设计中断是单片机控制器(MCU)中重要的功能之一,它是单片机与外部硬件设备通信处理的一种方式。
在中断的处理中,当发生某一事件时,单片机立即停止正在运行的程序,然后调用该事件对应的中断服务程序。
当该中断服务程序执行完毕后,重新回到原来被中断的程序中继续运行。
在单片机的中断程序设计中,中断向量表是一个重要的概念,在这篇文章中我们将介绍单片机中断程序设计的基本流程和一些注意事项。
一、中断服务程序的编写在单片机中断程序设计中,中断服务程序通常在程序中单独定义。
中断服务程序的名称是由中断号决定的,例如INT0中断对应的中断服务程序的名称为INT0_ISR。
它的基本格式如下:```void interrupt ISR名称(void){中断服务程序的代码语句}```中断服务程序通常会进行一些操作,以处理中断触发时的事件。
例如,当从串口接收到数据时,中断服务程序需要读取接收缓冲区中的数据并处理。
二、中断优先级分配当多个中断同时发生时,如何处理中断事件是一个需要考虑的问题。
单片机中可以通过设置中断优先级实现多个中断间的优先级分配。
当多个中断发生时,单片机会按中断优先级从高到低的顺序进行处理。
在实际应用中,需要根据具体的应用需求进行中断优先级的分配设置。
三、中断向量表中断向量表是一个非常重要的概念,在单片机中,每一个中断都与中断向量表中的一个向量地址相对应。
当中断事件发生时,MCU会自动跳转到对应的向量地址,从而执行相应的中断服务程序。
中断向量表通常存储在单片机的程序存储器中,其结构体如下:```//中断向量表结构体struct interrupt_Vector_Table{void interrupt (*int0_isr)();void interrupt (*int1_isr)();void interrupt (*int2_isr)();//...其他中断服务程序的指针};//中断向量表在程序存储器中的地址#define INTERRUPT_VECTOR_ADDRESS 0x0000//中断向量表变量定义interrupt_Vector_Table __at (INTERRUPT_VECTOR_ADDRESS)interrupt_Vector_Table_content;```需要注意的是,有些单片机包含了一个默认的中断向量表,其中会包括一些通用的中断服务程序。
中断服务程序
单片机_C语言函数_中断函数(中断服务程序)在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。
中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。
(1)中断源:中断请求信号的来源。
(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。
期间涉及到CPU响应中断的条件,现场保护,现场恢复。
(3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。
优先级是可以编程的,而优先权是固定的。
80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。
80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制(1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。
在这里我们讲下注意的事项(1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。
(2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。
所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。
(3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。
INT21中断功能大全
1、字符功能调用类(Character-Oriented Function)01H、07H和08H —从标准输入设备输入字符02H —字符输出03H —辅助设备的输入04H —辅助设备的输出05H —打印输出06H —控制台输入/输出09H —显示字符串0AH —键盘缓冲输入0BH —检测输入状态0CH —清输入缓冲区的输入功能(1)、功能01H、07H和08H?功能描述:从标准输入设备(如:键盘)读入一个字符。
该中断在处理过程中将一直处于等待状态直到有字符可读为止。
该输入还可被重定向,如果这样做,则无法判断文件是否已到文件尾入口参数:AH=01H,过滤掉控制字符,并回显=07H,不过滤掉控制字符,不回显=08H,过滤掉控制字符,不回显出口参数:AL=输入字符的ASCII码(2)、功能02H功能描述:向标准输出设备(如:屏幕)输出一个字符。
该输出还可被重定向,如果这样做,则将无法判断磁盘是否满入口参数:AH=02HDL=待输出字符的ASCII码出口参数:无(3)、功能03H功能描述:从辅助设备读入一个字符,该辅助设备的缺省值为COM1入口参数:AH=03H出口参数:AL=读入字符的ASCII码(4)、功能04H功能描述:向辅助设备输出一个字符,该辅助设备的缺省值为COM1入口参数:AH=04HDL=待输出字符的ASCII码出口参数:无(5)、功能05H功能描述:向标准的输出设备输出一个字符。
该缺省的输出设备为LPT1端口的打印机,除非用MODE命令来改变入口参数:AH=05HDL=待输出字符的ASCII码出口参数:无(6)、功能06H功能描述:控制台(如:键盘、屏幕)输入/输出。
如果输入/输出操作被重定向,那么,将无法判断文件是否已到文件尾,或磁盘已满入口参数:AH=06H,DL=输入/输出功能选择出口参数:若DL=00H-FEH,则此功能为输出,DL为待输出字符的ASCII码;若DL=0FFH,则此功能为输入,此时:若ZF=1,则无字符可读,否则,AL=读入字符的ASCII码(7)、功能09H功能描述:输出一个字符串到标准输出设备上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mov ax , 4 c00h
2014-05-12
8 / 21
安装程序
我们要做三部分工作:
1 2 3
. 编程实现求平方功能的程序; . 安装程序,我们将其安装在 0:200 处; . 设置中断向量表,将程序的入口地址保存在 7ch 表项中,使其成为 中断 7ch 的中断例程。
..
. ..
. ..
.
loop s 的执行需要两个信息,循环次数和到 s 的位移,所以,7ch 中 断例程要完成 loop 指令的功能,也需要这两个信息作为参数。 我们用 cx 存放循环次数,用 bx 存放位移。 应用举例:在屏幕中间显示 80 个‘ ! ’ 。 认识框架代码。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
17 / 21
问题分析
int 7ch 引发中断过程后,进入 7ch 中断例程,在中断过程中,当前 的标志寄存器、CS 和 IP 都要压栈。 此时压入的 CS 和 IP 中的内容,分别是调用程序的段地址(可以认 为是标号 s 的段地址)和 int 7ch 后一条指令的偏移地址(即标号 se 的偏移地址) 。 可见,在中断例程中,可以从栈里取得标号 s 的段地址和标号 se 的 偏移地址,而用标号 se 的偏移地址加上 bx 中存放的转移位移就可 以得到标号 s 的偏移地址。 可以利用 iret 指令,我们将栈中的 se 的偏移地址加上 bx 中的转移 位移,则栈中的 se 的偏移地址就变为了 s 的偏移地址。 我们再使用 iret 指令,用栈中的内容设置 CS、IP,从而实现转移到 标号 s 处。
1
. 转到标号 s 显然应设 (CS)= 标号 s 的段地址,(IP)= 标号 s 的偏移
地址; . 那么,中断例程如何得到标号 s 的段地址和偏移地址呢? . 现在知道,可以从栈中直接和间接地得到标号 s 的段地址和偏移地 3
2
址,那么如何用它们设置 CS:IP 呢?
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
13 / 21
实例二进一步说明
最后,在中断例程 capital 中用到了寄存器 si 和 cx,编写中断例程和编 写子程序的时候具有同样的问题,就是要避免寄存器的冲突。 应该注意例程中用到的寄存器的值的保存和恢复。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
10 / 21
实例二
实例二编写、安装中断 7ch 的中断例程:
功能:将一个全是字母,以 0 结尾的字符串,转化为大写。 参数:ds:si 指向字符串的首地址。
李晓锋 INT 中断服务程序
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
2014-05-12
18 / 21
7ch 中断例程
. 7ch 中断例程 . lp : push bp mov bp , s p dec cx jcxz lpret add [ bp +2] , bx l p r e t : pop bp iret .
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
பைடு நூலகம்
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
7 / 21
示例一
assume c s : code code segment start : mov ax , 3 4 5 6 ; ( ax )=3456 i n t 7 ch 据的平方 ax add ax , ax adc dx , dx i n t 21 h code e n d s end s t a r t
. .
INT 中断服务程序
李晓锋
2014-05-12
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
1 / 21
Outline
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
9 / 21
程序解读
注意,在中断例程 sqr 的最后,要使用 iret 指令。 iret 指令的功能 CPU 执行 int 7ch 指令进入中断例程之前,标志寄存器、当前的 CS 和 IP 被压入栈中,在执行完中断例程后,应该用 iret 指令恢复 int 7ch 执行前的标志寄存器和 CS、IP 的值,从而接着执行应用程序。 int 指令和 iret 指令的配合使用与 call 指令和 ret 指令的配合使用具 有相似的思路。
李晓锋 INT 中断服务程序
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
2014-05-12
4 / 21
Test1.asm 解读
程序是没有做除法,但是在结尾使用了 int 0 指令。 CPU 执行 int 0 指令时,将引发中断过程,执行 0 号中断处理程序, 而系统设置的 0 号中断处理程序的功能是显示“Divide overflow” , 然后返回到系统。 可见,int 指令的最终功能和 call 指令相似,都是调用一段程序。 因此,一般情况下,系统将一些具有一定功能的子程序,以中断处 理程序的方式提供给应用程序调用。 我们在编程的时候,可以用 int 指令调用这些子程序。当然,也可 以自己编写一些中断处理程序供别人使用。 以后,我们可以将中断处理程序简称为中断例程。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
6 / 21
示例一
示例一编写、安装中断 7ch 的中断例程: 功能:求一 word 型数据的平方。 参数:(ax)= 要计算的数据。 返回值:dx、ax 中存放结果的高 16 位和低 16 位。 应用举例:求 2*34562
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
李晓锋
INT 中断服务程序
2014-05-12
5 / 21
编写供应用程序调用的中断例程
前面,我们已经编写过中断 0 的中断例程了,现在我们讨论可以供应用 程序调用的中断例程的编写方法。 我们通过两个实例来讨论: 实例一编写、安装中断 7ch 的中断例程,实现求一 word 型数据的 平方。 实例二编写、安装中断 7ch 的中断例程,实现将一个全是字母,以 0 结尾的字符串,转化为大写。
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
3 / 21
INT 指令的调用
可以在程序中使用 INT 指令调用任何一个中断的中断处理程序。 . test1.asm 示例 . assume c s : code code segment start : mov ax , 0 b800h mov es , ax mov b y t e p t r e s : [ 1 2 * 1 6 0 + 4 0 * 2 ] , ’ ! ’ int 0 code e n d s end s t a r t .
. 1
INT 中断服务程序的编写
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序