中断概念

来源:互联网 发布:mac强制关机 编辑:程序博客网 时间:2024/05/02 06:44

一、中断的概念

  1、中断产生:CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理。     2、中断响应和中断服务:CPU暂停中断当前的工作,转去处理事件B。  3、中断返回:待CPU将事件B处理完毕后,再回到原来事件A中断的地方继续处理事件A。

二、中断系统结构
这里写图片描述

  1. 引起CPU中断的根源,称为中断源(中断源有外部触发,定时器中断两种形式)。
  2. 中断源向CPU提出的中断请求。
  3. CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。

实现上述中断功能的部件称为中断系统(中断机构)。

三、中断优先级
这里写图片描述
中断标志:标志该中断是否产生,执行完中断服务函数后,要把该标志位清0。

四、中断源
这里写图片描述

五、中断请求标志
1、TCON的中断标志
这里写图片描述
IT0,外部中断0触发方式控制位(0:为电平触发方式;1:为下边沿触发方式)。IT1,外部中断1触发方式控制位。
IE0,外部中断0中断请求标志位。IE1,外部中断1中断请求标志位。
TF0,定时/计数器T0溢出中断请求标志位。TF1,定时/计数器T1溢出中断请求标志位。

2、SCON的中断标志
这里写图片描述
RI,串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。同样,RI必须由软件清除。
TI,串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。

3、中断允许控制IE
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
这里写图片描述
EX0,外部中断0允许位; ET0,定时/计数器T0中断允许位;
EX1,外部中断0允许位; ET1,定时/计数器T1中断允许位;
ES,串行口中断允许位; EA, CPU中断允许(总允许)位。

六、中断优先级控制
80C51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。
这里写图片描述
PX0,外部中断0优先级设定位; PX1,外部中断0优先级设定位;
PT0,定时/计数器T0优先级设定位; PT1,定时/计数器T1优先级设定位;
PS ,串行口优先级设定位; PT2,定时/计数器T2优先级设定位。

七、 80C51单片机的中断优先级有三条原则:

  1. CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。
  2. 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。
  3. 正在进行的低优先级中断服务,能被高优先级中断请求所中断。

为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。

八、中断响应过程
描述一:

  1. 将相应的优先级状态触发器置1(以阻断后来的同级或低级的中断请求)。
  2. 执行一条硬件LCALL指令,即把程序计数器PC的内容压入堆栈保存,再将相应的中断服务程序的入口地址送入PC。
  3. 执行中断服务程序。

中断响应过程的前两步是由中断系统内部自动完成的,而中断服务程序则要由用户编写程序来完成。

描述二:

  1. 在每条指令结束后, 系统都自动检测中断请求信号, 如果有中断请求,且CPU处于开中断状态下, 则响应中断。
  2. 保护现场, 在保护现场前, 一般要关中断, 以防止现场被破坏。保护现场一般是用堆栈指令将原程序中用到的寄存器推入堆栈。
  3. 中断服务, 即为相应的中断源服务。
  4. 恢复现场, 用堆栈指令将保护在堆栈中的数据弹出来, 在恢复现场前要关中断, 以防止现场被破坏。在恢复现场后应及时开中断。
  5. 返回, 此时 CPU将推入到堆栈的断点地址弹回到程序计数器, 从而使CPU继续执行刚才被中断的程序。

九、判断状态变化执行不同方法
法一:查询法

   while1{                                                                                                             if(窗口1开)                                                                                {报警;……}                                                                                if(窗口2开)                                                                                                {报警;……}                                                                      }    

法二:中断法

 int flag = 0xXXXXXXXX;  while(1)  {      if (flag != 0)          {报警;……}  }
1 0
原创粉丝点击