中断响应的条件:
讲到这儿,我们依然对于计算机响应中断感到神奇,我们人可以响应外界的事件,是因为我们有多种“传感器“――眼、耳可以接受不同的信息,计算机是如何做到这点的呢?其实说穿了,一点都不希奇,MCS51工作时,在每个机器周期中都会去查询一下各个中断标记,看他们是否是“1“,如果是1,就说明有中断请求了,所以所谓中断,其实也是查询,不过是每个周期都查一下而已。这要换成人来说,就相当于你在看书的时候,每一秒钟都会抬起头来看一看,查问一下,是不是有人按门铃,是否有电话。。。。很蠢,不是吗?可计算机本来就是这样,它根本没人聪明。
了解了上述中断的过程,就不难解中断响应的条件了。在下列三种情况之一时,CPU将封锁对中断的响应:
1、CPU正在处理一个同级或更高级别的中断请求。
2、现行的机器周期不是当前正执行指令的最后一个周期。我们知道,单片机有单周期、双周期、三周期指令,当前执行指令是单字节没有关系,如果是双字节或四字节的,就要等整条指令都执行完了,才能响应中断(因为中断查询是在每个机器周期都可能查到的)。
3、当前正执行的指令是返回批令(REti)或访问IP、IE寄存器的指令,则CPU至少再执行一条指令才应中断。这些都是与中断有关的,如果正访问IP、IE则可能会开、关中断或改变中断的优先级,而中断返回指令则说明本次中断还没有处理完,所以都要等本指令处理结束,再执行一条指令才可以响应中断。
中断响应过程
CPU每个机器周期都需要顺序检查每个中断源,当检测到有中断请求时,能否响应,还要看下述情况是否存在:
(1)CPU正处理相同级别或更高级别的中断;
(2)正在执行指令,还未到最后一个机器周期;
(3)正在执行的指令是RETI或访问IP、IE指令,则执行完上述指令后,再执行一条指令后,才会响应新中断。
响应过程:(假设已使某中断请求标志置1)
(1)先使相应优先级状态触发器置1;
(2)执行一个硬件子程序的调用,
1)硬件清零相应中断请求标志(TI、RI除外)
2)将当前PC内容压入堆栈——保护断点;
3)将中断服务子程序入口地址送PC——转移。
返回过程:(RETI执行后)
(1)使相应优先级状态触发器清0。
(2)从堆栈中弹出栈顶的两个字节内容送PC——恢复断点。
(3)CPU接着中断处继续执行原程序。
注意:
1)保护断点与保护现场以及恢复断点与恢复现场的区别。
2)外部中断响应时间在3 ~ 8个机器周期之间。
利用外部中断实现单步操作。
CPU响应中断时,首先把当前指令的下一条指令(就是中断返回后将要执行的指令)的地址送入堆栈,然后根据中断标记,将相应的中断入口地址送入PC,PC是程序指针,CPU取指令就根据PC中的值,PC中是什么值,就会到什么地方去取指令,所以程序就会转到中断入口处继续执行。这些工作都是由硬件来完成的,不必我们去考虑。这里还有个问题,大家是否注意到,每个中断向量地址只间隔了8个单元,如0003-000B,在如此少的空间中如何完成中断程序呢?很简单,你在中断处安排一个LJMP指令,不就可以把中断程序跳转到任何地方了吗?
一个完整的主程序看起来应该是这样的:
ORG 0000H
LJMP START
ORG 0003H
LJMP INT0 ;转外中断0
ORG 000BH
RETI ;没有用定时器0中断,在此放一条RETI,万一 “不小心“产生了中断,也不会有太大的后果。
中断程序完成后,一定要执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。注意:CPU所做的保护工作是很有限的,只保护了一个地址,而其它的所有东西都不保护,所以如果你在主程序中用到了如A、PSW等,在中断程序中又要用它们,还要保证回到主程序后这里面的数据还是没执行中断以前的数据,就得自己保护起来。
`
关键字:MCS-51 中断 响应过程
引用地址:
MCS-51的中断响应过程解析
推荐阅读最新更新时间:2024-11-13 17:13
STM32CubeMX学习教程之二:GPIO输入之外部中断
本篇主要讲述GPIO外部中断输入检测,实际物理输入方式是按键,但是实际上更适合外部设备信号的输入检测,物理按键输入因为有抖动,还需要硬件或者软件去抖才比较可靠。这个例子不考虑防抖的情况。 软件版本: STM32CubeMX V4.25.0 System Workbench V2.4 硬件:OneNet 麒麟座V2.3 在STM32CubeMX中新建项目,选择正确的MCU型号 设置RCC和SYS,然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M) 根据板子的具体连接设置4个GPIO_OUTPUT (连接到LED)和4个GPIO_EXIT*(外部中断模式,
[单片机]
ARM筆記:定时器中断的应用
s3c2440芯片中一共有5个16位的定时器,其中有4个定时器(定时器0~定时器3)具有脉宽调制功能,即他们都有个输出引脚,可以通过定时器来控制引脚周期性的高低电平变化,定时器4没有输出引脚。上次脱机运行PWM测试程序实验的时候就用到了这块,所以这次将PWM和定时器放在一起来学习。 定时器部件的时钟源为PCLK,首先通过两个8位预分频器降低频率,定时器0和1共用第一个预分频器,2,3,4共用第二个预分频器。 预分频器输出接入第二级分频器,可以生成5种分频信号(1/2,1/4,1/8,1/16,TCLK),其中8位预分频器是可编程,根据装载值来分频PCLK,值储存在TCFG0和TCFG1中。 定时器内部控制逻辑工作流程如下:
[嵌入式]
浅析STM32F0系列中断向量映射问题如何解决
最近用Cortex-M0内核的STM32F030K6T6做个东西,需要做IAP升级,发现它的中断向量与M3、M4等内核的单片机不太一样,这里分享给大家。 IAP升级需要一个BootLoader程序,一个应用程序。BootLoader程序直接烧写到flash起始地址就行,中断向量也不用改。但是应用程序需要烧写到BootLoader程序后面,且中断向量必须重新映射。 M3、M4等内核的单片机,直接修改中断向量的偏移地址(VECT_TAB_OFFSET)就行。但在M0内核的库中,根本就没有这个定义。查阅相关资料发现,M0内核的中断向量需要用户自己从Flash映射到RAM中,即0x20000000地址。 实际操作也很简单,在程序开始加上这
[单片机]
【JZ2440笔记】裸机实验使用中断
一、前言 中断是打断当前程序执行,快速响应突发事件的一种机制。中断的触发源有很多种,比如外部引脚电平变化以及外设的各种事件中断等等,当中断发生时,S3C2440 CPU的PC指针跳往固定的中断向量地址处,执行中断处理函数,之后再返回到原先的程序断点处继续执行程序。 二、实验目标 采用按键中断的方式,通过JZ2440开发板上的三个独立按键分别控制开发板上的三个LED的亮灭。 三、硬件连线 独立按键连线如下: 独立按键只用了三个,分别连接到了EINT0,EINT2,EINT11,即S3C2440的外部中断0,2和11。对应的真实物理引脚分别是GPF0,GPF2和GPG3。S3C2440的外部中断引脚不是随便选的,是定
[单片机]
STM32 关于外部中断线、中断源和中断服务函数的问题
中断线问题: 上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB2...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,后面三个是专用的中断线,不做讨论。 有人要问,假设:我设置的引脚是PB9和PE9都开启外部中断怎么办?小编告诉你,这还真办不了,我实测过。配置函数的时候后覆盖之前的函数的(如下图所示) 如果这样配置的话,会出现出货光电1的初始化覆盖掉编码盘的初始化,说白了就是编码盘的设置被覆盖掉了,结果是外部中断 出货光电1管脚会触发而编码盘就不起作用了,这也是STM32其中一个问题所在吧! 反过来,结果是外部中断 编码盘 管脚会触发
[单片机]
单片机 中断( 定时器/计数器详说 )
方式0应用 通过设置TMOD寄存器中的M1M0位00选择定时器方式0,方式0的计数位数是13位,对T0来说,TL0寄存器的低5位(高3位未用)和TH0寄存器的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向cpu发出中断请求。其逻辑图如下 定时器方式0位13位计数器,最多能装载的个数 2的13次方=8192个,当TL0和TH0的初始值为0时,最多经过8192个机器周期该计数器就会溢出一次,向cpu申请中断。 THX=(8192-N)/32 TLX=(8192-N)%32。机器周期=12 X (1/时钟频率) 单片机定时器程序的步骤: 对TMOD赋值、计算初值、中断方式,对IE赋值
[单片机]
ARM 处理器 ~ 中断与异常
中断与异常 定义 ARM 中的工作模式除 User 和 System 外,均为异常模式,这里的异常是广义的,包含以下三类情况 外部中断(外部中断) 由于 CPU 外部的原因而改变程序执行流程,属于异步事件,可以屏蔽 软件中断(自陷) 通过处理器拥有的软件指令,可预期地使正在执行的程序改变执行流程,以执行特定的程序 显式的事件,无条件执行 属同步事件,且不可屏蔽 例如 Motorola 68000 系列的 Trap 指令、ARM 中的 SWI、Intel 8086 中的 INT 异常 由 CPU 内部的原因(如非法指令)或外部的原因(如访存错误)引起的事件 没有对应的处理器指令 异常发生时,处理器无条件地挂起当前运行的程序,
[单片机]
51单片机的中断优先级及中断嵌套
说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。 在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。 中断的优先级有两个:查询优先级和执行优先级。 什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级: 外部中断0 定时/计数器0 外部中断1 定时/计数器1 串行中断 或 int0,timer0,int1,timer1,serial port 或 INT0、
[单片机]