一般中断处理的主要步骤是什么

一般中断处理的主要步骤是什么,第1张

一般中断处理的主要步骤分别是中断请求、中断判优、中断响应、中断处理和中断返回。

在微机系统中,对于外部中断,中断请求信号是由外部设备产生,并施加到CPU的NMI或INTR引脚上,CPU通过不断地检测NMI和INTR引脚信号来识 别是否有中断请求发生。对于内部中断,中断请求方式不需要外部施加信号激发,而是通过内部中断控制逻辑去调用。无论是外部中断还是内部中断,中断处理过程 都要经历以下步骤: 请求中断→响应中断→关闭中断→保留断点→中断源识别→保护现场→中断服务子程序→恢复现场→中断返回。

请求中断

当某一中断源需要CPU为其进行中断服务时,就输出中断请求信号,使中断控制系统的中断请求触发器置位,向CPU请求中断。系统要求中断请求信号一直保持到CPU对其进行中断响应为止。

中断响应

CPU对系统内部中断源提出的中断请求必须响应,而且自动取得中断服务子程序的入口地址,执行中断 服务子程序。对于外部中断,CPU在执行当前指令的最后一个时钟周期去查询INTR引脚,若查询到中断请求信号有效,同时在系统开中断(即IF=1)的情 况下,CPU向发出中断请求的外设回送一个低电平有效的中断应答信号,作为对中断请求INTR的应答,系统自动进入中断响应周期。

关闭中断

CPU响应中断后,输出中断响应信号,自动将状态标志寄存器FR或EFR的内容压入堆栈保护起来,然后将FR或EFR中的中断标志位IF与陷阱标志位TF清零,从而自动关闭外部硬件中断。因为CPU刚进入中断时要保护现场,主要涉及堆栈 *** 作,此时不能再响应中断,否则将造成系统混乱。

保护断点

保护断点就是将CS和IP/EIP的当前内容压入堆栈保存,以便中断处理完毕后能返回被中断的原程序继续执行,这一过程也是由CPU自动完成。

中断源识别

当系统中有多个中断源时,一旦有中断请求,CPU必须确定是哪一个中断源提出的中断请求,并由中断控制器给出中断服务子程序的入口地址,装入CS与IP/EIP两个寄存器。CPU转入相应的中断服务子程序开始执行。

保护现场

主程序和中断服务子程序都要使用CPU内部寄存器等资源,为使中断处理程序不破坏主程序中寄存器的内容,应先将断点处各寄存器的内容压入堆栈保护起来,再进入的中断处理。现场保护是由用户使用PUSH指令来实现的。

中断服务

中断服务是执行中断的主体部分,不同的中断请求,有各自不同的中断服务内容,需要根据中断源所要完成的功能,事先编写相应的中断服务子程序存入内存,等待中断请求响应后调用执行。

恢复现场

当中断处理完毕后,用户通过POP指令将保存在堆栈中的各个寄存器的内容d出,即恢复主程序断点处寄存器的原值。

中断返回

在中断服务子程序的最后要安排一条中断返回指令IRET,执行该指令,系统自动将堆栈内保存的 IP/EIP和CS值d出,从而恢复主程序断点处的地址值,同时还自动恢复标志寄存器FR或EFR的内容,使CPU转到被中断的程序中继续执行。

#include<stdioh>

#include<AT89X52h>

unsigned char flag;

unsigned char commond;

void main()

{

TMOD=0x21;//计数器1工作方式2,计数器0工作方式1

TH1=TL1=0xfb; //波特率9600

TR1=1; //开始计时

SCON=0x50; //串口工作方式1 ,允许接收数据

EA=1;

ES=1; //打开串口中断

ET0=0; //禁止计时器TO中断

while(1)

{

if(flag)

{

flag=0;

}

}

}

void comm() interrupt 4 using 2

{ //unsigned char i;

if(RI)

{

RI=0;

flag=1;

commond = SBUF;

P2= commond;

RI=0;

if(commond=='e')

{

ET0=1; //打开计数器0中断

TH0=(65536-50000)/256;

TL0=(65536-50000)%256; //延时05秒

TR0=1; //开始计时

}

}

}

void time0() interrupt 1 using 3

{

unsigned char j,k;

EA=0;

while(j>10)

{

j=0;

P3_4 = ~P3_4;

k++;

if(k>13)

{

TR0 =0;

k = 0;

}

}

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

j++;

EA =1;

}

你的程序好像是定时器中断那里有问题,这个改过的可以实现你的要求了

其中中断处理就是执行中断服务程序,这是中断系统的核心。不同计算机系统的中断处理过程各具特色,但对多数计算机而言,其中中断服务程序。

1、中断处理过程包括中断请求、中断判优、中断响应、中断处理、中断返回

2、硬件实现:中断请求、中断判优、中断响应、中断返回

3、软件实现:中断请求、中断判优、中断处理

4、软件、硬件都实现:中断请求、中断判优

扩展资料:

当中断处理程序开始执行时,首先去唤醒处于阻塞状态的驱动(程序)进程。如果是采用了信号量机制,则可通过执行 signal *** 作,将处于阻塞状态的驱动(程序)进程唤醒;在采用信号机制时,将发送一信号给阻塞进程。

对于不同的设备,有不同的中断处理程序。该程序首先从设备控制器中读出设备状态,以判别本次中断是正常完成中断,还是异常结束中断。若是前者,中断程序便进行结束处理;若还有命令,可再向控制器发送新的命令,进行新一轮的数据传送。若是异常结束中断,则根据发生异常的原因做相应的处理。

参考资料来源:百度百科-执行中断

果你在程序里面对函数进行了声明的话,子程序可以写在任意地方(当然还是要在这个文件里面)。如果不进行声明的话,也不是仅仅写在MAIN函数之前这条规则这么简单,而是不能还让编译器没有编译到这个函数当时遇到了这个函数被其他函数调用,这样的话就会出错。

第二,中断函数不用进行函数声明,可以写在MAIN函数前面也可以写在MAIN函数后面。

第三,由于不知道你说的是那种单片机在那种编译器下面的写法,我在这里给你一个51内核的单片机79F168在KEIL里面的中断函数的写法给你。

void UART_ISR() interrupt 4

{

if(RI && REN)

{

}

if(TI && TXEN)//TXEN为自己定义的一个串口发送使能标志

{

}

}

void timer0_1ms_ISR() interrupt 1

{

TL0=LOBYTE(TIMER0);

TH0=HIBYTE(TIMER0);

}

这两个函数第一个是串口中断函数,第二个是定时器0中断函数,函数名可以自己定义,后面的interrupt必须写,紧着这最关键的就是这个中断号,可以查询数据手册得到这个中断号,每一个中断都会有一个中断号,对应着写在后面就可以了。

另提醒楼主基础很重要,所有的东西都是由最基本基础的东西叠加起来的。

以上就是关于一般中断处理的主要步骤是什么全部的内容,包括:一般中断处理的主要步骤是什么、一个简单的单片机计数器中断计时的程序、简述中断的处理过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9417995.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存