中断嵌套
- 格式:doc
- 大小:16.00 KB
- 文档页数:3
TIM2定时中断嵌套sytick定时器中断异常现象:TIM2设置10Ms定时中断,运⾏delay(2),程序就停滞了分析:Sytick滴答定时器中断优先级是占线式的(实践的出来的⾎的经验),因为中断优先级组配置为0时,虽然TIM2的响应式优先级为2,应该说sycik的优先级已经是0了,可以⾛delay中断的,但是还是不⾏。
把中断优先级类型配置为4,即全部是抢占式优先级式,TIM2也开始⾛了,delay也开始⾛了。
这个折腾很久的,systick在R008⽂档中说的太少,⽹友的博客说了很多,只是提到systick 的中断优先级可以改,但是么有说他是抢占式的。
static __INLINE uint32_t SysTick_Config(uint32_t ticks){if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */// NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */NVIC_SetPriority (SysTick_IRQn, 0);SysTick->VAL = 0; /* Load the SysTick Counter Value */SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk |SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */return (0); /* Function successful */}NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1 ;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_Init( &NVIC_InitStructure);。
嵌⼊式--中断系统学习(中断系统+NVIC+SYSCFG+优先级配置+中断嵌套+中断架构)⼀、嵌⼊式中断系统 (1)中断原理 ⾸先要搞明⽩怎么实现的中断,CPU遇到紧急事件要处理,就跳转到紧急事件,再返回来继续处理 就时SP配合PC的⼀套操作了 1、进⼊中断 (a)处理器⾃动保存现场到栈⾥SP,PC,xPSR,R0-R3,LR, (b)⼊栈结束以后,ISR开始执⾏(中断服务) (c)中断会⾃动找到中断⼊⼝函数-》Vector⾥⾯声明的 2、退出中断 (a)现场恢复PC,SP (b)出栈完成执⾏下⼀条⼆、嵌套向量控制器NVIC NVIC专门⽤于管理中断控制器(CPU并不知道谁传来的中断请求) NVIC功能: (1)中断管理 1、给中断使能/禁⽌ ISER--中断使能 ICER--中断禁⽌ 2、设置挂起状态 ISPR--中断挂起 ICPR--中断挂起清除 3、设置脉冲/下降触发 (2)中断异常的向量化处理 Reset+SVCall+系统调⽤+Systick 当产⽣异常时,处理器把PC设置为中断向量(中断⼊⼝),每⼀个异常就是⼀个中断号,汇集起来就是中断向量表 其中位置系统内部是负数,外部异常时正数。
并且优先级值越⼩,优先级越⾼ (3)中断配置 1、中断分组 STM32可以将中断分为5组-》0-4,其中划分两种:抢占优先级和响应优先级 抢占优先级响应级别⾼于响应优先级。
其中数值越⼩优先级越⾼ 嵌套: ⾼优先级的抢占优先级是可以打断正在进⾏的低抢占优先级中断的; 抢占优先级相同的中断,⾼响应优先级不可以打断低响应优先级的中断; 抢占优先级相同的中断,当两个中断同时发⽣的情况下,哪个响应优先级⾼,哪个先执⾏; 如果两个中断的抢占优先级和响应优先级都是⼀样的话,则看哪个中断先发⽣就先执⾏;1. 打断的情况只会与抢占优先级有关,和响应优先级⽆关!⼀般情况下,系统代码执⾏过程中,只设置⼀次中断优先级分组,⽐如分组2,设置好分组之后⼀般不会再改变分组。
一、引言Nvic嵌套向量中断控制器(Nested Vectored Interrupt Controller)是一种常见的中断控制器,它在嵌入式系统中扮演着重要的角色。
本文将介绍Nvic的工作原理,帮助读者更好地理解这一关键的硬件组件。
二、Nvic的基本概念Nvic是一种硬件组件,用于管理和分发系统中的中断请求。
在嵌入式系统中,当发生外部事件或者特定的处理器状态发生变化时,需要立即中断当前的程序执行,执行特定的中断服务程序。
而Nvic就是用来协调这些中断请求的,确保它们按照优先级和顺序得到正确的处理。
三、中断控制器的作用1.管理中断请求中断是在嵌入式系统中的一种重要的事件响应机制。
当外部设备(如传感器、通信接口等)产生需要处理的事件时,会向处理器发送中断请求。
而中断控制器就是负责接收、管理和分发这些中断请求的硬件组件。
2.中断优先级在一个嵌入式系统中,可能同时出现多个中断请求,此时中断控制器需要根据中断请求的优先级决定哪个中断将被优先处理。
Nvic通过优先级编码的方式,能够准确地确定中断的优先级,确保高优先级的中断能够得到及时处理。
四、Nvic的工作原理1.中断向量表Nvic通过中断向量表来实现对中断请求的管理。
中断向量表是一张表格,每个中断都有一个特定的中断向量号。
当中断控制器接收到中断请求时,根据中断向量号可以迅速定位到对应的中断服务程序的入口位置区域,从而进行中断处理。
2.中断优先级编码Nvic使用中断优先级编码的方式来确定中断的优先级。
在Nvic中,中断请求会按照其具体的中断向量号进行编码,从而确定其优先级。
当多个中断请求同时到达时,Nvic会根据优先级编码来决定哪个中断会被优先处理。
3.嵌套中断Nvic支持嵌套中断的机制,即在一个中断服务程序的执行过程中,如果遇到了更高优先级的中断请求,Nvic可以暂停当前中断服务程序的执行,转而处理更高优先级的中断请求。
这种机制可以确保高优先级的中断能够得到及时处理,提高系统的响应速度。
分析嵌套中断1.引言所谓“中断”是处理事件的一个“过程”,这一过程一般是由计算机内部或外部某件紧急事件引起并向主机发出请求处理的信号,主机在允许的情况下响应请求,暂停正在执行的程序,保存好“断点”处的现场,转去执行中断处理程序,处理完中断服务程序后自动返回原断点处,继续执行原程序,这一处理过程称为“中断”。
以AT89S52为例,中断系统含有8个中断源,共有6个中断矢量:定时/计数器0、1、2,INT0、INT1和UART。
两级中断优先级,可实现两级中断嵌套。
用户可以很方便的通过软件实现对中断的控制。
既然系统含有8个中断源,就有可能出现数个中断源同时提出中断请求的情况,这样,设计人员必须事先根据它们的轻重缓急来为每个中断源确定CPU对其的响应顺序。
然而,对于中断优先级寄存器IP来说,只可能设定两级优先,即控制位为1时对应的中断源为高级中断,反之,控制位为0时对应的为低级中断。
这样就出现一个问题:如果一个中断正在执行,如何才能让它响应同级甚至是低级中断请求呢?2.中断多优先级的扩展根据AT89S52的结构特点,其中断系统中含有两个不可寻址的“优先级生效”触发器。
一个用于指出CPU是否正在执行高优先级的中断服务程序,这个触发器为1时,系统将屏蔽所有的中断请求;另一个则指出CPU是否正在执行低优先级中断服务程序,该触发器为1时,将阻止除高优先级以外的一切中断请求。
由此可见,若要响应同级甚至是低级中断请求,必须使得该“优先级生效”触发器清零。
但该触发器又是不可寻址的,所以无法用软件直接清零。
遍历系统所提供的111条指令,只有RETI可以达到此目的。
该指令可在CPU执行该指令时,一方面清除中断响应时所置位的“优先级生效”触发器,另一方面可从当前栈顶弹出断点地址送入程序计数PC,从而返回主程序。
一个系统若有n级中断,在MCU中就有n个中断请求触发器,总称为中断请求寄存器;与之对应的有n个中断屏蔽触发器,总称为中断屏蔽寄存器。
ucos-ii中断结构及中断嵌套的问题问ucos-ii中断结构及中断嵌套的问题中断处理流程1:IRQ中断发生后调用UCOS_IRQHandler()2:UCOS_IRQHandler()先压栈3:后调用OSIntEnter()4:根据IRQ偏移量查找处理函数5:用户中断处理函数6:OSIntExit()7:如果发生中断切换调用INTCTXSW否则恢复现场至中断前任务代码如下:UCOS_IRQHandlerstmfd sp!,{r0-r12,lr}bl OSIntEnterbl C_IRQHandlerbl OSIntExitldr r0,=OSIntCtxSwFlag 调用OSIntCtxSw后置1ldr r1,[r0]cmp r1,#1beq _IntCtxSwldmfd sp!,{r0-r12,lr}subs pc,lr,#4_IntCtxSwmov r1,#0str r1,[r0]ldmfd sp!,{r0-r12,lr}stmfd sp!,{r0-r3}mov r1,spadd sp,sp,#16sub r2,lr,#4mrs r3,spsrorr r0,r3,#NOINTmsr spsr_c,r0ldr r0,=.+8movs pc,r0stmfd sp!,{r2} ; push old task's pcstmfd sp!,{r4-r12,lr} ; push old task's lr,r12-r4 mov r4,r1 ; Special optimised code below mov r5,r3ldmfd r4!,{r0-r3}stmfd sp!,{r0-r3} ; push old task's r3-r0stmfd sp!,{r5} ; push old task's psrmrs r4,spsrstmfd sp!,{r4} ; push old task's spsr; OSPrioCur = OSPrioHighRdyldr r4,=OSPrioCurldr r5,=OSPrioHighRdyldrb r5,[r5]strb r5,[r4]; Get current task TCB addressldr r4,=OSTCBCurldr r5,[r4]str sp,[r5] ; store sp in preempted tasks's TCBbl OSTaskSwHook ; call Task Switch Hook; Get highest priority task TCB addressldr r6,=OSTCBHighRdyldr r6,[r6]ldr sp,[r6] ; get new task's stack pointer; OSTCBCur = OSTCBHighRdystr r6,[r4] ; set new current task TCB addressldmfd sp!,{r4} ; pop new task's spsrmsr SPSR_cxsf,r4ldmfd sp!,{r4} ; pop new task's psrmsr CPSR_cxsf,r4ldmfd sp!,{r0-r12,lr,pc} ; pop new task's r0-r12,lr & pc void C_IRQHandler(void) //void C_IRQHandler(void) {U32 wTemp;wTemp = rINTOFFSET<<2;((void(*)(void))(*((U32 *)(aISR_EINT0+wTemp))))();}void __vWDTInterrupt(){rSRCPND &= BIT_WDT; // Clear pending bit -- Watchdog timerrINTPND &= BIT_WDT;OSTimeTick();}我现在用看门狗做时钟中断,没有其他中断时一切正常,但是我加了个串口中断后发现以下问题,串口中断如下:void __irq Uart1Task(void){rINTSUBMSK|=(BIT_SUB_RXD1|BIT_SUB_TXD1|BIT_SUB_ERR 1);if(rSUBSRCPND&BIT_SUB_RXD1){Uart0RxBuffer[Uart0RxInSp++] =(char)RdURXH1();}rSUBSRCPND&=(BIT_SUB_RXD1|BIT_SUB_ERR1); // Clear Sub int pendingrINTSUBMSK&=~(BIT_SUB_RXD1|BIT_SUB_ERR1);rSRCPND &= BIT_UART1;rINTPND &= BIT_UART1;}1:中断响应慢,而且丢数据,我发送几个数据后串口才开始响应中断,但前几个数据都丢失,本以为是优先级低,采取了取消优先级,及建立高于看门狗优先级的INT0中断,取消掉任务中的关中断及WHILE(1)等,但是问题依旧。
中断优先级以及中断嵌套
中断优先级有两种,叫默认优先级和嵌套优先级,假如A,B两个中断,如果A比B 嵌套优先级(通过优先级寄存器设置)更高,就不需要看默认优先级了,A、B同时发生中断时A中断先执行而B后执行,而且B中断执行之间A可以抢断(嵌套)B的中断服务程序,B不可以抢断A;而如果嵌套优先级一样的话,只是A默认优先级比B更高(不需要设置),只能支持A、B同时中断时A先执行,而A不能嵌套B了,有的CPU甚至硬件上不支持嵌套,需要模拟嵌套,这个跟CPU平台有关。
关于嵌套的寄存器备份是这样进行的,进入一级中断便进行一次全套寄存器的压栈操作,压栈是把寄存器里面的值保存到栈区(属于内存区域,而并非你说的后背状态寄存器SPSR,其实后背状态寄存器SPSR也要一起压入栈区),每压入一个寄存器,SP会移动相应的距离,不会重叠;每退出一级中断便进行一次全套寄存器的出栈操作,这样就实现了保护现场和恢复现场。
可以通过编译器反汇编码窗口查看中断压栈、出栈的实现。
中断嵌套和咬尾中断和迟到中断的工作原理下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!中断嵌套和咬尾中断以及迟到中断的工作原理引言在计算机科学领域,中断是一种处理器的异步事件,能够打断当前正在执行的程序,转而执行另一段代码。
stm32外部中断嵌套[操作寄存器+库函数]-ChangingsBlog stm32共有19个外部中断:•线0~15:对应外部I/O口的输入中断•线16:连接到PVD输出。
PVD(Programmable Votage Detector),即可编程电压监测器。
作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧急处理。
当供电电压又恢复到给定的阀值以上时,也会产生一个中断,通知软件供电恢复。
•线17:连接到RTC实时时钟产生闹钟事件。
•线18:连接到USB唤醒事件在stm32 NVIC中断和stm32 USART串口通信中已经介绍过stm32的中断和串口输出使用方法,本文运用外部中断嵌套,通过串口发送相应信息,验证外部中断嵌套。
按下PA0(按键按下时为低电平)时,打印出如下信息:EXTI0 IRQHandler enter.EXTI1 IRQHandler enter.EXTI2 IRQHandler enter.EXTI2 IRQHandler return.EXTI1 IRQHandler return.EXTI0 IRQHandler return.直接操作寄存器对于外部中断EXTI的控制寄存器,MDK定义了如下的结构体:typedef struct{vu32 IMR;vu32 EMR;vu32 RTSR;vu32 FTSR;vu32 SWIER;vu32 PR;} EXTI_TypeDef;IMR:中断屏蔽寄存器这个32位的寄存器只有前19位有效。
当位x设置为1时,则开启这个线上的中断。
EMR:事件屏蔽寄存器只有前19位有效。
当位x设置为1时,则开启这个线上的事件触发。
RTSR/FTSR:上升沿/下降沿触发选择寄存器只有低19位有效,当位x设置为1时,则允许这个线上上升/下降沿触发中断/事件。
下降上升沿可以同时设置,则为任意电平触发。
SWIER:软件中断事件寄存器设置IMR开启某个外部中断后,可以通过向该寄存器对应此外部中断的位x写1,产生一个软件中断,效果通外部中断触发。
关于单片机中断嵌套总结
什幺是单片机嵌套中断
所谓中断是处理事件的一个过程,这一过程一般是由计算机内部或外部某件紧急事件引起并向主机发出请求处理的信号,主机在允许的情况下响应请求,暂停正在执行的程序,保存好断点处的现场,转去执行中断处理程序,处理完中断服务程序后自动返回原断点处,继续执行原程序,这一处理过程称为中断。
以AT89S52为例,中断系统含有8个中断源,共有6个中断矢量:定时/计数器0、1、2,INT0、INT1和UART。
两级中断优先级,可实现两级中断嵌套。
用户可以很方便的通过软件实现对中断的控制。
既然系统含有8个中断源,就有可能出现数个中断源同时提出中断请求的情况,这样,设计人员必须事先根据它们的轻重缓急来为每个中断源确定CPU对其的响应顺序。
然而,对于中断优先级寄存器IP来说,只可能设定两级优先,即控制位为1时对应的中断源为高级中断,反之,控制位为0时对应的为低级中断。
LinkedIn下图为一声光报警电路,当按下S1时,蜂鸣器发音;当按下S2时,停止发音,但LED发光。
1、利用中断工作方式编写完整的单片机汇编语言程序。
名词解释中断嵌套
中断嵌套是指在一个程序中,一个中断服务程序(ISR)在执行的过程中,再次发生了一个中断请求,即发生了中断嵌套。
中断嵌套可以发生在同一个设备的多个不同事件,也可以是来自不同设备的中断请求。
当发生中断嵌套时,系统需要处理当前的中断请求,同时也需要记录和保存上一次未完成的中断服务程序的状态,以便之后再次返回到上一次的中断服务程序中继续执行。
中断嵌套的处理涉及中断优先级的设定、中断屏蔽和中断响应等相关技术。
中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。
简介其实就是更高一级的中断的“加塞”,处理器正在执行着中断,又接受了更急的另一件“急件”,转而处理更高一级的中断的行为!中断优先级定义优先级高的中断源可以中断优先级低的中断服务程序,这就形成了中断服务程序中套着中断服务程序的情况,即形成了所谓的中断嵌套。
MCU暂停现行程序而转去响应中断请求的过程称为中断响应;为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程序,硬件将中断源分为若干个级别,称作中断优先级。
查询优先级中断的优先级有两个:查询优先级和执行优先级。
查询优先级是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中断。
中断嵌套的处理过程在我们的生活中,常常会遇到一些复杂的问题,需要我们不断地进行思考和处理。
有时候,这些问题会像迷宫一样,将我们困在其中,让我们无法找到正确的出口。
在这种情况下,我们需要学会中断嵌套的处理过程,以避免陷入无尽的循环中。
中断嵌套的处理过程可以理解为在处理一个问题的过程中,当我们发现自己陷入了一个循环或死胡同时,及时中断当前的思考方式,尝试新的思路和方法,以打破困境,找到解决问题的办法。
我们需要明确问题的核心,并将其拆解成更小的子问题。
这样做可以帮助我们更好地理解问题的本质,并找到解决问题的方向。
然后,我们需要对每个子问题进行分析和思考,寻找可能的解决方案。
在这个过程中,我们可以尝试不同的方法和角度,以寻找最佳的解决方案。
当我们在解决一个子问题的过程中遇到了困难,或者发现自己陷入了一个死胡同时,我们需要及时中断当前的思考方式。
这时,我们可以停下来,放松一下自己的大脑,转移一下注意力。
可以进行一些与问题无关的活动,比如散步、听音乐或者与朋友交流。
这样做可以帮助我们放松心情,重新调整思维方式。
在中断的过程中,我们可以尝试思考其他的问题,或者从其他的角度思考同一个问题。
这样做可以帮助我们打破思维的局限,寻找到新的解决方案。
同时,我们也可以寻求他人的帮助和建议,听取他们的观点和意见。
这样做不仅可以为我们提供新的思路,还可以促进我们的思维活跃。
当我们在中断嵌套的处理过程后,重新回到问题的解决过程中时,我们会发现自己的思维变得更加清晰,解决问题的能力也得到了提高。
我们可以重新审视之前的思考方式和解决方案,找出其中的问题和不足之处,并进行修正和改进。
通过不断地中断和调整,我们最终可以找到解决问题的最佳路径,并成功地解决问题。
中断嵌套的处理过程是一种寻找解决问题的新思路和方法的策略。
通过中断和调整,我们可以打破思维的局限,找到解决问题的新途径。
这种处理过程需要我们保持积极的心态和灵活的思维,同时也需要我们学会倾听他人的意见和建议。
NVIC中断与嵌套的理解STM32的NVIC理解分类: STM32 2010-05-15 15:32 942人阅读评论(2) 收藏举报STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。
这4个bits用于分配preemption优先级和sub 优先级,在STM32的固件库中定义如下/* Preemption Priority Group -------------------------------------------------*/#define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority4 bits for subpriority */#define NVIC_PriorityGroup_1 ((u32)0x600) /* 1 bits for pre-emption priority3 bits for subpriority */#define NVIC_PriorityGroup_2 ((u32)0x500) /* 2 bits for pre-emption priority2 bits for subpriority */#define NVIC_PriorityGroup_3 ((u32)0x400) /* 3 bits for pre-emption priority1 bits for subpriority */#define NVIC_PriorityGroup_4 ((u32)0x300) /* 4 bits for pre-emption priority0 bits for subpriority */形象化的理解是:你是上帝,造了43个人,这么多人要分社会阶级和社会阶层了;因为“阶级”的词性比较重;"阶层"比较中性,所以preemption优先级->阶级;每个阶级内部,有一些阶层,sub优先级->阶层;如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。
中断嵌套
是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套。
其实就是更高一级的中断的“加塞儿”,处理器正在执行着中断,又接受了更急的另一件“急件”,转而处理更高一级的中断的行为!
中断优先级??
?在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。
实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。
优先级高的中断源可以中断优先级低的中断服务程序,这就形成了中断服务程序中套着中断服务程序的情况,即形成了所谓的中断嵌套。
MCU暂停现行程序而转去响应中断请求的过程称为中断响应;为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程序,硬件将中断源分为若干个级别,称作中断优先级;中断的优先级有两个:查询优先级和执行优先级。
什么是查询优级呢?我们从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替换的原因)... 说到这里我们应该要知道MCU清除中断标志位的两种方式:一种是通过软件代码往这个中断标志位的寄存器里面写“1”来完成标志位的清零操作;第二种是当MCU响应中断,执行中断服务程序的时候(也就是程序计数器的指针跳转到了中断服务程序代码区),由硬件自动执行清零操作。
中断处理??
中断处理分为四个阶段:1、保存被中断程序的现场,其目的是为了在中断处理完之后,可以返回到原来被中断的地方继续执行;2、分析中断源,判断中断原因,当同时有多个中断同时请求的时候还要考虑中断的优先级;3、转去执行相应的处理程序;4、恢复被中断程序现场,继续执行被中断程序。
多级中断特点??
?注意多级中断的特点:1、一个系统若有n级中断,在MCU中就有n个中断请求触发器,总称为中断请求寄存器;与之对应的有n个中断屏蔽触发器,总称为中断屏蔽寄存器。
与单级中断不同,在多级中断中,中断屏蔽寄存器的内容是一个很重要的程序现场,因此在响应中断时,需要把中断屏蔽寄存器的内容保存起来,并设置新的中断屏蔽状态。
一般在某一级中断被响应后,要置“1 ”(关闭)本级和优先权低于本级的中断屏蔽触发器,置“0”(开放)更高级的中断屏蔽触发器,以此来实现正常的中断嵌套。
2、多级中断中的每一级可以只有一个中断源,也可以有多个中断源。
在多级中断之间可以实现中断嵌套,但是同一级内有不同中断源的中断是不能嵌套的,必须是处理完一个中断后再响应和处理同一级内其他中断源。