新闻中心

EEPW首页>嵌入式系统>设计应用> AVR单片机中的中断嵌套

AVR单片机中的中断嵌套

作者: 时间:2016-11-24 来源:网络 收藏
AVR响应中断后,由硬件自动清零全局中断标志位,此时任何中断都无法响应。直到中断响应程序执行完毕后,全局中断自动打开。因此,若不作特别处理,AVR单片机是无法实现中断嵌套的。
但,如果在中断服务程序中开放全局中断,一旦有中断(包括中断级别较低的,或者是自己本身)申请,AVR将立即响应中断,打断当前正在执行的任何程序(包括正在执行中断服务程序),进入新的中断服务程序,从而实现中断嵌套。此时如有多个中断申请同时存在,MCU响应高优先权的中断。
可见,AVR单片机中,若软件合理设计,即可实现中断嵌套。
和MCS51特别不同的是,AVR中断嵌套不仅可处理优先级更高的中断,也可以处理同优先级甚至优先级较低的中断。这能满足一些特殊的设计,但是也容易引起混乱。在软件设计过程中,这一点设计者需特别注意。
具体实验:

interrupt[iv_INT1] void USB_Link_Int(void)

本文引用地址: //m.amcfsurvey.com/article/201611/320956.htm

{

//显示提示信息,提示进入INT1中断处理程序

DispScreen(scr_info_of_int1,true,null);

//延迟3秒,使得屏幕提示可以看清

//注意:延迟过程中产生iv_TIMER0_COMP中断,该中断的优先级低于iv_INT1

Timer0_Start(0,3);//注:此函数中使用sei()开放中断

while (Timer0_IsRun());

Timer0_Stop();

//允许INT3(ENTER)键按下产生中断

EIMSK &= 0xf7;//禁止INT3产生中断

EICRA |= 0x80;

EICRA &= 0xbf;//INT3中断方式:下降沿产生异步中断

EIFR |=0x08;//清INT3中断标志

EIMSK |= 0x08;//允许INT3产生中断

//禁止INT1,防止重入,专等INT3

EIMSK &= ~( 1 << INT1 );//禁止INT1产生中断

//等待INT3中断

//注意:iv_INT3中断的优先级低于iv_INT1

while(true);

}

//按ENTER键后产生INT3中断

interrupt [iv_INT3] void EnterKey_Int(void)

{

//显示提示信息,提示进入INT3中断处理程序

DispScreen(scr_info_of_int3,true,null);

//延迟3秒,使得屏幕提示可以看清

//注意:延迟过程中产生iv_TIMER0_COMP中断,该中断的优先级低于iv_INT3

Timer0_Start(0,3);//注:此函数中使用sei()开放中断

while (Timer0_IsRun());

Timer0_Stop();

//启动看门狗,等待复位

watch_dog_reset_cpu();

}

实验结果:iv_TIMER0_COMP中断、iv_INT3中断如期发生。

由此可见,AVR单片机中,进入中断处理程序适时开放全局中断,不仅可以使用中断嵌套,而且高级别中断中可响应任何级别(包括更低级别的)的中断。




关键词:AVR单片机中断嵌

评论


技术专区

关闭