历史上的今天
返回首页

历史上的今天

今天是:2025年04月22日(星期二)

正在发生

2021年04月22日 | 51单片机中断优先级以及中断嵌套

2021-04-22 来源:eefocus

简介:说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。


在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。


中断的优先级有两个:查询优先级和执行优先级。


什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级:


外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断


或 int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART


或 PX0>PT0>PX1>PT1>PS>......


其实都是查询优级。首先查询优先级是不可以更改和设置的。这是一个中断优先权排队的问题。是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。而这与是否发生中断服务程序的嵌套毫不相干。当CPU查询各个中断标志位的时候,会依照上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。


例如:当计数器0中断和外部中断1(按查询优先级,计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。


而中断的执行优先级就是你对IP寄存器的设置了。在2个优先级的情况下,某位为1,则相应的中断源为高优先级;为0,则为低优先级。


关于中断的优先级有三条原则:


1、CPU同时接收到几个中断时,首先响应优先级最高的中断请求;


2、正在进行的中断过程不能被新的同级或低行优优先级的中断请求所中断;


3、正在进行的低行优优先级中断服务,能被高行优优先级中断请求中断;


若:同一执行优先级中的中断申请不止一个时,则有一个中断优先权排队问题。同一执行优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,优先权自高到低的顺序即:


外部中断0>定时/计数0>外部中断1>定时/计数1>串行接口


例如:设置IP = 0x10,即设置串口中断为最高优先级,则串口中断可以打断任何其他的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数。若串口中断没有触发,则其他几个中断之间还是保持逻辑优先级,相互之间无法嵌套。


关于中断嵌套。可以这样说,当一个中断正在执行的时候,如果事先设置了中断优先级寄存器IP,那么当一个更高优先级的中断到来的时候会发生中断嵌套,如果没有设置则不会发生任何嵌套;如果有同一个优先级的中断触发,它并不是在“不断的申请”,而是将它相应的中断标志位置即IE寄存器的某位置位,当CPU执行完当前中断之后,按照查询优先级重新去查询各个中断标志位,进入相应中断。


要记住,没有设置IP时,单片机会按照查询优先级(或都说逻辑优先级)来排队进入服务。如果要想让某个中断优先响应, 则要设置IP,更改执行优先级(或者说物理优先级)。要注意的是,当设置了IP后,当低执行优先级中断在运行时,如果有高执行优先级的中断产生,则会嵌套调用进入高执行优先级的中断。如果你是用C语言写的程序,并在中断服务时 using 了寄存组,要注意,两个不同执行优先级的中断服务程序不要 using 同一组寄存器。


看两个问题,如下:


1 在各个中断都是低优先级的时候,如果定时器0的溢出进入中断。在这个中断处理的过程中,外部中断0也被触发了,那么是不是要发生中断嵌套?


2 如果定时器0发生中断的时候,进入中断处理程序,这个时候外部中断1条件触发条件满足了。因为定时器0自然优先级比外部中断1高,那么定时器0的中断处理程序继续执行。假设定时器中断处理程序执行的过程中,外部中断1的触发。条件消失了,那么等定时器0的中断处理完后,程序还是会进入外部中断1处理程序吗?


答案1:在IP事先设置了外部中断0的优先级的情况下,CUP会中止定时器0的中断服务,进入外部中断0服务程序,执行完以后再回到定时器0中断服务程序。否则不会。


答案2:肯定会进入中断的;外部中断1的触发条件满足后会置位外部1的中断标志,即使后来外部中断1的触发条件消失了,也不会清除已置位的中断标志,所以等定时器0的中断处理完后,程序判断外部中断的中断标志为1后依然会进入外部中断1处理程序的,只有在外部中断1处理程序中执行reti指令才会硬件清除外部中断1的中断标志(这也正是为什么中断返回使用reti指令而不可以用ret替换的原因)...


推荐阅读

史海拾趣

ECS公司的发展小趣事

为了进一步扩大市场份额,ECS公司开始积极拓展全球市场。他们与全球各地的云服务提供商建立了紧密的合作关系,共同为客户提供更加全面、便捷的服务。同时,ECS公司还积极参加国际云计算展会和论坛,与国际同行交流经验和技术,不断提升自身的竞争力。通过这些努力,ECS公司的品牌知名度和市场份额得到了显著提升。

ECLIPTEK公司的发展小趣事

随着公司规模的扩大和订单量的增加,ECLIPTEK面临着越来越大的供应链管理挑战。为了应对这些挑战,公司投入大量资源优化供应链管理,引入先进的供应链管理系统和自动化生产设备。通过提高生产效率和降低生产成本,ECLIPTEK成功地保持了其在市场上的竞争优势。

DMS Electronic Components, Inc公司的发展小趣事

DMS非常重视人才的培养和引进。公司建立了完善的人才选拔和激励机制,吸引了一批高素质的专业人才加入。这些人才在技术研发、市场营销、生产管理等方面发挥了重要作用,为公司的快速发展提供了有力保障。同时,DMS还注重员工的培训和发展,为员工提供了广阔的职业发展空间。

Crouzet公司的发展小趣事

Crouzet一直致力于产品创新和技术研发。公司的产品线不断丰富,涵盖了自动控制元件、智能控制器、可编程逻辑控制器、触摸屏、测量传感器、模拟和数字电子元件等多种产品。这些产品广泛应用于汽车、化工、电力、机械、消费电子、空调和冷库、石油和天然气等多个行业,为客户提供了高效、可靠的自动化解决方案。

BITECH公司的发展小趣事

Crouzet一直致力于产品创新和技术研发。公司的产品线不断丰富,涵盖了自动控制元件、智能控制器、可编程逻辑控制器、触摸屏、测量传感器、模拟和数字电子元件等多种产品。这些产品广泛应用于汽车、化工、电力、机械、消费电子、空调和冷库、石油和天然气等多个行业,为客户提供了高效、可靠的自动化解决方案。

Horizon Electronics Enterprises Group公司的发展小趣事

在快速发展的同时,Horizon始终不忘履行社会责任和推动可持续发展。公司积极倡导绿色生产理念,采用环保材料和工艺,减少生产过程中的能源消耗和废弃物排放。同时,Horizon还积极参与社会公益事业和环保项目,为社会的可持续发展贡献自己的力量。这些举措不仅赢得了社会各界的广泛赞誉和认可,也为公司的长远发展奠定了良好的社会基础。

请注意,以上故事均为虚构内容,旨在展示一个假设的电子行业公司可能的发展路径和成就。实际情况可能因公司具体情况和市场环境而有所不同。

问答坊 | AI 解惑

监控云台问题?

高手请赐教: 1、云台解码器的拨码开关是不是用二进制确定其地址码?是不是所有的厂商都要用一个8拨片的拨码开关?有8个拨片的拨码开关和6个拨片的拨码开关一起的是怎么回事? 2、解码器的解码芯片如:ATMEL AT89c51 的程序加密以后还能不能读出 ...…

查看全部问答>

evc创建的工程在WINCE5.O系统跑不起来?

我用EVC创建的工程,编译成X86(evc自带的SDK和WINCE5 SDK都试过) Realse 可执行文件放到 装有 wince5系统的开发板上运行,提示不是有效的WINCE程序~这是为什么呢?…

查看全部问答>

在Sitara平台上如何优化Linux启动过程?

请问目前大家的平台上,Linux从启动到运行自己的图形程序,需要大概多少秒?我们要想优化一个系统的启动时间,首先我们需要知道这个系统都把启动时间花在哪里了!其次就是你的目标,是让系统在多少秒之内完成启动?那要如何才能知道,系统在启动过 ...…

查看全部问答>

dsp 编译问题

这个程序编译时怎么有错误?说\"EvaRegs\" has no field \"CAPCONA\" 、\"CAPFIFOA\"什么原因?   初始化事件管理器EVAvoid InitEv(void){     EvaRegs.T1PR=0xFFFF;   //T1周期     Ev ...…

查看全部问答>

中断问题,执行NVIC_Init(&NVIC_InitStructure)使执行不下去

程序如下:void NVIC_Configuration(void){#ifdef  VECT_TAB_RAM    /* Set the Vector Table base location at 0x20000000 */   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else  /* VECT_ ...…

查看全部问答>

zigbee应用剖析

初始化因为Z-Stack是在OS下运行的,所以在之前必须调用osalAddTasks()初始化任务。组织关于OS的API函数介绍请看文档:Z-Stack OSAL API (F8W-2003-0002),应该说协议栈的每层或者说每部分都有相关的API说明文档。osalAddTasks()初始 ...…

查看全部问答>

新手啊~求PC.c 让我把任哲的程序做下来吧~~

电脑上走任哲的程序,报错 call to function \'PC_VectSet\' with no prototype 查出是没有pc.c,网上下载了2个PC.c 但是都不对(一个是QEMU仿真的) 这东西为什么这么难找到啊?…

查看全部问答>

如何保存CCS的设置

    我用的是CCS6,按照自己的使用习惯设置了代码和注释等的字体和颜色。     但是碰到过CCS莫名就恢复成了默认的设置项,搞得我又得全部重新设置一遍。     想问下,CCS有没有保存当前设置项,然后直接导入的功能 ...…

查看全部问答>

多旋翼自主飞行器(C题)

多旋翼自主飞行器(C题) …

查看全部问答>

也来折腾Zephyr之(LINUX下安装篇)

本帖最后由 damiaa 于 2017-3-23 15:36 编辑                           Zephyr(LINUX下安装篇) A,先是准备虚拟机virtualBox(这里不细说了)。 B ...…

查看全部问答>